2026-05-29T09:00:31.432 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:00:31.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:00:31.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:00:31.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:00:31.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:00:32.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:00:32.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-05-29T09:00:32.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:00:32.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-05-29T09:00:32.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:00:32.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:00:32.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:00:32.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-05-29T09:00:35.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-05-29T09:00:35.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:00:35.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:00:35.204 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:00:35.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:00:35.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:00:35.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:00:35.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:00:35.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:00:35.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:00:35.228 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:00:35.229 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:00:35.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:00:35.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:00:35.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:00:35.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:00:35.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:00:35.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:00:35.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:00:35.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:00:35.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:00:35.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:00:35.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:00:35.566 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:00:35.625 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:00:11
2026-05-29T09:00:35.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71424, datetime.datetime(2026, 5, 29, 9, 0, 11), datetime.datetime(2026, 5, 29, 9, 0, 10), 'salt', 8.37, 77.66, None, 11.96, 102.63, 3.66, 833.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:00:35.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:00:35.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:00:35.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:00:10, diff=25.632927s, valid=True
2026-05-29T09:00:35.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:00:35.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:00:35.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:00:12, diff=23.63639s, valid=True
2026-05-29T09:00:35.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:00:35.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:00:35.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:00:06, diff=29.644486s, valid=True
2026-05-29T09:00:35.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:00:35.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:00:35.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:00:35.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:00:35.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:00:35.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:00:35.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:00:12, diff=23.648179s, valid=True
2026-05-29T09:00:35.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:00:35.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:00:35.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:00:35.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970677.649002s, valid=True
2026-05-29T09:00:35.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:00:35.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:00:35.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:00:35.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:00:35.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:00:35.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:00:35.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:00:35.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:00:35.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:00:35.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:00:35.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:00:35.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:00:35.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:00:35.969 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:00:36.184 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:00:36.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:00:36.623 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:00:36.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:00:36.624 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:00:36.624 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:00:36.794 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:00:36.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:01:06.823 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:01:06.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:01:06.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:01:07.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:01:07.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:01:07.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:01:07.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-05-29T09:01:07.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:01:07.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-05-29T09:01:07.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:01:07.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:01:07.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:01:07.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-05-29T09:01:09.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-05-29T09:01:09.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:01:09.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:01:09.986 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:01:09.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:01:09.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:01:10.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:01:10.008 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:01:10.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:01:10.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:01:10.008 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:01:10.008 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:01:10.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:01:10.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:01:10.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:01:10.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:01:10.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:01:10.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:01:10.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:01:10.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:01:10.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:01:10.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:01:10.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:01:10.274 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:01:10.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:00:41
2026-05-29T09:01:10.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71425, datetime.datetime(2026, 5, 29, 9, 0, 41), datetime.datetime(2026, 5, 29, 9, 0, 41), 'salt', 8.44, 77.95, None, 10.55, 90.21, 3.61, 833.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:01:10.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:01:10.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:01:10.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:00:41, diff=29.342005s, valid=True
2026-05-29T09:01:10.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:01:10.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:01:10.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:01:12, diff=-1.654884s, valid=True
2026-05-29T09:01:10.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:01:10.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:01:10.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:00:36, diff=34.352344s, valid=True
2026-05-29T09:01:10.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:01:10.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:01:10.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:01:10.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:01:10.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:01:10.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:01:10.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:01:12, diff=-1.64436s, valid=True
2026-05-29T09:01:10.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:01:10.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:01:10.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:01:10.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970712.356341s, valid=True
2026-05-29T09:01:10.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:01:10.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:01:10.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:01:10.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:01:10.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:01:10.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:01:10.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:01:10.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:01:10.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:01:10.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:01:10.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:01:10.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:01:10.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:01:10.746 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:01:10.955 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:01:11.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:01:11.403 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:01:11.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:01:11.403 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:01:11.403 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:01:11.612 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:01:11.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:01:41.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:01:41.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:01:41.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:01:42.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:01:42.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:01:42.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:01:42.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-05-29T09:01:42.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:01:42.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-05-29T09:01:42.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:01:42.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:01:42.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:01:42.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-05-29T09:01:44.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-05-29T09:01:44.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:01:44.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:01:44.814 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:01:44.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:01:44.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:01:44.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:01:44.838 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:01:44.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:01:44.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:01:44.839 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:01:44.839 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:01:44.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:01:44.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:01:44.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:01:45.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:01:45.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:01:45.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:01:45.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:01:45.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:01:45.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:01:45.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:01:45.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:01:45.160 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:01:45.221 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:01:41
2026-05-29T09:01:45.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71427, datetime.datetime(2026, 5, 29, 9, 1, 41), datetime.datetime(2026, 5, 29, 9, 1, 41), 'salt', 8.67, 78.22, None, 13.16, 90.23, 3.57, 833.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:01:45.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:01:45.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:01:45.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:01:41, diff=4.228325s, valid=True
2026-05-29T09:01:45.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:01:45.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:01:45.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:02:12, diff=-26.768397s, valid=True
2026-05-29T09:01:45.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:01:45.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:01:45.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:01:38, diff=7.239265s, valid=True
2026-05-29T09:01:45.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:01:45.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:01:45.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:01:45.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:01:45.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:01:45.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:01:45.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:02:12, diff=-26.757267s, valid=True
2026-05-29T09:01:45.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:01:45.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:01:45.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:01:45.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970747.243488s, valid=True
2026-05-29T09:01:45.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:01:45.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:01:45.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:01:45.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:01:45.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:01:45.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:01:45.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:01:45.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:01:45.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:01:45.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:01:45.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:01:45.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:01:45.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:01:45.564 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:01:45.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:01:46.121 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:01:46.220 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:01:46.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:01:46.220 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:01:46.220 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:01:46.477 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:01:46.477 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:02:16.477 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:02:16.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:02:16.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:02:16.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:02:16.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:02:17.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:02:17.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-05-29T09:02:17.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:02:17.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-05-29T09:02:17.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:02:17.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:02:17.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:02:17.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-05-29T09:02:19.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-05-29T09:02:19.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:02:19.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:02:19.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:02:19.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:02:19.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:02:19.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:02:19.665 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:02:19.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:02:19.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:02:19.666 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:02:19.666 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:02:19.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:02:19.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:02:19.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:02:19.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:02:19.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:02:19.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:02:19.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:02:19.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:02:19.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:02:19.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:02:19.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:02:19.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:02:20.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:02:12
2026-05-29T09:02:20.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71428, datetime.datetime(2026, 5, 29, 9, 2, 12), datetime.datetime(2026, 5, 29, 9, 2, 11), 'salt', 8.71, 76.69, None, 13.94, 89.55, 3.86, 833.26, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:02:20.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:02:20.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:02:20.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:02:11, diff=9.05082s, valid=True
2026-05-29T09:02:20.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:02:20.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:02:20.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:02:12, diff=8.057366s, valid=True
2026-05-29T09:02:20.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:02:20.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:02:20.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:02:10, diff=10.064753s, valid=True
2026-05-29T09:02:20.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:02:20.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:02:20.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:02:20.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:02:20.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:02:20.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:02:20.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:02:12, diff=8.06889s, valid=True
2026-05-29T09:02:20.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:02:20.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:02:20.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:02:20.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970782.069579s, valid=True
2026-05-29T09:02:20.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:02:20.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:02:20.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:02:20.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:02:20.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:02:20.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:02:20.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:02:20.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:02:20.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:02:20.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:02:20.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:02:20.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:02:20.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:02:20.462 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:02:20.677 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:02:21.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:02:21.170 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:02:21.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:02:21.171 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:02:21.171 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:02:21.339 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:02:21.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:02:51.358 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:02:51.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:02:51.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:02:51.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:02:51.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:02:51.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:02:51.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-05-29T09:02:51.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:02:51.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-05-29T09:02:51.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:02:51.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:02:51.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:02:51.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-05-29T09:02:54.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-05-29T09:02:54.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:02:54.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:02:54.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:02:54.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:02:54.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:02:54.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:02:54.573 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:02:54.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:02:54.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:02:54.574 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:02:54.574 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:02:54.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:02:54.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:02:54.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:02:54.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:02:54.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:02:54.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:02:54.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:02:54.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:02:54.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:02:54.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:02:54.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:02:54.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:02:54.950 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:02:42
2026-05-29T09:02:54.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71429, datetime.datetime(2026, 5, 29, 9, 2, 42), datetime.datetime(2026, 5, 29, 9, 2, 41), 'salt', 8.77, 76.23, None, 13.23, 84.86, 3.94, 833.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:02:54.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:02:54.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:02:54.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:02:41, diff=13.958213s, valid=True
2026-05-29T09:02:54.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:02:54.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:02:54.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:03:12, diff=-17.038437s, valid=True
2026-05-29T09:02:54.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:02:54.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:02:54.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:02:41, diff=13.969474s, valid=True
2026-05-29T09:02:54.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:02:54.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:02:54.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:02:54.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:02:54.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:02:54.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:02:54.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:03:12, diff=-17.026922s, valid=True
2026-05-29T09:02:54.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:02:54.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:02:54.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:02:54.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970816.973876s, valid=True
2026-05-29T09:02:54.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:02:54.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:02:54.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:02:54.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:02:54.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:02:55.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:02:55.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:02:55.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:02:55.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:02:55.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:02:55.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:02:55.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:02:55.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:02:55.294 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:02:55.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:02:55.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:02:55.947 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:02:55.947 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:02:55.947 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:02:55.947 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:02:56.119 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:02:56.119 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:03:26.149 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:03:26.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:03:26.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:03:26.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:03:26.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:03:26.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:03:26.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-05-29T09:03:26.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:03:26.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-05-29T09:03:26.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:03:26.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:03:26.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:03:26.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-05-29T09:03:29.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-05-29T09:03:29.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:03:29.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:03:29.072 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:03:29.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:03:29.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:03:29.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:03:29.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:03:29.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:03:29.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:03:29.096 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:03:29.097 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:03:29.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:03:29.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:03:29.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:03:29.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:03:29.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:03:29.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:03:29.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:03:29.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:03:29.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:03:29.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:03:29.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:03:29.413 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:03:29.472 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:03:12
2026-05-29T09:03:29.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71430, datetime.datetime(2026, 5, 29, 9, 3, 12), datetime.datetime(2026, 5, 29, 9, 3, 11), 'salt', 8.87, 75.07, None, 14.72, 75.11, 4.17, 833.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:03:29.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:03:29.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:03:29.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:03:11, diff=18.479627s, valid=True
2026-05-29T09:03:29.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:03:29.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:03:29.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:03:12, diff=17.482976s, valid=True
2026-05-29T09:03:29.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:03:29.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:03:29.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:03:07, diff=22.490873s, valid=True
2026-05-29T09:03:29.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:03:29.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:03:29.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:03:29.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:03:29.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:03:29.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:03:29.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:03:12, diff=17.494467s, valid=True
2026-05-29T09:03:29.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:03:29.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:03:29.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:03:29.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970851.495288s, valid=True
2026-05-29T09:03:29.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:03:29.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:03:29.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:03:29.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:03:29.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:03:29.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:03:29.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:03:29.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:03:29.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:03:29.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:03:29.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:03:29.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:03:29.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:03:29.887 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:03:30.109 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:03:30.452 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:03:30.553 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:03:30.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:03:30.554 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:03:30.554 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:03:30.724 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:03:30.724 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:04:00.754 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:04:00.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:04:00.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:04:01.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:04:01.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:04:01.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:04:01.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-05-29T09:04:01.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:04:01.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-05-29T09:04:01.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:04:01.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:04:01.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:04:01.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-05-29T09:04:03.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-05-29T09:04:03.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:04:03.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:04:03.804 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:04:03.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:04:03.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:04:03.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:04:03.821 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:04:03.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:04:03.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:04:03.823 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:04:03.823 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:04:03.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:04:03.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:04:03.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:04:04.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:04:04.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:04:04.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:04:04.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:04:04.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:04:04.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:04:04.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:04:04.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:04:04.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:04:04.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:03:43
2026-05-29T09:04:04.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71431, datetime.datetime(2026, 5, 29, 9, 3, 43), datetime.datetime(2026, 5, 29, 9, 3, 42), 'salt', 8.84, 73.77, None, 13.8, 80.23, 4.42, 833.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:04:04.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:04:04.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:04:04.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:03:42, diff=22.191673s, valid=True
2026-05-29T09:04:04.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:04:04.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:04:04.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:04:12, diff=-7.805523s, valid=True
2026-05-29T09:04:04.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:04:04.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:04:04.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:03:37, diff=27.20121s, valid=True
2026-05-29T09:04:04.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:04:04.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:04:04.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:04:04.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:04:04.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:04:04.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:04:04.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:04:12, diff=-7.795731s, valid=True
2026-05-29T09:04:04.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:04:04.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:04:04.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:04:04.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970886.20494s, valid=True
2026-05-29T09:04:04.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:04:04.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:04:04.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:04:04.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:04:04.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:04:04.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:04:04.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:04:04.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:04:04.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:04:04.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:04:04.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:04:04.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:04:04.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:04:04.522 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:04:04.729 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:04:05.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:04:05.165 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:04:05.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:04:05.165 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:04:05.165 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:04:05.340 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:04:05.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:04:35.371 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:04:35.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:04:35.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:04:36.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:04:36.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:04:36.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:04:36.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-05-29T09:04:36.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:04:36.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-05-29T09:04:36.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:04:36.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:04:36.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:04:36.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-05-29T09:04:38.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-05-29T09:04:38.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:04:38.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:04:38.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:04:38.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:04:38.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:04:38.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:04:38.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:04:38.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:04:38.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:04:38.738 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:04:38.738 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:04:38.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:04:38.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:04:38.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:04:38.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:04:38.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:04:39.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:04:39.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:04:39.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:04:39.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:04:39.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:04:39.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:04:39.049 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:04:39.109 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:04:13
2026-05-29T09:04:39.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71432, datetime.datetime(2026, 5, 29, 9, 4, 13), datetime.datetime(2026, 5, 29, 9, 4, 12), 'salt', 9.07, 73.77, None, 13.41, 77.48, 4.42, 833.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:04:39.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:04:39.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:04:39.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:04:12, diff=27.117174s, valid=True
2026-05-29T09:04:39.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:04:39.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:04:39.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:04:12, diff=27.120506s, valid=True
2026-05-29T09:04:39.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:04:39.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:04:39.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:04:08, diff=31.128251s, valid=True
2026-05-29T09:04:39.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:04:39.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:04:39.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:04:39.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:04:39.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:04:39.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:04:39.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:04:12, diff=27.131815s, valid=True
2026-05-29T09:04:39.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:04:39.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:04:39.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:04:39.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970921.132574s, valid=True
2026-05-29T09:04:39.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:04:39.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:04:39.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:04:39.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:04:39.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:04:39.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:04:39.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:04:39.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:04:39.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:04:39.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:04:39.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:04:39.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:04:39.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:04:39.453 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:04:39.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:04:40.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:04:40.122 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:04:40.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:04:40.122 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:04:40.122 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:04:40.293 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:04:40.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:05:10.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:05:10.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:05:10.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:05:10.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:05:10.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:05:10.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:05:10.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T09:05:10.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:05:10.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-05-29T09:05:10.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:05:10.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:05:10.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:05:10.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-05-29T09:05:13.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-05-29T09:05:13.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:05:13.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:05:13.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:05:13.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:05:13.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:05:13.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:05:13.385 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:05:13.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:05:13.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:05:13.386 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:05:13.386 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:05:13.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:05:13.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:05:13.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:05:13.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:05:13.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:05:13.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:05:13.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:05:13.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:05:13.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:05:13.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:05:13.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:05:13.698 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:05:13.756 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:05:13
2026-05-29T09:05:13.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71434, datetime.datetime(2026, 5, 29, 9, 5, 13), datetime.datetime(2026, 5, 29, 9, 5, 13), 'salt', 9.17, 72.84, None, 11.08, 93.28, 4.61, 833.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:05:13.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:05:13.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:05:13.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:05:13, diff=0.763857s, valid=True
2026-05-29T09:05:13.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:05:13.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:05:13.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:05:12, diff=1.767261s, valid=True
2026-05-29T09:05:13.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:05:13.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:05:13.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:05:08, diff=5.775095s, valid=True
2026-05-29T09:05:13.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:05:13.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:05:13.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:05:13.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:05:13.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:05:13.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:05:13.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:05:12, diff=1.778693s, valid=True
2026-05-29T09:05:13.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:05:13.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:05:13.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:05:13.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970955.779473s, valid=True
2026-05-29T09:05:13.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:05:13.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:05:13.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:05:13.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:05:13.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:05:13.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:05:13.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:05:13.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:05:13.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:05:13.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:05:13.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:05:14.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:05:14.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:05:14.101 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:05:14.302 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:05:14.695 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:05:14.794 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:05:14.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:05:14.794 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:05:14.794 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:05:14.973 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:05:14.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:05:45.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:05:45.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:05:45.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:05:45.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:05:45.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:05:45.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:05:45.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-05-29T09:05:45.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:05:45.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-05-29T09:05:45.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:05:45.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:05:45.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:05:45.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-05-29T09:05:48.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-05-29T09:05:48.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:05:48.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:05:48.174 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:05:48.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:05:48.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:05:48.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:05:48.198 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:05:48.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:05:48.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:05:48.199 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:05:48.199 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:05:48.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:05:48.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:05:48.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:05:48.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:05:48.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:05:48.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:05:48.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:05:48.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:05:48.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:05:48.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:05:48.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:05:48.519 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:05:48.579 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:05:44
2026-05-29T09:05:48.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71435, datetime.datetime(2026, 5, 29, 9, 5, 44), datetime.datetime(2026, 5, 29, 9, 5, 43), 'salt', 9.17, 73.01, None, 11.79, 97.02, 4.58, 833.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:05:48.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:05:48.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:05:48.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:05:43, diff=5.586965s, valid=True
2026-05-29T09:05:48.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:05:48.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:05:48.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:06:12, diff=-23.409705s, valid=True
2026-05-29T09:05:48.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:05:48.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:05:48.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:05:40, diff=8.598179s, valid=True
2026-05-29T09:05:48.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:05:48.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:05:48.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:05:48.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:05:48.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:05:48.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:05:48.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:06:12, diff=-23.398232s, valid=True
2026-05-29T09:05:48.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:05:48.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:05:48.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:05:48.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970990.602545s, valid=True
2026-05-29T09:05:48.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:05:48.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:05:48.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:05:48.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:05:48.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:05:48.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:05:48.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:05:48.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:05:48.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:05:48.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:05:48.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:05:48.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:05:48.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:05:48.923 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:05:49.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:05:49.463 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:05:49.564 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:05:49.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:05:49.564 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:05:49.564 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:05:49.736 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:05:49.736 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:06:19.766 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:06:19.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:06:19.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:06:20.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:06:20.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:06:20.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:06:20.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-05-29T09:06:20.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:06:20.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-05-29T09:06:20.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:06:20.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:06:20.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:06:20.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-05-29T09:06:23.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-05-29T09:06:23.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:06:23.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:06:23.312 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:06:23.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:06:23.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:06:23.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:06:23.336 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:06:23.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:06:23.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:06:23.337 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:06:23.338 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:06:23.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:06:23.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:06:23.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:06:23.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:06:23.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:06:23.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:06:23.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:06:23.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:06:23.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:06:23.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:06:23.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:06:23.655 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:06:23.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:06:14
2026-05-29T09:06:23.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71436, datetime.datetime(2026, 5, 29, 9, 6, 14), datetime.datetime(2026, 5, 29, 9, 6, 13), 'salt', 9.17, 72.18, None, 10.8, 91.01, 4.74, 833.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:06:23.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:06:23.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:06:23.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:06:13, diff=10.723278s, valid=True
2026-05-29T09:06:23.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:06:23.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:06:23.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:06:12, diff=11.727307s, valid=True
2026-05-29T09:06:23.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:06:23.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:06:23.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:06:11, diff=12.735718s, valid=True
2026-05-29T09:06:23.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:06:23.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:06:23.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:06:23.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:06:23.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:06:23.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:06:23.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:06:12, diff=11.739419s, valid=True
2026-05-29T09:06:23.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:06:23.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:06:23.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:06:23.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971025.740242s, valid=True
2026-05-29T09:06:23.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:06:23.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:06:23.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:06:23.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:06:23.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:06:23.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:06:23.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:06:23.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:06:23.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:06:23.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:06:23.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:06:23.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:06:24.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:06:24.061 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:06:24.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:06:24.668 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:06:24.768 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:06:24.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:06:24.768 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:06:24.768 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:06:24.960 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:06:24.960 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:06:54.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:06:54.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:06:54.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:06:55.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:06:55.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:06:55.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:06:55.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-05-29T09:06:55.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:06:55.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-05-29T09:06:55.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:06:55.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:06:55.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:06:55.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-05-29T09:06:58.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-05-29T09:06:58.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:06:58.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:06:58.416 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:06:58.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:06:58.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:06:58.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:06:58.436 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:06:58.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:06:58.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:06:58.437 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:06:58.437 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:06:58.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:06:58.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:06:58.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:06:58.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:06:58.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:06:58.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:06:58.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:06:58.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:06:58.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:06:58.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:06:58.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:06:58.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:06:58.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:06:44
2026-05-29T09:06:58.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71437, datetime.datetime(2026, 5, 29, 9, 6, 44), datetime.datetime(2026, 5, 29, 9, 6, 44), 'salt', 9.27, 72.54, None, 11.61, 82.39, 4.67, 833.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:06:58.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:06:58.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:06:58.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:06:44, diff=14.78389s, valid=True
2026-05-29T09:06:58.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:06:58.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:06:58.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:07:12, diff=-13.212948s, valid=True
2026-05-29T09:06:58.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:06:58.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:06:58.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:06:43, diff=15.794469s, valid=True
2026-05-29T09:06:58.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:06:58.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:06:58.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:06:58.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:06:58.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:06:58.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:06:58.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:07:12, diff=-13.202148s, valid=True
2026-05-29T09:06:58.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:06:58.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:06:58.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:06:58.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971060.79859s, valid=True
2026-05-29T09:06:58.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:06:58.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:06:58.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:06:58.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:06:58.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:06:58.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:06:58.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:06:58.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:06:58.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:06:58.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:06:58.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:06:59.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:06:59.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:06:59.122 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:06:59.327 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:06:59.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:06:59.762 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:06:59.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:06:59.762 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:06:59.762 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:06:59.936 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:06:59.936 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:07:29.966 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:07:29.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:07:29.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:07:30.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:07:30.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:07:30.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:07:30.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-05-29T09:07:30.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:07:30.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-05-29T09:07:30.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:07:30.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:07:30.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:07:30.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-05-29T09:07:32.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-05-29T09:07:32.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:07:32.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:07:32.996 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:07:32.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:07:33.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:07:33.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:07:33.020 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:07:33.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:07:33.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:07:33.021 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:07:33.022 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:07:33.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:07:33.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:07:33.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:07:33.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:07:33.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:07:33.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:07:33.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:07:33.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:07:33.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:07:33.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:07:33.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:07:33.323 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:07:33.384 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:07:14
2026-05-29T09:07:33.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71438, datetime.datetime(2026, 5, 29, 9, 7, 14), datetime.datetime(2026, 5, 29, 9, 7, 14), 'salt', 9.34, 72.81, None, 10.73, 94.1, 4.63, 833.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:07:33.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:07:33.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:07:33.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:07:14, diff=19.391054s, valid=True
2026-05-29T09:07:33.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:07:33.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:07:33.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:07:12, diff=21.394325s, valid=True
2026-05-29T09:07:33.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:07:33.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:07:33.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:07:09, diff=24.40203s, valid=True
2026-05-29T09:07:33.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:07:33.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:07:33.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:07:33.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:07:33.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:07:33.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:07:33.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:07:12, diff=21.405509s, valid=True
2026-05-29T09:07:33.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:07:33.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:07:33.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:07:33.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971095.406284s, valid=True
2026-05-29T09:07:33.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:07:33.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:07:33.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:07:33.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:07:33.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:07:33.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:07:33.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:07:33.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:07:33.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:07:33.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:07:33.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:07:33.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:07:33.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:07:33.726 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:07:33.999 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:07:34.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:07:34.434 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:07:34.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:07: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-05-29T09:07: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-05-29T09:07:34.608 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:07:34.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:08:04.638 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:08:04.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:08:04.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:08:05.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:08:05.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:08:05.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:08:05.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-05-29T09:08:05.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:08:05.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-05-29T09:08:05.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:08:05.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:08:05.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:08:05.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-05-29T09:08:07.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-05-29T09:08:07.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:08:07.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:08:07.918 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:08:07.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:08:07.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:08:07.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:08:07.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:08:07.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:08:07.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:08:07.944 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:08:07.944 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:08:07.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:08:08.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:08:08.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:08:08.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:08:08.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:08:08.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:08:08.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:08:08.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:08:08.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:08:08.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:08:08.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:08:08.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:08:08.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:07:45
2026-05-29T09:08:08.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71439, datetime.datetime(2026, 5, 29, 9, 7, 45), datetime.datetime(2026, 5, 29, 9, 7, 44), 'salt', 9.27, 72.14, None, 11.19, 97.79, 4.75, 833.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:08:08.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:08:08.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:08:08.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:07:44, diff=24.339889s, valid=True
2026-05-29T09:08:08.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:08:08.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:08:08.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:08:12, diff=-3.656741s, valid=True
2026-05-29T09:08:08.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:08:08.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:08:08.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:07:39, diff=29.351297s, valid=True
2026-05-29T09:08:08.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:08:08.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:08:08.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:08:08.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:08:08.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:08:08.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:08:08.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:08:12, diff=-3.645064s, valid=True
2026-05-29T09:08:08.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:08:08.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:08:08.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:08:08.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971130.355731s, valid=True
2026-05-29T09:08:08.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:08:08.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:08:08.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:08:08.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:08:08.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:08:08.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:08:08.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:08:08.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:08:08.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:08:08.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:08:08.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:08:08.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:08:08.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:08:08.676 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:08:08.883 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:08:09.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:08:09.316 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:08:09.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:08:09.317 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:08:09.317 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:08:09.582 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:08:09.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:08:39.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:08:39.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:08:39.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:08:40.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:08:40.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:08:40.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:08:40.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-05-29T09:08:40.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:08:40.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-05-29T09:08:40.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:08:40.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:08:40.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:08:40.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T09:08:42.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-05-29T09:08:42.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:08:42.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:08:42.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:08:42.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:08:42.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:08:42.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:08:42.703 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:08:42.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:08:42.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:08:42.704 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:08:42.704 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:08:42.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:08:42.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:08:42.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:08:42.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:08:42.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:08:42.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:08:42.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:08:43.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:08:43.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:08:43.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:08:43.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:08:43.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:08:43.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:08:15
2026-05-29T09:08:43.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71440, datetime.datetime(2026, 5, 29, 9, 8, 15), datetime.datetime(2026, 5, 29, 9, 8, 15), 'salt', 9.17, 72.58, None, 10.91, 87.51, 4.66, 833.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:08:43.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:08:43.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:08:43.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:08:15, diff=28.104688s, valid=True
2026-05-29T09:08:43.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:08:43.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:08:43.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:08:12, diff=31.108117s, valid=True
2026-05-29T09:08:43.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:08:43.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:08:43.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:08:09, diff=34.1159s, valid=True
2026-05-29T09:08:43.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:08:43.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:08:43.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:08:43.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:08:43.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:08:43.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:08:43.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:08:12, diff=31.11953s, valid=True
2026-05-29T09:08:43.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:08:43.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:08:43.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:08:43.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971165.120327s, valid=True
2026-05-29T09:08:43.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:08:43.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:08:43.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:08:43.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:08:43.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:08:43.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:08:43.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:08:43.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:08:43.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:08:43.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:08:43.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:08:43.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:08:43.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:08:43.509 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:08:43.713 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:08:44.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:08:44.155 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:08:44.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:08:44.155 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:08:44.155 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:08:44.332 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:08:44.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:09:14.341 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:09:14.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:09:14.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:09:14.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:09:14.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:09:14.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:09:14.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-05-29T09:09:14.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:09:14.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-05-29T09:09:14.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:09:14.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:09:14.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:09:14.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-05-29T09:09:17.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-05-29T09:09:17.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:09:17.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:09:17.474 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:09:17.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:09:17.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:09:17.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:09:17.497 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:09:17.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:09:17.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:09:17.499 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:09:17.499 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:09:17.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:09:17.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:09:17.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:09:17.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:09:17.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:09:17.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:09:17.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:09:17.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:09:17.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:09:17.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:09:17.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:09:17.815 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:09:17.877 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:09:16
2026-05-29T09:09:17.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71442, datetime.datetime(2026, 5, 29, 9, 9, 16), datetime.datetime(2026, 5, 29, 9, 9, 16), 'salt', 9.07, 72.24, None, 13.62, 105.11, 4.72, 833.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:09:17.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:09:17.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:09:17.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:09:16, diff=1.885307s, valid=True
2026-05-29T09:09:17.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:09:17.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:09:17.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:09:12, diff=5.888724s, valid=True
2026-05-29T09:09:17.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:09:17.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:09:17.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:09:10, diff=7.896961s, valid=True
2026-05-29T09:09:17.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:09:17.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:09:17.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:09:17.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:09:17.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:09:17.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:09:17.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:09:12, diff=5.900687s, valid=True
2026-05-29T09:09:17.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:09:17.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:09:17.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:09:17.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971199.901511s, valid=True
2026-05-29T09:09:17.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:09:17.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:09:17.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:09:17.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:09:17.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:09:17.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:09:17.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:09:17.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:09:17.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:09:18.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:09:18.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:09:18.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:09:18.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:09:18.224 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:09:18.427 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:09:18.761 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:09:18.862 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:09:18.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:09:18.862 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:09:18.862 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:09:19.042 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:09:19.042 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:09:49.047 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:09:49.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:09:49.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:09:49.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:09:49.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:09:49.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:09:49.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-05-29T09:09:49.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:09:49.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-05-29T09:09:49.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:09:49.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:09:49.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:09:49.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-05-29T09:09:52.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-05-29T09:09:52.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:09:52.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:09:52.071 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:09:52.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:09:52.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:09:52.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:09:52.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:09:52.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:09:52.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:09:52.096 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:09:52.096 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:09:52.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:09:52.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:09:52.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:09:52.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:09:52.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:09:52.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:09:52.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:09:52.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:09:52.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:09:52.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:09:52.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:09:52.444 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:09:52.508 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:09:46
2026-05-29T09:09:52.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71443, datetime.datetime(2026, 5, 29, 9, 9, 46), datetime.datetime(2026, 5, 29, 9, 9, 46), 'salt', 9.04, 73.24, None, 13.8, 99.1, 4.53, 833.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:09:52.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:09:52.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:09:52.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:09:46, diff=6.516172s, valid=True
2026-05-29T09:09:52.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:09:52.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:09:52.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:10:12, diff=-19.480291s, valid=True
2026-05-29T09:09:52.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:09:52.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:09:52.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:09:41, diff=11.52779s, valid=True
2026-05-29T09:09:52.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:09:52.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:09:52.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:09:52.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:09:52.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:09:52.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:09:52.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:10:12, diff=-19.468435s, valid=True
2026-05-29T09:09:52.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:09:52.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:09:52.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:09:52.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971234.532383s, valid=True
2026-05-29T09:09:52.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:09:52.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:09:52.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:09:52.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:09:52.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:09:52.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:09:52.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:09:52.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:09:52.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:09:52.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:09:52.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:09:52.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:09:52.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:09:52.936 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:09:53.161 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:09:53.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:09:53.618 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:09:53.618 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:09:53.619 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:09:53.619 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:09:53.786 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:09:53.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:10:23.811 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:10:23.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:10:23.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:10:24.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:10:24.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:10:24.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:10:24.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-05-29T09:10:24.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:10:24.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-05-29T09:10:24.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:10:24.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:10:24.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:10:24.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-05-29T09:10:26.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-05-29T09:10:26.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:10:26.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:10:26.929 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:10:26.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:10:26.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:10:26.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:10:26.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:10:26.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:10:26.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:10:26.953 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:10:26.953 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:10:26.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:10:27.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:10:27.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:10:27.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:10:27.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:10:27.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:10:27.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:10:27.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:10:27.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:10:27.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:10:27.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:10:27.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:10:27.329 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:10:17
2026-05-29T09:10:27.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71444, datetime.datetime(2026, 5, 29, 9, 10, 17), datetime.datetime(2026, 5, 29, 9, 10, 16), 'salt', 8.97, 73.44, None, 13.27, 108.02, 4.48, 833.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:10:27.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:10:27.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:10:27.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:10:16, diff=11.336554s, valid=True
2026-05-29T09:10:27.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:10:27.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:10:27.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:10:12, diff=15.340002s, valid=True
2026-05-29T09:10:27.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:10:27.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:10:27.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:10:12, diff=15.348035s, valid=True
2026-05-29T09:10:27.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:10:27.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:10:27.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:10:27.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:10:27.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:10:27.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:10:27.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:10:12, diff=15.351599s, valid=True
2026-05-29T09:10:27.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:10:27.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:10:27.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:10:27.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971269.352389s, valid=True
2026-05-29T09:10:27.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:10:27.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:10:27.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:10:27.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:10:27.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:10:27.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:10:27.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:10:27.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:10:27.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:10:27.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:10:27.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:10:27.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:10:27.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:10:27.678 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:10:27.884 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:10:28.236 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:10:28.338 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:10:28.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:10:28.339 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:10:28.339 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:10:28.534 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:10:28.534 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:10:58.556 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:10:58.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:10:58.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:10:59.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:10:59.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:10:59.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:10:59.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-05-29T09:10:59.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:10:59.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-05-29T09:10:59.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:10:59.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:10:59.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:10:59.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-05-29T09:11:01.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-05-29T09:11:01.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:11:01.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:11:01.888 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:11:01.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:11:01.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:11:01.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:11:01.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:11:01.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:11:01.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:11:01.915 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:11:01.915 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:11:01.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:11:02.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:11:02.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:11:02.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:11:02.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:11:02.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:11:02.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:11:02.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:11:02.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:11:02.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:11:02.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:11:02.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:11:02.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:10:47
2026-05-29T09:11:02.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71445, datetime.datetime(2026, 5, 29, 9, 10, 47), datetime.datetime(2026, 5, 29, 9, 10, 46), 'salt', 8.9, 73.6, None, 12.67, 95.98, 4.45, 833.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:11:02.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:11:02.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:11:02.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:10:46, diff=16.270498s, valid=True
2026-05-29T09:11:02.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:11:02.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:11:02.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:11:12, diff=-9.726254s, valid=True
2026-05-29T09:11:02.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:11:02.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:11:02.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:10:44, diff=18.280949s, valid=True
2026-05-29T09:11:02.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:11:02.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:11:02.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:11:02.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:11:02.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:11:02.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:11:02.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:11:12, diff=-9.715612s, valid=True
2026-05-29T09:11:02.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:11:02.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:11:02.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:11:02.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971304.285138s, valid=True
2026-05-29T09:11:02.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:11:02.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:11:02.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:11:02.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:11:02.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:11:02.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:11:02.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:11:02.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:11:02.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:11:02.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:11:02.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:11:02.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:11:02.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:11:02.605 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:11:02.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:11:03.221 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:11:03.333 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:11:03.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:11:03.333 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:11:03.333 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:11:03.509 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:11:03.509 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:11:33.523 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:11:33.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:11:33.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:11:34.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:11:34.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:11:34.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:11:34.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-05-29T09:11:34.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:11:34.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-05-29T09:11:34.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:11:34.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:11:34.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:11: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-05-29T09:11:36.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-05-29T09:11:36.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:11:36.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:11:36.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:11:36.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:11:36.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:11:36.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:11:36.864 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:11:36.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:11:36.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:11:36.865 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:11:36.865 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:11:36.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:11:37.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:11:37.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:11:37.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:11:37.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:11:37.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:11:37.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:11:37.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:11:37.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:11:37.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:11:37.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:11:37.178 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:11:37.240 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:11:17
2026-05-29T09:11:37.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71446, datetime.datetime(2026, 5, 29, 9, 11, 17), datetime.datetime(2026, 5, 29, 9, 11, 17), 'salt', 8.84, 73.54, None, 12.1, 94.24, 4.46, 833.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:11:37.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:11:37.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:11:37.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:11:17, diff=20.247839s, valid=True
2026-05-29T09:11:37.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:11:37.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:11:37.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:11:12, diff=25.251152s, valid=True
2026-05-29T09:11:37.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:11:37.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:11:37.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:11:15, diff=22.25889s, valid=True
2026-05-29T09:11:37.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:11:37.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:11:37.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:11:37.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:11:37.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:11:37.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:11:37.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:11:12, diff=25.26236s, valid=True
2026-05-29T09:11:37.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:11:37.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:11:37.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:11:37.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971339.263152s, valid=True
2026-05-29T09:11:37.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:11:37.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:11:37.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:11:37.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:11:37.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:11:37.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:11:37.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:11:37.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:11:37.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:11:37.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:11:37.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:11:37.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:11:37.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:11:37.585 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:11:37.787 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:11:38.123 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:11:38.283 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:11:38.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:11:38.283 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:11:38.283 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:11:38.532 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:11:38.533 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:12:08.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:12:08.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:12:08.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:12:09.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:12:09.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:12:09.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:12:09.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-05-29T09:12:09.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:12:09.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-05-29T09:12:09.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:12:09.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:12:09.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:12:09.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-05-29T09:12:11.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T09:12:11.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:12:11.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:12:11.984 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:12:11.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:12:11.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:12:12.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:12:12.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:12:12.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:12:12.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:12:12.010 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:12:12.010 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:12:12.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:12:12.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:12:12.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:12:12.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:12:12.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:12:12.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:12:12.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:12:12.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:12:12.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:12:12.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:12:12.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:12:12.326 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:12:12.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:11:47
2026-05-29T09:12:12.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71447, datetime.datetime(2026, 5, 29, 9, 11, 47), datetime.datetime(2026, 5, 29, 9, 11, 47), 'salt', 8.87, 74.1, None, 12.81, 90.6, 4.35, 833.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:12:12.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:12:12.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:12:12.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:11:47, diff=25.394057s, valid=True
2026-05-29T09:12:12.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:12:12.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:12:12.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:12:12, diff=0.397412s, valid=True
2026-05-29T09:12:12.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:12:12.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:12:12.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:11:46, diff=26.405262s, valid=True
2026-05-29T09:12:12.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:12:12.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:12:12.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:12:12.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:12:12.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:12:12.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:12:12.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:12:12, diff=0.408907s, valid=True
2026-05-29T09:12:12.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:12:12.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:12:12.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:12:12.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971374.409695s, valid=True
2026-05-29T09:12:12.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:12:12.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:12:12.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:12:12.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:12:12.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:12:12.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:12:12.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:12:12.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:12:12.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:12:12.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:12:12.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:12:12.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:12:12.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:12:12.730 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:12:12.933 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:12:13.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:12:13.370 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:12:13.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:12:13.370 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:12:13.370 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:12:13.620 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:12:13.620 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:12:43.632 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:12:43.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:12:43.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:12:44.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:12:44.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:12:44.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:12:44.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-05-29T09:12:44.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:12:44.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-05-29T09:12:44.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:12:44.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:12:44.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:12:44.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-05-29T09:12:47.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-05-29T09:12:47.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:12:47.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:12:47.025 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:12:47.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:12:47.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:12:47.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:12:47.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:12:47.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:12:47.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:12:47.050 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:12:47.050 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:12:47.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:12:47.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:12:47.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:12:47.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:12:47.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:12:47.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:12:47.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:12:47.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:12:47.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:12:47.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:12:47.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:12:47.365 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:12:47.425 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:12:18
2026-05-29T09:12:47.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71448, datetime.datetime(2026, 5, 29, 9, 12, 18), datetime.datetime(2026, 5, 29, 9, 12, 17), 'salt', 8.87, 73.64, None, 12.21, 92.88, 4.44, 833.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:12:47.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:12:47.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:12:47.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:12:17, diff=30.432805s, valid=True
2026-05-29T09:12:47.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:12:47.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:12:47.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:12:12, diff=35.436264s, valid=True
2026-05-29T09:12:47.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:12:47.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:12:47.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:12:11, diff=36.444185s, valid=True
2026-05-29T09:12:47.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:12:47.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:12:47.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:12:47.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:12:47.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:12:47.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:12:47.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:12:12, diff=35.447796s, valid=True
2026-05-29T09:12:47.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:12:47.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:12:47.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:12:47.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971409.448575s, valid=True
2026-05-29T09:12:47.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:12:47.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:12:47.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:12:47.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:12:47.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:12:47.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:12:47.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:12:47.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:12:47.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:12:47.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:12:47.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:12:47.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:12:47.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:12:47.768 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:12:48.042 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:12:48.378 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:12:48.477 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:12:48.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:12:48.477 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:12:48.477 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:12:51.217 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:12:51.217 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:13:21.220 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:13:21.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:13:21.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:13:21.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:13:21.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:13:21.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:13:21.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-05-29T09:13:21.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:13:21.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-05-29T09:13:21.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:13:21.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:13:21.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:13:21.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-05-29T09:13:24.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-05-29T09:13:24.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:13:24.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:13:24.178 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:13:24.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:13:24.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:13:24.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:13:24.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:13:24.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:13:24.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:13:24.203 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:13:24.204 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:13:24.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:13:24.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:13:24.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:13:24.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:13:24.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:13:24.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:13:24.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:13:24.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:13:24.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:13:24.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:13:24.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:13:24.522 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:13:24.584 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:13:18
2026-05-29T09:13:24.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71450, datetime.datetime(2026, 5, 29, 9, 13, 18), datetime.datetime(2026, 5, 29, 9, 13, 18), 'salt', 9.0, 73.7, None, 11.61, 99.43, 4.43, 833.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:13:24.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:13:24.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:13:24.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:13:18, diff=6.591376s, valid=True
2026-05-29T09:13:24.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:13:24.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:13:24.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:13:12, diff=12.594861s, valid=True
2026-05-29T09:13:24.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:13:24.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:13:24.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:13:12, diff=12.60272s, valid=True
2026-05-29T09:13:24.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:13:24.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:13:24.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:13:24.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:13:24.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:13:24.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:13:24.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:13:12, diff=12.606366s, valid=True
2026-05-29T09:13:24.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:13:24.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:13:24.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:13:24.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971446.60715s, valid=True
2026-05-29T09:13:24.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:13:24.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:13:24.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:13:24.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:13:24.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:13:24.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:13:24.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:13:24.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:13:24.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:13:24.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:13:24.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:13:24.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:13:24.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:13:24.929 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:13:25.132 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:13:25.469 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:13:25.569 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:13:25.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:13:25.569 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:13:25.569 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:13:25.818 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:13:25.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:13:55.821 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:13:55.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:13:55.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:13:55.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:13:55.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:13:56.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:13:56.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-05-29T09:13:56.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:13:56.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-05-29T09:13:56.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:13:56.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:13:56.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:13:56.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-05-29T09:13:58.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-05-29T09:13:58.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:13:58.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:13:58.727 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:13:58.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:13:58.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:13:58.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:13:58.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:13:58.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:13:58.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:13:58.749 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:13:58.749 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:13:58.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:13:58.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:13:58.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:13:58.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:13:58.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:13:58.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:13:58.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:13:58.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:13:58.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:13:59.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:13:59.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:13:59.000 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:13:59.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:13:48
2026-05-29T09:13:59.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71451, datetime.datetime(2026, 5, 29, 9, 13, 48), datetime.datetime(2026, 5, 29, 9, 13, 48), 'salt', 9.1, 73.8, None, 14.33, 87.67, 4.42, 833.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:13:59.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:13:59.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:13:59.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:13:48, diff=11.065554s, valid=True
2026-05-29T09:13:59.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:13:59.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:13:59.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:14:12, diff=-12.931332s, valid=True
2026-05-29T09:13:59.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:13:59.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:13:59.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:13:42, diff=17.075905s, valid=True
2026-05-29T09:13:59.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:13:59.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:13:59.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:13:59.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:13:59.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:13:59.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:13:59.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:14:12, diff=-12.920779s, valid=True
2026-05-29T09:13:59.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:13:59.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:13:59.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:13:59.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971481.07997s, valid=True
2026-05-29T09:13:59.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:13:59.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:13:59.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:13:59.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:13:59.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:13:59.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:13:59.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:13:59.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:13:59.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:13:59.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:13:59.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:13:59.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:13:59.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:13:59.473 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:13:59.674 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:14:00.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:14:00.131 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:14:00.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:14:00.131 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:14:00.131 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:14:00.306 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:14:00.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:14:30.330 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:14:30.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:14:30.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:14:30.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:14:30.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:14:30.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:14:30.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-05-29T09:14:30.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:14:30.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-05-29T09:14:30.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:14:30.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:14:30.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:14:30.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-05-29T09:14:34.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-05-29T09:14:34.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:14:34.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:14:34.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:14:34.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:14:34.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:14:34.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:14:34.109 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:14:34.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:14:34.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:14:34.110 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:14:34.110 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:14:34.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:14:34.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:14:34.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:14:34.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:14:34.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:14:34.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:14:34.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:14:34.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:14:34.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:14:34.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:14:34.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:14:34.439 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:14:34.498 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:14:19
2026-05-29T09:14:34.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71452, datetime.datetime(2026, 5, 29, 9, 14, 19), datetime.datetime(2026, 5, 29, 9, 14, 18), 'salt', 9.13, 72.67, None, 13.9, 80.74, 4.64, 833.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:14:34.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:14:34.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:14:34.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:14:18, diff=16.504912s, valid=True
2026-05-29T09:14:34.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:14:34.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:14:34.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:14:12, diff=22.507692s, valid=True
2026-05-29T09:14:34.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:14:34.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:14:34.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:14:13, diff=21.514188s, valid=True
2026-05-29T09:14:34.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:14:34.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:14:34.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:14:34.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:14:34.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:14:34.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:14:34.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:14:12, diff=22.517191s, valid=True
2026-05-29T09:14:34.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:14:34.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:14:34.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:14:34.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971516.517855s, valid=True
2026-05-29T09:14:34.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:14:34.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:14:34.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:14:34.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:14:34.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:14:34.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:14:34.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:14:34.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:14:34.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:14:34.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:14:34.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:14:34.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:14:34.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:14:34.834 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:14:35.036 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:14:35.371 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:14:35.470 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:14:35.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:14:35.471 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:14:35.471 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:14:35.649 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:14:35.649 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:15:05.680 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:15:05.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:15:05.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:15:06.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:15:06.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:15:06.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:15:06.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T09:15:06.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:15:06.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-05-29T09:15:06.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:15:06.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:15:06.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:15:06.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-05-29T09:15:08.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-05-29T09:15:08.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:15:08.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:15:08.818 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:15:08.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:15:08.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:15:08.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:15:08.842 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:15:08.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:15:08.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:15:08.843 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:15:08.844 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:15:08.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:15:08.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:15:08.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:15:09.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:15:09.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:15:09.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:15:09.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:15:09.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:15:09.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:15:09.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:15:09.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:15:09.168 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:15:09.228 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:14:49
2026-05-29T09:15:09.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71453, datetime.datetime(2026, 5, 29, 9, 14, 49), datetime.datetime(2026, 5, 29, 9, 14, 48), 'salt', 9.2, 70.95, None, 10.31, 94.74, 4.99, 833.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:15:09.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:15:09.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:15:09.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:14:48, diff=21.235277s, valid=True
2026-05-29T09:15:09.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:15:09.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:15:09.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:15:12, diff=-2.761258s, valid=True
2026-05-29T09:15:09.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:15:09.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:15:09.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:14:44, diff=25.246647s, valid=True
2026-05-29T09:15:09.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:15:09.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:15:09.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:15:09.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:15:09.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:15:09.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:15:09.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:15:12, diff=-2.749757s, valid=True
2026-05-29T09:15:09.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:15:09.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:15:09.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:15:09.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971551.251049s, valid=True
2026-05-29T09:15:09.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:15:09.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:15:09.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:15:09.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:15:09.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:15:09.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:15:09.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:15:09.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:15:09.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:15:09.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:15:09.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:15:09.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:15:09.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:15:09.650 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:15:09.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:15:10.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:15:10.324 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:15:10.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:15:10.325 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:15:10.325 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:15:10.506 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:15:10.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:15:40.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:15:40.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:15:40.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:15:41.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:15:41.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:15:41.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:15:41.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-05-29T09:15:41.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:15:41.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-05-29T09:15:41.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:15:41.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:15:41.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:15:41.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T09:15:43.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-05-29T09:15:43.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:15:43.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:15:43.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:15:43.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:15:43.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:15:43.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:15:43.847 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:15:43.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:15:43.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:15:43.848 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:15:43.849 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:15:43.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:15:43.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:15:43.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:15:44.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:15:44.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:15:44.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:15:44.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:15:44.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:15:44.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:15:44.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:15:44.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:15:44.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:15:44.226 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:15:19
2026-05-29T09:15:44.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71454, datetime.datetime(2026, 5, 29, 9, 15, 19), datetime.datetime(2026, 5, 29, 9, 15, 19), 'salt', 9.33, 71.11, None, 12.25, 87.2, 4.96, 833.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:15:44.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:15:44.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:15:44.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:15:19, diff=25.233635s, valid=True
2026-05-29T09:15:44.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:15:44.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:15:44.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:15:12, diff=32.237084s, valid=True
2026-05-29T09:15:44.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:15:44.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:15:44.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:15:16, diff=28.2449s, valid=True
2026-05-29T09:15:44.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:15:44.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:15:44.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:15:44.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:15:44.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:15:44.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:15:44.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:15:12, diff=32.248507s, valid=True
2026-05-29T09:15:44.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:15:44.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:15:44.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:15:44.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971586.249302s, valid=True
2026-05-29T09:15:44.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:15:44.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:15:44.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:15:44.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:15:44.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:15:44.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:15:44.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:15:44.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:15:44.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:15:44.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:15:44.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:15:44.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:15:44.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:15:44.571 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:15:44.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:15:45.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:15:45.227 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:15:45.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:15: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-05-29T09:15: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-05-29T09:15:45.402 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:15:45.402 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:16:15.407 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:16:15.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:16:15.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:16:16.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:16:16.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:16:16.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:16:16.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-05-29T09:16:16.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:16:16.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-05-29T09:16:16.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:16:16.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:16:16.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:16:16.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-05-29T09:16:18.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-05-29T09:16:18.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:16:18.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:16:18.821 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:16:18.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:16:18.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:16:18.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:16:18.842 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:16:18.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:16:18.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:16:18.843 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:16:18.843 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:16:18.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:16:18.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:16:18.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:16:19.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:16:19.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:16:19.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:16:19.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:16:19.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:16:19.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:16:19.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:16:19.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:16:19.156 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:16:19.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:15:49
2026-05-29T09:16:19.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71455, datetime.datetime(2026, 5, 29, 9, 15, 49), datetime.datetime(2026, 5, 29, 9, 15, 49), 'salt', 9.46, 70.51, None, 14.26, 95.3, 5.08, 833.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:16:19.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:16:19.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:16:19.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:15:49, diff=30.226171s, valid=True
2026-05-29T09:16:19.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:16:19.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:16:19.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:16:12, diff=7.22957s, valid=True
2026-05-29T09:16:19.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:16:19.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:16:19.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:15:47, diff=32.23741s, valid=True
2026-05-29T09:16:19.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:16:19.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:16:19.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:16:19.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:16:19.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:16:19.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:16:19.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:16:12, diff=7.24101s, valid=True
2026-05-29T09:16:19.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:16:19.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:16:19.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:16:19.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971621.241793s, valid=True
2026-05-29T09:16:19.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:16:19.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:16:19.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:16:19.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:16:19.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:16:19.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:16:19.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:16:19.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:16:19.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:16:19.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:16:19.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:16:19.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:16:19.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:16:19.630 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:16:19.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:16:20.196 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:16:20.295 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:16:20.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:16:20.296 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:16:20.296 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:16:20.471 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:16:20.471 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:16:50.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:16:50.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:16:50.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:16:50.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:16:50.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:16:51.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:16:51.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-05-29T09:16:51.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:16:51.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-05-29T09:16:51.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:16:51.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:16:51.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:16:51.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-05-29T09:16:53.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-05-29T09:16:53.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:16:53.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:16:53.400 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:16:53.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:16:53.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:16:53.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:16:53.426 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:16:53.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:16:53.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:16:53.426 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:16:53.426 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:16:53.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:16:53.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:16:53.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:16:53.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:16:53.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:16:53.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:16:53.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:16:53.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:16:53.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:16:53.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:16:53.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:16:53.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:16:53.750 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:16:51
2026-05-29T09:16:53.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71457, datetime.datetime(2026, 5, 29, 9, 16, 51), datetime.datetime(2026, 5, 29, 9, 16, 49), 'salt', 9.66, 69.05, None, 14.33, 85.2, 5.39, 833.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:16:53.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:16:53.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:16:53.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:16:49, diff=4.756632s, valid=True
2026-05-29T09:16:53.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:16:53.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:16:53.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:17:12, diff=-18.240489s, valid=True
2026-05-29T09:16:53.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:16:53.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:16:53.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:16:44, diff=9.766235s, valid=True
2026-05-29T09:16:53.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:16:53.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:16:53.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:16:53.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:16:53.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:16:53.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:16:53.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:17:12, diff=-18.230784s, valid=True
2026-05-29T09:16:53.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:16:53.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:16:53.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:16:53.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971655.769873s, valid=True
2026-05-29T09:16:53.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:16:53.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:16:53.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:16:53.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:16:53.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:16:53.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:16:53.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:16:53.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:16:53.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:16:53.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:16:53.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:16:54.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:16:54.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:16:54.109 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:16:54.329 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:16:54.678 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:16:54.783 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:16:54.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:16:54.783 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:16:54.783 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:16:55.049 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:16:55.049 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:17:25.079 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:17:25.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:17:25.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:17:25.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:17:25.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:17:25.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:17:25.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-05-29T09:17:25.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:17:25.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-05-29T09:17:25.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:17:25.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:17:25.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:17: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-05-29T09:17:27.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-05-29T09:17:27.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:17:27.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:17:27.893 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:17:27.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:17:27.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:17:27.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:17:27.913 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:17:27.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:17:27.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:17:27.913 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:17:27.913 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:17:27.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:17:27.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:17:27.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:17:28.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:17:28.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:17:28.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:17:28.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:17:28.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:17:28.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:17:28.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:17:28.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:17:28.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:17:28.307 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:17:21
2026-05-29T09:17:28.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71458, datetime.datetime(2026, 5, 29, 9, 17, 21), datetime.datetime(2026, 5, 29, 9, 17, 21), 'salt', 9.46, 68.36, None, 13.37, 90.3, 5.52, 833.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:17:28.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:17:28.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:17:28.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:17:21, diff=7.314062s, valid=True
2026-05-29T09:17:28.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:17:28.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:17:28.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:17:12, diff=16.316916s, valid=True
2026-05-29T09:17:28.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:17:28.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:17:28.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:17:14, diff=14.32355s, valid=True
2026-05-29T09:17:28.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:17:28.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:17:28.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:17:28.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:17:28.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:17:28.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:17:28.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:17:12, diff=16.326517s, valid=True
2026-05-29T09:17:28.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:17:28.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:17:28.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:17:28.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971690.327168s, valid=True
2026-05-29T09:17:28.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:17:28.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:17:28.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:17:28.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:17:28.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:17:28.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:17:28.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:17:28.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:17:28.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:17:28.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:17:28.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:17:28.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:17:28.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:17:28.648 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:17:28.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:17:29.207 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:17:29.316 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:17:29.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:17:29.316 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:17:29.316 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:17:29.563 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:17:29.564 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:17:59.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:17:59.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:17:59.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:17:59.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:17:59.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:18:00.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:18: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-05-29T09:18:00.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:18:00.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-05-29T09:18:00.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:18:00.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:18:00.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:18:00.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-05-29T09:18:02.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-05-29T09:18:02.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:18:02.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:18:02.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:18:02.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:18:02.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:18:02.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:18:02.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:18:02.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:18:02.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:18:02.770 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:18:02.770 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:18:02.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:18:02.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:18:02.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:18:02.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:18:02.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:18:02.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:18:02.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:18:03.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:18:03.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:18:03.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:18:03.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:18:03.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:18:03.094 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:17:51
2026-05-29T09:18:03.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71459, datetime.datetime(2026, 5, 29, 9, 17, 51), datetime.datetime(2026, 5, 29, 9, 17, 51), 'salt', 9.46, 68.92, None, 13.3, 77.93, 5.41, 833.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:18:03.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:18:03.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:18:03.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:17:51, diff=12.101241s, valid=True
2026-05-29T09:18:03.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:18:03.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:18:03.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:18:12, diff=-8.895843s, valid=True
2026-05-29T09:18:03.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:18:03.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:18:03.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:17:44, diff=19.111009s, valid=True
2026-05-29T09:18:03.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:18:03.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:18:03.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:18:03.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:18:03.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:18:03.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:18:03.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:18:12, diff=-8.885905s, valid=True
2026-05-29T09:18:03.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:18:03.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:18:03.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:18:03.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971725.114769s, valid=True
2026-05-29T09:18:03.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:18:03.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:18:03.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:18:03.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:18:03.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:18:03.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:18:03.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:18:03.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:18:03.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:18:03.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:18:03.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:18:03.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:18:03.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:18:03.433 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:18:03.657 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:18:03.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:18:04.100 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:18:04.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:18:04.101 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:18:04.101 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:18:04.277 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:18:04.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:18:34.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:18:34.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:18:34.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:18:34.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:18:34.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:18:34.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:18:34.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T09:18:34.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:18:34.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-05-29T09:18:34.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:18:34.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:18:34.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:18:34.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-05-29T09:18:37.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-05-29T09:18:37.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:18:37.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:18:37.809 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:18:37.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:18:37.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:18:37.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:18:37.829 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:18:37.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:18:37.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:18:37.829 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:18:37.829 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:18:37.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:18:37.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:18:37.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:18:38.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:18:38.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:18:38.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:18:38.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:18:38.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:18:38.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:18:38.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:18:38.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:18:38.111 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:18:38.173 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:18:21
2026-05-29T09:18:38.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71460, datetime.datetime(2026, 5, 29, 9, 18, 21), datetime.datetime(2026, 5, 29, 9, 18, 21), 'salt', 9.33, 69.15, None, 11.65, 77.53, 5.36, 833.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:18:38.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:18:38.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:18:38.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:18:21, diff=17.181632s, valid=True
2026-05-29T09:18:38.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:18:38.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:18:38.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:18:12, diff=26.185522s, valid=True
2026-05-29T09:18:38.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:18:38.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:18:38.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:18:15, diff=23.194629s, valid=True
2026-05-29T09:18:38.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:18:38.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:18:38.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:18:38.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:18:38.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:18:38.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:18:38.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:18:12, diff=26.198482s, valid=True
2026-05-29T09:18:38.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:18:38.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:18:38.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:18:38.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971760.19942s, valid=True
2026-05-29T09:18:38.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:18:38.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:18:38.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:18:38.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:18:38.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:18:38.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:18:38.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:18:38.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:18:38.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:18:38.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:18:38.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:18:38.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:18:38.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:18:38.591 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:18:38.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:18:39.196 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:18:39.305 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:18:39.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:18:39.305 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:18:39.305 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:18:39.567 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:18:39.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:19:09.576 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:19:09.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:19:09.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:19:09.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:19:09.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:19:09.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:19:09.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-05-29T09:19:09.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:19:09.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-05-29T09:19:09.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:19:09.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:19:10.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:19:10.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-05-29T09:19:12.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-05-29T09:19:12.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:19:12.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:19:12.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:19:12.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:19:12.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:19:12.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:19:12.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:19:12.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:19:12.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:19:12.433 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:19:12.434 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:19:12.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:19:12.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:19:12.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:19:12.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:19:12.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:19:12.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:19:12.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:19:12.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:19:12.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:19:12.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:19:12.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:19:12.696 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:19:12.757 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:18:52
2026-05-29T09:19:12.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71461, datetime.datetime(2026, 5, 29, 9, 18, 52), datetime.datetime(2026, 5, 29, 9, 18, 51), 'salt', 9.26, 69.95, None, 12.85, 81.26, 5.19, 833.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:19:12.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:19:12.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:19:12.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:18:51, diff=21.763986s, valid=True
2026-05-29T09:19:12.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:19:12.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:19:12.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:19:12, diff=0.766807s, valid=True
2026-05-29T09:19:12.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:19:12.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:19:12.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:18:46, diff=26.773546s, valid=True
2026-05-29T09:19:12.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:19:12.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:19:12.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:19:12.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:19:12.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:19:12.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:19:12.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:19:12, diff=0.776575s, valid=True
2026-05-29T09:19:12.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:19:12.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:19:12.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:19:12.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971794.777244s, valid=True
2026-05-29T09:19:12.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:19:12.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:19:12.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:19:12.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:19:12.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:19:12.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:19:12.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:19:12.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:19:12.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:19:12.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:19:12.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:19:13.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:19:13.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:19:13.108 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:19:13.389 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:19:13.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:19:13.848 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:19:13.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:19:13.848 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:19:13.848 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:19:14.019 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:19:14.019 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:19:44.036 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:19:44.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:19:44.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:19:44.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:19:44.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:19:44.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:19:44.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-05-29T09:19:44.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:19:44.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-05-29T09:19:44.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:19:44.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:19:44.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:19:44.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T09:19:46.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T09:19:46.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:19:46.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:19:46.887 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:19:46.887 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:19:46.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:19:46.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:19:46.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:19:46.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:19:46.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:19:46.907 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:19:46.908 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:19:46.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:19:46.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:19:46.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:19:47.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:19:47.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:19:47.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:19:47.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:19:47.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:19:47.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:19:47.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:19:47.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:19:47.165 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:19:47.227 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:19:23
2026-05-29T09:19:47.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71462, datetime.datetime(2026, 5, 29, 9, 19, 23), datetime.datetime(2026, 5, 29, 9, 19, 23), 'salt', 9.16, 69.95, None, 12.35, 85.58, 5.18, 833.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:19:47.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:19:47.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:19:47.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:19:23, diff=24.237251s, valid=True
2026-05-29T09:19:47.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:19:47.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:19:47.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:19:12, diff=35.241639s, valid=True
2026-05-29T09:19:47.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:19:47.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:19:47.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:19:17, diff=30.251039s, valid=True
2026-05-29T09:19:47.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:19:47.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:19:47.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:19:47.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:19:47.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:19:47.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:19:47.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:19:12, diff=35.254067s, valid=True
2026-05-29T09:19:47.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:19:47.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:19:47.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:19:47.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971829.254741s, valid=True
2026-05-29T09:19:47.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:19:47.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:19:47.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:19:47.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:19:47.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:19:47.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:19:47.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:19:47.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:19:47.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:19:47.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:19:47.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:19:47.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:19:47.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:19:47.581 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:19:47.797 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:19:48.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:19:48.252 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:19:48.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:19:48.252 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:19:48.252 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:19:48.416 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:19:48.416 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:20:18.444 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:20:18.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:20:18.444 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:20:18.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:20:18.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:20:18.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:20:18.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T09:20:18.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:20:18.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T09:20:18.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:20:18.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:20:18.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:20:18.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T09:20:21.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-05-29T09:20:21.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:20:21.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:20:21.562 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:20:21.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:20:21.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:20:21.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:20:21.584 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:20:21.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:20:21.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:20:21.584 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:20:21.584 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:20:21.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:20:21.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:20:21.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:20:21.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:20:21.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:20:21.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:20:21.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:20:21.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:20:21.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:20:21.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:20:21.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:20:21.855 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:20:21.914 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:19:53
2026-05-29T09:20:21.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71463, datetime.datetime(2026, 5, 29, 9, 19, 53), datetime.datetime(2026, 5, 29, 9, 19, 53), 'salt', 9.1, 70.84, None, 13.69, 83.21, 5.01, 833.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:20:21.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:20:21.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:20:21.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:19:53, diff=28.921003s, valid=True
2026-05-29T09:20:21.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:20:21.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:20:21.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:20:12, diff=9.923858s, valid=True
2026-05-29T09:20:21.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:20:21.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:20:21.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:19:48, diff=33.930463s, valid=True
2026-05-29T09:20:21.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:20:21.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:20:21.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:20:21.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:20:21.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:20:21.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:20:21.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:20:12, diff=9.933507s, valid=True
2026-05-29T09:20:21.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:20:21.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:20:21.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:20:21.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971863.934183s, valid=True
2026-05-29T09:20:21.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:20:21.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:20:21.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:20:21.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:20:21.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:20:21.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:20:21.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:20:21.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:20:22.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:20:22.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:20:22.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:20:22.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:20:22.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:20:22.329 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:20:22.555 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:20:22.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:20:22.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:20:22.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:20:22.992 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:20:22.992 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:20:23.166 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:20:23.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:20:53.196 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:20:53.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:20:53.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:20:53.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:20:53.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:20:53.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:20:53.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-05-29T09:20:53.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:20:53.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-05-29T09:20:53.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:20:53.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:20:53.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:20:53.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-05-29T09:20:56.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-05-29T09:20:56.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:20:56.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:20:56.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:20:56.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:20:56.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:20:56.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:20:56.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:20:56.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:20:56.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:20:56.413 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:20:56.413 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:20:56.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:20:56.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:20:56.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:20:56.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:20:56.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:20:56.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:20:56.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:20:56.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:20:56.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:20:56.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:20:56.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:20:56.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:20:56.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:20:54
2026-05-29T09:20:56.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71465, datetime.datetime(2026, 5, 29, 9, 20, 54), datetime.datetime(2026, 5, 29, 9, 20, 53), 'salt', 9.13, 71.31, None, 13.3, 91.45, 4.91, 833.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:20:56.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:20:56.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:20:56.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:20:53, diff=3.737133s, valid=True
2026-05-29T09:20:56.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:20:56.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:20:56.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:21:12, diff=-15.259866s, valid=True
2026-05-29T09:20:56.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:20:56.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:20:56.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:20:51, diff=5.747702s, valid=True
2026-05-29T09:20:56.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:20:56.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:20:56.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:20:56.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:20:56.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:20:56.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:20:56.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:21:12, diff=-15.248358s, valid=True
2026-05-29T09:20:56.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:20:56.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:20:56.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:20:56.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971898.752408s, valid=True
2026-05-29T09:20:56.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:20:56.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:20:56.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:20:56.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:20:56.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:20:56.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:20:56.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:20:56.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:20:56.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:20:56.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:20:56.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:20:56.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:20:57.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:20:57.078 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:20:57.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:20:57.639 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:20:57.742 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:20:57.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:20:57.743 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:20:57.743 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:20:57.998 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:20:57.999 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:21:28.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:21:28.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:21:28.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:21:28.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:21:28.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:21:28.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:21:28.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-05-29T09:21:28.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:21:28.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-05-29T09:21:28.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:21:28.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:21:28.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:21:28.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-05-29T09:21:30.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-05-29T09:21:30.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:21:30.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:21:30.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:21:30.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:21:30.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:21:30.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:21:30.784 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:21:30.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:21:30.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:21:30.784 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:21:30.785 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:21:30.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:21:30.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:21:30.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:21:30.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:21:30.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:21:31.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:21:31.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:21:31.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T09:21:31.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:21:31.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:21:31.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:21:31.062 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:21:31.121 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:21:24
2026-05-29T09:21:31.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71466, datetime.datetime(2026, 5, 29, 9, 21, 24), datetime.datetime(2026, 5, 29, 9, 21, 23), 'salt', 9.13, 71.31, None, 13.34, 78.14, 4.91, 833.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:21:31.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:21:31.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:21:31.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:21:23, diff=8.12838s, valid=True
2026-05-29T09:21:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:21:31.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:21:31.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:21:12, diff=19.131498s, valid=True
2026-05-29T09:21:31.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:21:31.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:21:31.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:21:23, diff=8.138557s, valid=True
2026-05-29T09:21:31.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:21:31.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:21:31.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:21:31.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:21:31.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:21:31.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T09:21:31.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:21:12, diff=19.141805s, valid=True
2026-05-29T09:21:31.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:21:31.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:21:31.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:21:31.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971933.142524s, valid=True
2026-05-29T09:21:31.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:21:31.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:21:31.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:21:31.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:21:31.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:21:31.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:21:31.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:21:31.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:21:31.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:21:31.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:21:31.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:21:31.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:21:31.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:21:31.543 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:21:31.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:21:32.112 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:21:32.212 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:21:32.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:21: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-05-29T09:21:32.213 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:21:32.461 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:21:32.462 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:22:02.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:22:02.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:22:02.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:22:02.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:22:02.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:22:02.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:22:02.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-05-29T09:22:02.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:22:02.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-05-29T09:22:03.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:22:03.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:22:03.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:22:03.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-05-29T09:22:05.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-05-29T09:22:05.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:22:05.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:22:05.725 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:22:05.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:22:05.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:22:05.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:22:05.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:22:05.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:22:05.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:22:05.746 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:22:05.746 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:22:05.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:22:05.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:22:05.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:22:05.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:22:05.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:22:05.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:22:05.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:22:05.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:22:05.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:22:06.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:22:06.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:22:06.001 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:22:06.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:21:54
2026-05-29T09:22:06.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71467, datetime.datetime(2026, 5, 29, 9, 21, 54), datetime.datetime(2026, 5, 29, 9, 21, 54), 'salt', 9.16, 71.71, None, 13.2, 95.79, 4.83, 833.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:22:06.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:22:06.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:22:06.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:21:54, diff=12.06733s, valid=True
2026-05-29T09:22:06.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:22:06.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:22:06.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:22:12, diff=-5.929803s, valid=True
2026-05-29T09:22:06.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:22:06.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:22:06.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:21:46, diff=20.07686s, valid=True
2026-05-29T09:22:06.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:22:06.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:22:06.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:22:06.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:22:06.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:22:06.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:22:06.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:22:12, diff=-5.920129s, valid=True
2026-05-29T09:22:06.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:22:06.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:22:06.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:22:06.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=971968.080516s, valid=True
2026-05-29T09:22:06.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:22:06.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:22:06.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:22:06.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:22:06.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:22:06.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:22:06.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:22:06.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:22:06.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:22:06.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:22:06.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:22:06.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:22:06.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:22:06.398 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:22:06.603 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:22:06.939 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:22:07.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:22:07.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:22:07.041 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:22:07.041 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:22:07.285 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:22:07.285 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:22:37.315 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:22:37.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:22:37.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:22:37.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:22:37.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:22:37.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:22:37.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-05-29T09:22:37.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:22:37.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-05-29T09:22:37.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:22:37.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:22:37.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:22:37.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-05-29T09:22:40.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-05-29T09:22:40.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:22:40.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:22:40.051 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:22:40.051 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:22:40.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:22:40.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:22:40.072 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:22:40.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:22:40.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:22:40.072 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:22:40.072 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:22:40.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:22:40.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:22:40.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:22:40.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:22:40.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:22:40.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:22:40.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:22:40.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:22:40.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:22:40.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:22:40.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:22:40.341 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:22:40.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:22:24
2026-05-29T09:22:40.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71468, datetime.datetime(2026, 5, 29, 9, 22, 24), datetime.datetime(2026, 5, 29, 9, 22, 24), 'salt', 9.16, 72.04, None, 11.79, 108.18, 4.76, 833.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:22:40.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:22:40.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:22:40.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:22:24, diff=16.40557s, valid=True
2026-05-29T09:22:40.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:22:40.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:22:40.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:22:12, diff=28.408355s, valid=True
2026-05-29T09:22:40.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:22:40.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:22:40.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:22:17, diff=23.414947s, valid=True
2026-05-29T09:22:40.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:22:40.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:22:40.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:22:40.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:22:40.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:22:40.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:22:40.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:22:12, diff=28.418017s, valid=True
2026-05-29T09:22:40.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:22:40.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:22:40.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:22:40.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972002.418698s, valid=True
2026-05-29T09:22:40.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:22:40.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:22:40.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:22:40.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:22:40.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:22:40.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:22:40.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:22:40.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:22:40.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:22:40.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:22:40.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:22:40.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:22:40.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:22:40.806 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:22:41.042 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:22:41.394 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:22:41.496 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:22:41.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:22:41.496 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:22:41.497 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:22:41.666 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:22:41.666 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:23:11.696 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:23:11.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:23:11.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:23:11.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:23:11.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:23:12.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:23:12.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-05-29T09:23:12.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:23:12.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-05-29T09:23:12.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:23:12.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:23:12.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:23:12.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-05-29T09:23:14.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-05-29T09:23:14.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:23:14.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:23:14.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:23:14.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:23:14.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:23:14.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:23:14.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:23:14.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:23:14.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:23:14.896 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:23:14.896 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:23:14.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:23:14.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:23:14.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:23:15.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:23:15.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:23:15.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:23:15.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:23:15.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:23:15.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:23:15.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:23:15.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:23:15.153 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:23:15.220 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:22:54
2026-05-29T09:23:15.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71469, datetime.datetime(2026, 5, 29, 9, 22, 54), datetime.datetime(2026, 5, 29, 9, 22, 54), 'salt', 9.2, 72.87, None, 10.69, 93.82, 4.61, 833.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:23:15.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:23:15.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:23:15.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:22:54, diff=21.226331s, valid=True
2026-05-29T09:23:15.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:23:15.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:23:15.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:23:12, diff=3.22917s, valid=True
2026-05-29T09:23:15.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:23:15.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:23:15.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:22:47, diff=28.235919s, valid=True
2026-05-29T09:23:15.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:23:15.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:23:15.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:23:15.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:23:15.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:23:15.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:23:15.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:23:12, diff=3.238975s, valid=True
2026-05-29T09:23:15.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:23:15.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:23:15.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:23:15.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972037.239648s, valid=True
2026-05-29T09:23:15.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:23:15.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:23:15.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:23:15.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:23:15.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:23:15.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:23:15.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:23:15.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:23:15.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:23:15.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:23:15.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:23:15.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:23:15.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:23:15.559 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:23:15.768 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:23:16.109 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:23:16.211 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:23:16.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:23:16.212 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:23:16.212 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:23:16.379 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:23:16.379 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:23:46.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:23:46.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:23:46.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:23:46.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:23:46.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:23:46.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:23:46.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T09:23:46.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:23:46.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-05-29T09:23:46.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:23:46.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:23:46.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:23:46.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T09:23:49.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-05-29T09:23:49.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:23:49.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:23:49.209 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:23:49.209 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:23:49.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:23:49.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:23:49.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:23:49.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:23:49.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:23:49.232 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:23:49.232 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:23:49.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:23:49.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:23:49.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:23:49.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:23:49.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:23:49.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:23:49.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:23:49.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:23:49.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:23:49.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:23:49.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:23:49.491 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:23:49.554 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:23:25
2026-05-29T09:23:49.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71470, datetime.datetime(2026, 5, 29, 9, 23, 25), datetime.datetime(2026, 5, 29, 9, 23, 24), 'salt', 9.26, 73.07, None, 14.33, 90.58, 4.57, 833.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:23:49.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:23:49.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:23:49.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:23:24, diff=25.560548s, valid=True
2026-05-29T09:23:49.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:23:49.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:23:49.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:23:12, diff=37.563385s, valid=True
2026-05-29T09:23:49.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:23:49.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:23:49.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:23:18, diff=31.569874s, valid=True
2026-05-29T09:23:49.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:23:49.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:23:49.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:23:49.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:23:49.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:23:49.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:23:49.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:23:12, diff=37.57284s, valid=True
2026-05-29T09:23:49.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:23:49.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:23:49.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:23:49.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972071.573507s, valid=True
2026-05-29T09:23:49.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:23:49.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:23:49.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:23:49.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:23:49.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:23:49.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:23:49.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:23:49.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:23:49.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:23:49.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:23:49.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:23:49.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:23:49.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:23:49.902 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:23:50.174 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:23:50.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:23:50.650 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:23:50.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:23:50.650 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:23:50.650 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:23:50.821 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:23:50.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:24:20.851 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:24:20.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:24:20.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:24:21.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:24:21.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:24:21.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:24:21.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-05-29T09:24:21.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:24:21.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-05-29T09:24:21.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:24:21.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:24:21.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:24:21.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-05-29T09:24:23.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-05-29T09:24:23.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:24:23.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:24:23.740 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:24:23.740 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:24:23.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:24:23.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:24:23.762 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:24:23.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:24:23.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:24:23.762 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:24:23.762 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:24:23.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:24:23.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:24:23.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:24:23.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:24:23.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:24:23.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:24:23.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:24:24.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:24:24.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:24:24.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:24:24.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:24:24.023 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:24:24.085 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:23:55
2026-05-29T09:24:24.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71471, datetime.datetime(2026, 5, 29, 9, 23, 55), datetime.datetime(2026, 5, 29, 9, 23, 54), 'salt', 9.16, 71.01, None, 14.5, 92.45, 4.97, 833.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:24:24.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:24:24.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:24:24.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:23:54, diff=30.0916s, valid=True
2026-05-29T09:24:24.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:24:24.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:24:24.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:24:12, diff=12.094417s, valid=True
2026-05-29T09:24:24.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:24:24.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:24:24.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:23:49, diff=35.101109s, valid=True
2026-05-29T09:24:24.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:24:24.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:24:24.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:24:24.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:24:24.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:24:24.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:24:24.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:24:12, diff=12.104153s, valid=True
2026-05-29T09:24:24.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:24:24.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:24:24.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:24:24.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972106.104852s, valid=True
2026-05-29T09:24:24.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:24:24.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:24:24.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:24:24.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:24:24.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:24:24.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:24:24.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:24:24.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:24:24.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:24:24.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:24:24.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:24:24.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:24:24.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:24:24.423 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:24:24.648 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:24:24.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:24:25.146 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:24:25.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:24:25.146 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:24:25.146 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:24:25.310 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:24:25.310 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:24:55.320 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:24:55.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:24:55.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:24:55.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:24:55.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:24:55.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:24:55.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-05-29T09:24:55.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:24:55.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T09:24:55.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:24:55.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:24:55.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:24:55.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-05-29T09:24:58.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-05-29T09:24:58.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:24:58.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:24:58.597 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:24:58.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:24:58.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:24:58.617 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:24:58.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:24:58.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:24:58.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:24:58.618 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:24:58.618 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:24:58.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:24:58.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:24:58.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:24:58.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:24:58.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:24:58.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:24:58.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:24:58.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:24:58.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:24:58.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:24:58.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:24:58.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:24:58.990 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:24:55
2026-05-29T09:24:58.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71473, datetime.datetime(2026, 5, 29, 9, 24, 55), datetime.datetime(2026, 5, 29, 9, 24, 55), 'salt', 9.23, 71.37, None, 11.4, 85.83, 4.9, 833.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:24:58.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:24:58.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:24:58.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:24:55, diff=3.997098s, valid=True
2026-05-29T09:24:58.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:24:58.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:24:58.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:25:12, diff=-13.000027s, valid=True
2026-05-29T09:24:59.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:24:59.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:24:59.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:24:52, diff=7.006611s, valid=True
2026-05-29T09:24:59.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:24:59.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:24:59.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:24:59.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:24:59.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:24:59.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:24:59.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:25:12, diff=-12.990308s, valid=True
2026-05-29T09:24:59.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:24:59.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:24:59.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:24:59.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972141.010365s, valid=True
2026-05-29T09:24:59.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:24:59.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:24:59.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:24:59.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:24:59.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:24:59.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:24:59.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:24:59.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:24:59.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:24:59.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:24:59.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:24:59.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:24:59.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:24:59.327 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:24:59.538 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:24:59.881 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:24:59.986 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:24:59.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:24:59.986 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:24:59.986 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:25:00.152 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:25:00.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:25:30.182 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:25:30.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:25:30.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:25:30.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:25:30.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:25:30.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:25:30.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-05-29T09:25:30.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:25:30.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-05-29T09:25:30.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:25:30.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:25:30.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:25:30.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-05-29T09:25:32.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-05-29T09:25:32.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:25:32.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:25:32.778 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:25:32.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:25:32.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:25:32.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:25:32.801 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:25:32.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:25:32.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:25:32.802 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:25:32.802 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:25:32.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:25:32.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:25:32.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:25:32.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:25:32.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:25:33.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:25:33.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:25:33.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:25:33.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:25:33.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:25:33.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:25:33.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:25:33.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:25:25
2026-05-29T09:25:33.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71474, datetime.datetime(2026, 5, 29, 9, 25, 25), datetime.datetime(2026, 5, 29, 9, 25, 25), 'salt', 9.23, 71.41, None, 12.53, 94.0, 4.9, 833.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:25:33.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:25:33.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:25:33.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:25:25, diff=8.143503s, valid=True
2026-05-29T09:25:33.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:25:33.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:25:33.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:25:12, diff=21.146328s, valid=True
2026-05-29T09:25:33.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:25:33.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:25:33.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:25:23, diff=10.153028s, valid=True
2026-05-29T09:25:33.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:25:33.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:25:33.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:25:33.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:25:33.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:25:33.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:25:33.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:25:12, diff=21.156045s, valid=True
2026-05-29T09:25:33.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:25:33.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:25:33.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:25:33.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972175.156712s, valid=True
2026-05-29T09:25:33.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:25:33.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:25:33.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:25:33.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:25:33.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:25:33.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:25:33.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:25:33.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:25:33.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:25:33.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:25:33.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:25:33.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:25:33.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:25:33.474 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:25:33.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:25:34.099 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:25:34.199 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:25:34.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:25:34.199 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:25:34.199 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:25:34.448 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:25:34.449 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:26:04.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:26:04.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:26:04.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:26:04.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:26:04.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:26:05.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:26:05.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-05-29T09:26:05.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:26:05.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-05-29T09:26:05.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:26:05.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:26:05.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:26:05.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-05-29T09:26:07.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-05-29T09:26:07.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:26:07.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:26:07.477 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:26:07.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:26:07.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:26:07.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:26:07.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:26:07.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:26:07.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:26:07.499 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:26:07.499 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:26:07.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:26:07.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:26:07.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:26:07.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:26:07.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:26:07.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:26:07.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:26:07.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:26:07.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:26:07.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:26:07.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:26:07.767 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:26:07.825 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:25:56
2026-05-29T09:26:07.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71475, datetime.datetime(2026, 5, 29, 9, 25, 56), datetime.datetime(2026, 5, 29, 9, 25, 55), 'salt', 9.33, 72.47, None, 12.85, 86.61, 4.69, 833.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:26:07.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:26:07.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:26:07.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:25:55, diff=12.832459s, valid=True
2026-05-29T09:26:07.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:26:07.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:26:07.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:26:12, diff=-4.164666s, valid=True
2026-05-29T09:26:07.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:26:07.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:26:07.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:25:55, diff=12.841998s, valid=True
2026-05-29T09:26:07.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:26:07.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:26:07.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:26:07.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:26:07.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:26:07.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:26:07.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:26:12, diff=-4.154962s, valid=True
2026-05-29T09:26:07.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:26:07.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:26:07.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:26:07.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972209.845701s, valid=True
2026-05-29T09:26:07.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:26:07.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:26:07.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:26:07.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:26:07.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:26:07.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:26:07.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:26:07.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:26:07.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:26:07.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:26:08.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:26:08.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:26:08.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:26:08.172 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:26:08.383 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:26:08.728 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:26:08.832 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:26:08.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:26:08.832 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:26:08.832 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:26:09.030 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:26:09.031 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:26:39.061 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:26:39.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:26:39.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:26:39.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:26:39.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:26:39.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:26:39.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-05-29T09:26:39.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:26:39.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-05-29T09:26:39.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:26:39.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:26:39.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:26:39.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-05-29T09:26:42.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-05-29T09:26:42.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:26:42.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:26:42.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:26:42.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:26:42.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:26:42.345 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:26:42.366 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:26:42.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:26:42.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:26:42.367 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:26:42.367 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:26:42.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:26:42.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:26:42.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:26:42.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:26:42.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:26:42.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:26:42.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:26:42.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:26:42.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:26:42.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:26:42.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:26:42.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:26:42.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:26:26
2026-05-29T09:26:42.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71476, datetime.datetime(2026, 5, 29, 9, 26, 26), datetime.datetime(2026, 5, 29, 9, 26, 26), 'salt', 9.46, 73.0, None, 11.58, 99.96, 4.59, 833.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:26:42.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:26:42.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:26:42.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:26:26, diff=16.682386s, valid=True
2026-05-29T09:26:42.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:26:42.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:26:42.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:26:12, diff=30.685207s, valid=True
2026-05-29T09:26:42.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:26:42.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:26:42.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:26:19, diff=23.691815s, valid=True
2026-05-29T09:26:42.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:26:42.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:26:42.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:26:42.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:26:42.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:26:42.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:26:42.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:26:12, diff=30.694869s, valid=True
2026-05-29T09:26:42.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:26:42.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:26:42.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:26:42.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972244.695516s, valid=True
2026-05-29T09:26:42.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:26:42.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:26:42.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:26:42.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:26:42.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:26:42.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:26:42.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:26:42.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:26:42.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:26:42.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:26:42.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:26:42.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:26:42.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:26:43.012 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:26:43.297 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:26:43.639 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:26:43.741 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:26:43.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:26:43.742 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:26:43.742 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:26:43.902 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:26:43.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:27:13.932 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:27:13.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:27:13.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:27:14.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:27:14.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:27:14.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:27:14.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T09:27:14.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:27:14.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-05-29T09:27:14.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:27:14.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:27:14.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:27:14.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-05-29T09:27:17.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-05-29T09:27:17.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:27:17.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:27:17.144 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:27:17.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:27:17.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:27:17.164 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:27:17.165 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:27:17.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:27:17.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:27:17.165 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:27:17.165 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:27:17.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:27:17.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:27:17.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:27:17.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:27:17.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:27:17.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:27:17.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:27:17.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:27:17.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:27:17.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:27:17.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:27:17.413 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:27:17.470 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:26:56
2026-05-29T09:27:17.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71477, datetime.datetime(2026, 5, 29, 9, 26, 56), datetime.datetime(2026, 5, 29, 9, 26, 56), 'salt', 9.43, 73.13, None, 10.98, 92.24, 4.56, 833.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:27:17.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:27:17.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:27:17.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:26:56, diff=21.476699s, valid=True
2026-05-29T09:27:17.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:27:17.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:27:17.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:27:12, diff=5.479607s, valid=True
2026-05-29T09:27:17.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:27:17.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:27:17.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:26:49, diff=28.486361s, valid=True
2026-05-29T09:27:17.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:27:17.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:27:17.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:27:17.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:27:17.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:27:17.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:27:17.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:27:12, diff=5.489444s, valid=True
2026-05-29T09:27:17.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:27:17.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:27:17.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:27:17.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972279.49013s, valid=True
2026-05-29T09:27:17.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:27:17.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:27:17.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:27:17.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:27:17.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:27:17.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:27:17.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:27:17.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:27:17.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:27:17.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:27:17.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:27:17.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:27:17.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:27:17.808 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:27:18.016 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:27:18.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:27:18.476 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:27:18.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:27:18.476 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:27:18.476 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:27:19.899 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:27:19.900 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:27:49.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:27:49.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:27:49.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:27:50.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:27:50.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:27:50.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:27:50.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-05-29T09:27:50.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:27:50.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-05-29T09:27:50.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:27:50.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:27:50.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:27:50.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-05-29T09:27:53.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-05-29T09:27:53.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:27:53.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:27:53.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:27:53.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:27:53.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:27:53.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:27:53.501 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:27:53.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:27:53.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:27:53.501 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:27:53.501 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:27:53.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:27:53.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:27:53.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:27:53.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:27:53.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:27:53.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:27:53.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:27:53.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:27:53.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:27:53.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:27:53.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:27:53.759 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:27:53.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:27:26
2026-05-29T09:27:53.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71478, datetime.datetime(2026, 5, 29, 9, 27, 26), datetime.datetime(2026, 5, 29, 9, 27, 26), 'salt', 9.46, 72.8, None, 11.75, 84.66, 4.63, 833.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:27:53.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:27:53.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:27:53.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:27:26, diff=27.823314s, valid=True
2026-05-29T09:27:53.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:27:53.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:27:53.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:27:12, diff=41.826188s, valid=True
2026-05-29T09:27:53.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:27:53.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:27:53.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:27:19, diff=34.832873s, valid=True
2026-05-29T09:27:53.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:27:53.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:27:53.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:27:53.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:27:53.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:27:53.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:27:53.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:27:12, diff=41.835895s, valid=True
2026-05-29T09:27:53.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:27:53.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:27:53.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:27:53.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972315.836543s, valid=True
2026-05-29T09:27:53.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:27:53.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:27:53.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:27:53.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:27:53.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:27:53.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:27:53.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:27:53.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:27:53.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:27:53.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:27:54.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:27:54.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:27:54.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:27:54.223 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:27:54.430 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:27:54.772 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:27:54.873 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:27:54.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:27:54.873 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:27:54.873 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:27:55.040 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:27:55.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:28:25.070 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:28:25.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:28:25.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:28:25.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:28:25.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:28:25.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:28:25.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-05-29T09:28:25.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:28:25.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-05-29T09:28:25.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:28:25.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:28:25.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:28:25.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-05-29T09:28:28.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-05-29T09:28:28.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:28:28.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:28:28.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:28:28.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:28:28.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:28:28.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:28:28.177 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:28:28.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:28:28.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:28:28.178 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:28:28.178 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:28:28.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:28:28.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:28:28.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:28:28.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:28:28.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:28:28.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:28:28.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:28:28.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:28:28.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:28:28.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:28:28.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:28:28.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:28:28.492 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:28:27
2026-05-29T09:28:28.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71480, datetime.datetime(2026, 5, 29, 9, 28, 27), datetime.datetime(2026, 5, 29, 9, 28, 26), 'salt', 9.36, 71.8, None, 12.32, 81.04, 4.82, 833.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:28:28.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:28:28.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:28:28.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:28:26, diff=2.498635s, valid=True
2026-05-29T09:28:28.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:28:28.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:28:28.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:28:12, diff=16.501444s, valid=True
2026-05-29T09:28:28.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:28:28.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:28:28.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:28:21, diff=7.508045s, valid=True
2026-05-29T09:28:28.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:28:28.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:28:28.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:28:28.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:28:28.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:28:28.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:28:28.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:28:12, diff=16.511056s, valid=True
2026-05-29T09:28:28.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:28:28.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:28:28.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:28:28.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972350.511729s, valid=True
2026-05-29T09:28:28.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:28:28.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:28:28.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:28:28.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:28:28.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:28:28.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:28:28.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:28:28.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:28:28.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:28:28.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:28:28.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:28:28.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:28:28.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:28:28.827 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:28:29.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:28:29.391 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:28:29.490 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:28:29.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:28:29.491 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:28:29.491 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:28:29.655 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:28:29.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:28:59.686 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:28:59.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:28:59.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:28:59.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:28:59.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:29:00.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:29:00.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-05-29T09:29:00.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:29:00.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-05-29T09:29:00.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:29:00.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:29:00.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:29:00.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-05-29T09:29:02.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-05-29T09:29:02.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:29:02.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:29:02.469 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:29:02.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:29:02.478 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:29:02.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:29:02.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:29:02.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:29:02.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:29:02.491 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:29:02.491 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:29:02.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:29:02.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:29:02.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:29:02.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:29:02.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:29:02.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:29:02.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:29:02.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:29:02.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:29:02.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:29:02.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:29:02.750 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:29:02.808 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:28:57
2026-05-29T09:29:02.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71481, datetime.datetime(2026, 5, 29, 9, 28, 57), datetime.datetime(2026, 5, 29, 9, 28, 57), 'salt', 9.39, 71.31, None, 12.53, 83.08, 4.92, 833.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:29:02.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:29:02.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:29:02.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:28:57, diff=5.814617s, valid=True
2026-05-29T09:29:02.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:29:02.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:29:02.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:29:12, diff=-9.182603s, valid=True
2026-05-29T09:29:02.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:29:02.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:29:02.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:28:52, diff=10.823917s, valid=True
2026-05-29T09:29:02.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:29:02.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:29:02.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:29:02.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:29:02.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:29:02.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:29:02.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:29:12, diff=-9.173037s, valid=True
2026-05-29T09:29:02.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:29:02.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:29:02.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:29:02.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972384.827617s, valid=True
2026-05-29T09:29:02.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:29:02.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:29:02.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:29:02.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:29:02.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:29:02.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:29:02.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:29:02.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:29:02.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:29:03.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:29:03.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:29:03.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:29:03.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:29:03.220 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:29:03.443 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:29:03.787 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:29:03.887 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:29:03.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:29:03.888 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:29:03.888 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:29:04.055 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:29:04.055 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:29:34.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:29:34.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:29:34.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:29:34.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:29:34.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:29:34.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:29:34.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-05-29T09:29:34.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:29:34.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-05-29T09:29:34.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:29:34.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:29:35.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:29:35.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-05-29T09:29:37.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-05-29T09:29:37.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:29:37.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:29:37.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:29:37.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:29:37.676 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:29:37.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:29:37.688 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:29:37.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:29:37.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:29:37.688 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:29:37.688 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:29:37.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:29:37.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:29:37.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:29:37.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:29:37.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:29:37.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:29:37.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:29:37.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:29:37.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:29:37.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:29:37.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:29:37.941 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:29:37.999 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:29:27
2026-05-29T09:29:37.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71482, datetime.datetime(2026, 5, 29, 9, 29, 27), datetime.datetime(2026, 5, 29, 9, 29, 27), 'salt', 9.43, 70.54, None, 14.64, 86.49, 5.08, 833.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:29:37.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:29:37.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:29:38.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:29:27, diff=11.005306s, valid=True
2026-05-29T09:29:38.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:29:38.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:29:38.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:29:12, diff=26.008446s, valid=True
2026-05-29T09:29:38.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:29:38.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:29:38.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:29:24, diff=14.01529s, valid=True
2026-05-29T09:29:38.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:29:38.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:29:38.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:29:38.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:29:38.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:29:38.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:29:38.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:29:12, diff=26.018417s, valid=True
2026-05-29T09:29:38.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:29:38.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:29:38.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:29:38.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972420.019101s, valid=True
2026-05-29T09:29:38.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:29:38.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:29:38.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:29:38.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:29:38.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:29:38.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:29:38.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:29:38.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:29:38.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:29:38.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:29:38.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:29:38.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:29:38.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:29:38.340 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:29:38.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:29:38.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:29:38.996 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:29:38.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:29:38.997 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:29:38.997 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:29:39.241 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:29:39.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:30:09.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:30:09.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:30:09.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:30:09.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:30:09.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:30:09.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:30:09.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-05-29T09:30:09.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:30:09.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-05-29T09:30:09.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:30:09.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:30:09.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:30:09.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-05-29T09:30:12.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T09:30:12.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:30:12.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:30:12.111 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:30:12.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:30:12.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:30:12.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:30:12.132 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:30:12.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:30:12.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:30:12.133 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:30:12.133 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:30:12.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:30:12.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:30:12.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:30:12.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:30:12.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:30:12.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:30:12.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:30:12.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:30:12.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:30:12.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:30:12.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:30:12.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:30:12.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:29:57
2026-05-29T09:30:12.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71483, datetime.datetime(2026, 5, 29, 9, 29, 57), datetime.datetime(2026, 5, 29, 9, 29, 57), 'salt', 9.43, 70.28, None, 13.27, 90.22, 5.13, 833.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:30:12.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:30:12.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:30:12.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:29:57, diff=15.526222s, valid=True
2026-05-29T09:30:12.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:30:12.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:30:12.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:30:12, diff=0.529084s, valid=True
2026-05-29T09:30:12.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:30:12.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:30:12.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:29:56, diff=16.535717s, valid=True
2026-05-29T09:30:12.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:30:12.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:30:12.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:30:12.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:30:12.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:30:12.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:30:12.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:30:12, diff=0.538756s, valid=True
2026-05-29T09:30:12.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:30:12.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:30:12.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:30:12.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972454.539401s, valid=True
2026-05-29T09:30:12.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:30:12.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:30:12.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:30:12.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:30:12.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:30:12.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:30:12.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:30:12.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:30:12.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:30:12.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:30:12.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:30:12.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:30:12.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:30:12.852 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:30:13.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:30:13.420 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:30:13.521 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:30:13.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:30:13.521 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:30:13.521 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:30:13.684 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:30:13.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:30:43.708 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:30:43.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:30:43.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:30:44.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:30:44.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:30:44.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:30:44.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T09:30:44.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:30:44.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-05-29T09:30:44.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:30:44.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:30:44.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:30:44.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-05-29T09:30:46.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-05-29T09:30:46.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:30:46.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:30:46.865 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:30:46.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:30:46.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:30:46.884 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:30:46.885 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:30:46.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:30:46.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:30:46.885 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:30:46.885 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:30:46.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:30:46.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:30:46.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:30:47.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:30:47.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:30:47.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:30:47.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:30:47.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:30:47.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:30:47.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:30:47.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:30:47.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:30:47.198 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:30:28
2026-05-29T09:30:47.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71484, datetime.datetime(2026, 5, 29, 9, 30, 28), datetime.datetime(2026, 5, 29, 9, 30, 27), 'salt', 9.29, 71.54, None, 13.69, 89.14, 4.87, 833.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:30:47.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:30:47.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:30:47.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:30:27, diff=20.205402s, valid=True
2026-05-29T09:30:47.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:30:47.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:30:47.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:30:12, diff=35.208319s, valid=True
2026-05-29T09:30:47.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:30:47.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:30:47.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:30:27, diff=20.215369s, valid=True
2026-05-29T09:30:47.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:30:47.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:30:47.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:30:47.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:30:47.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:30:47.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:30:47.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:30:12, diff=35.219782s, valid=True
2026-05-29T09:30:47.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:30:47.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:30:47.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:30:47.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972489.220443s, valid=True
2026-05-29T09:30:47.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:30:47.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:30:47.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:30:47.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:30:47.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:30:47.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:30:47.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:30:47.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:30:47.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:30:47.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:30:47.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:30:47.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:30:47.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:30:47.547 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:30:47.760 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:30:48.112 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:30:48.214 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:30:48.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:30:48.215 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:30:48.215 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:30:48.369 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:30:48.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:31:18.399 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:31:18.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:31:18.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:31:18.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:31:18.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:31:19.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:31:19.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-05-29T09:31:19.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:31:19.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-05-29T09:31:19.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:31:19.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:31:19.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:31:19.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-05-29T09:31:21.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-05-29T09:31:21.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:31:21.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:31:21.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:31:21.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:31:21.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:31:21.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:31:21.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:31:21.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:31:21.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:31:21.476 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:31:21.476 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:31:21.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:31:21.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:31:21.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:31:21.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:31:21.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:31:21.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:31:21.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:31:21.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:31:21.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:31:21.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:31:21.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:31:21.732 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:31:21.790 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:30:58
2026-05-29T09:31:21.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71485, datetime.datetime(2026, 5, 29, 9, 30, 58), datetime.datetime(2026, 5, 29, 9, 30, 57), 'salt', 9.36, 71.37, None, 13.76, 74.05, 4.91, 833.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:31:21.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:31:21.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:31:21.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:30:57, diff=24.796835s, valid=True
2026-05-29T09:31:21.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:31:21.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:31:21.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:31:12, diff=9.799671s, valid=True
2026-05-29T09:31:21.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:31:21.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:31:21.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:30:50, diff=31.806244s, valid=True
2026-05-29T09:31:21.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:31:21.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:31:21.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:31:21.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:31:21.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:31:21.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:31:21.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:31:12, diff=9.809253s, valid=True
2026-05-29T09:31:21.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:31:21.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:31:21.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:31:21.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972523.8099s, valid=True
2026-05-29T09:31:21.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:31:21.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:31:21.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:31:21.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:31:21.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:31:21.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:31:21.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:31:21.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:31:21.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:31:21.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:31:22.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:31:22.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:31:22.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:31:22.141 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:31:22.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:31:22.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:31:22.802 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:31:22.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:31:22.802 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:31:22.802 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:31:23.038 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:31:23.038 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:31:53.063 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:31:53.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:31:53.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:31:53.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:31:53.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:31:53.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:31:53.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-05-29T09:31:53.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:31:53.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-05-29T09:31:53.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:31:53.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:31:53.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:31:53.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-05-29T09:31:56.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-05-29T09:31:56.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:31:56.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:31:56.107 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:31:56.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:31:56.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:31:56.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:31:56.128 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:31:56.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:31:56.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:31:56.128 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:31:56.128 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:31:56.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:31:56.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:31:56.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:31:56.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:31:56.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:31:56.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:31:56.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:31:56.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:31:56.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:31:56.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:31:56.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:31:56.384 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:31:56.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:31:28
2026-05-29T09:31:56.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71486, datetime.datetime(2026, 5, 29, 9, 31, 28), datetime.datetime(2026, 5, 29, 9, 31, 28), 'salt', 9.39, 71.57, None, 14.75, 79.84, 4.87, 833.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:31:56.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:31:56.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:31:56.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:31:28, diff=28.449154s, valid=True
2026-05-29T09:31:56.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:31:56.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:31:56.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:31:12, diff=44.452015s, valid=True
2026-05-29T09:31:56.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:31:56.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:31:56.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:31:21, diff=35.458673s, valid=True
2026-05-29T09:31:56.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:31:56.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:31:56.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:31:56.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:31:56.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:31:56.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:31:56.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:31:12, diff=44.461712s, valid=True
2026-05-29T09:31:56.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:31:56.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:31:56.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:31:56.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972558.462363s, valid=True
2026-05-29T09:31:56.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:31:56.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:31:56.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:31:56.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:31:56.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:31:56.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:31:56.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:31:56.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:31:56.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:31:56.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:31:56.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:31:56.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:31:56.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:31:56.779 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:31:56.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:31:57.399 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:31:57.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:31:57.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:31:57.499 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:31:57.499 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:31:57.653 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:31:57.653 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:32:27.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:32:27.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:32:27.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:32:27.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:32:27.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:32:28.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:32:28.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-05-29T09:32:28.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:32: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-05-29T09:32:28.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:32:28.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:32:28.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:32:28.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T09:32:30.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-05-29T09:32:30.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:32:30.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:32:30.467 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:32:30.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:32:30.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:32:30.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:32:30.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:32:30.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:32:30.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:32:30.488 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:32:30.488 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:32:30.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:32:30.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:32:30.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:32:30.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:32:30.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:32:30.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:32:30.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:32:30.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:32:30.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:32:30.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:32:30.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:32:30.743 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:32:30.801 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:32:28
2026-05-29T09:32:30.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71488, datetime.datetime(2026, 5, 29, 9, 32, 28), datetime.datetime(2026, 5, 29, 9, 32, 28), 'salt', 9.43, 72.5, None, 13.69, 93.08, 4.69, 833.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:32:30.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:32:30.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:32:30.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:32:28, diff=2.807501s, valid=True
2026-05-29T09:32:30.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:32:30.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:32:30.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:32:12, diff=18.810668s, valid=True
2026-05-29T09:32:30.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:32:30.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:32:30.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:32:22, diff=8.817508s, valid=True
2026-05-29T09:32:30.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:32:30.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:32:30.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:32:30.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:32:30.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:32:30.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:32:30.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:32:12, diff=18.820595s, valid=True
2026-05-29T09:32:30.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:32:30.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:32:30.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:32:30.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972592.821273s, valid=True
2026-05-29T09:32:30.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:32:30.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:32:30.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:32:30.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:32:30.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:32:30.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:32:30.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:32:30.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:32:30.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:32:30.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:32:31.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:32:31.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:32:31.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:32:31.156 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:32:31.365 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:32:31.708 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:32:31.809 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:32:31.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:32:31.809 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:32:31.809 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:32:31.964 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:32:31.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:33:01.994 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:33:01.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:33:01.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:33:02.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:33:02.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:33:02.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:33:02.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-05-29T09:33:02.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:33:02.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-05-29T09:33:02.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:33:02.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:33:02.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:33:02.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-05-29T09:33:04.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-05-29T09:33:04.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:33:04.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:33:04.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:33:04.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:33:04.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:33:04.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:33:04.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:33:04.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:33:04.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:33:04.871 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:33:04.871 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:33:04.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:33:04.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:33:04.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:33:05.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:33:05.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:33:05.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:33:05.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:33:05.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:33:05.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:33:05.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:33:05.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:33:05.126 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:33:05.186 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:32:59
2026-05-29T09:33:05.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71489, datetime.datetime(2026, 5, 29, 9, 32, 59), datetime.datetime(2026, 5, 29, 9, 32, 58), 'salt', 9.39, 72.1, None, 16.13, 80.73, 4.76, 833.58, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:33:05.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:33:05.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:33:05.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:32:58, diff=7.192574s, valid=True
2026-05-29T09:33:05.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:33:05.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:33:05.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:33:12, diff=-6.804588s, valid=True
2026-05-29T09:33:05.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:33:05.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:33:05.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:32:54, diff=11.202014s, valid=True
2026-05-29T09:33:05.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:33:05.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:33:05.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:33:05.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:33:05.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:33:05.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:33:05.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:33:12, diff=-6.794949s, valid=True
2026-05-29T09:33:05.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:33:05.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:33:05.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:33:05.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972627.205713s, valid=True
2026-05-29T09:33:05.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:33:05.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:33:05.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:33:05.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:33:05.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:33:05.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:33:05.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:33:05.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:33:05.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:33:05.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:33:05.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:33:05.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:33:05.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:33:05.526 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:33:05.827 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:33:06.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:33:06.273 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:33:06.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:33:06.273 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:33:06.273 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:33:06.612 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:33:06.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:33:36.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:33:36.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:33:36.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:33:37.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:33:37.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:33:37.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:33:37.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-05-29T09:33:37.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:33: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-05-29T09:33:37.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:33:37.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:33:37.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:33:37.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-05-29T09:33:39.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-05-29T09:33:39.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:33:39.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:33:39.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:33:39.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:33:39.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:33:39.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:33:39.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:33:39.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:33:39.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:33:39.988 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:33:39.988 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:33:39.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:33:40.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:33:40.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:33:40.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:33:40.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:33:40.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:33:40.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:33:40.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:33:40.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:33:40.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:33:40.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:33:40.241 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:33:40.299 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:33:29
2026-05-29T09:33:40.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71490, datetime.datetime(2026, 5, 29, 9, 33, 29), datetime.datetime(2026, 5, 29, 9, 33, 28), 'salt', 9.49, 72.4, None, 12.85, 83.34, 4.71, 833.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:33:40.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:33:40.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:33:40.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:33:28, diff=12.305518s, valid=True
2026-05-29T09:33:40.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:33:40.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:33:40.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:33:12, diff=28.308373s, valid=True
2026-05-29T09:33:40.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:33:40.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:33:40.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:33:25, diff=15.315038s, valid=True
2026-05-29T09:33:40.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:33:40.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:33:40.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:33:40.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:33:40.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:33:40.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:33:40.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:33:12, diff=28.318083s, valid=True
2026-05-29T09:33:40.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:33:40.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:33:40.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:33:40.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972662.318766s, valid=True
2026-05-29T09:33:40.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:33:40.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:33:40.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:33:40.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:33:40.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:33:40.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:33:40.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:33:40.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:33:40.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:33:40.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:33:40.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:33:40.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:33:40.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:33:40.635 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:33:40.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:33:41.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:33:41.324 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:33:41.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:33:41.324 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:33:41.324 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:33:41.591 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:33:41.591 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:34:11.621 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:34:11.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:34:11.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:34:11.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:34:11.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:34:12.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:34: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-05-29T09:34:12.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:34:12.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-05-29T09:34:12.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:34:12.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:34:12.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:34: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-05-29T09:34:14.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-05-29T09:34:14.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:34:14.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:34:14.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:34:14.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:34:14.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:34:14.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:34:14.564 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:34:14.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:34:14.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:34:14.564 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:34:14.564 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:34:14.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:34:14.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:34:14.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:34:14.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:34:14.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:34:14.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:34:14.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:34:14.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:34:14.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:34:14.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:34:14.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:34:14.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:34:14.887 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:33:59
2026-05-29T09:34:14.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71491, datetime.datetime(2026, 5, 29, 9, 33, 59), datetime.datetime(2026, 5, 29, 9, 33, 59), 'salt', 9.62, 72.96, None, 12.81, 81.44, 4.6, 833.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:34:14.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:34:14.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:34:14.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:33:59, diff=15.894789s, valid=True
2026-05-29T09:34:14.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:34:14.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:34:14.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:34:12, diff=2.897777s, valid=True
2026-05-29T09:34:14.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:34:14.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:34:14.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:33:57, diff=17.904388s, valid=True
2026-05-29T09:34:14.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:34:14.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:34:14.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:34:14.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:34:14.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:34:14.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:34:14.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:34:12, diff=2.908233s, valid=True
2026-05-29T09:34:14.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:34:14.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:34:14.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:34:14.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972696.90892s, valid=True
2026-05-29T09:34:14.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:34:14.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:34:14.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:34:14.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:34:14.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:34:14.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:34:14.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:34:14.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:34:15.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:34:15.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:34:15.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:34:15.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:34:15.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:34:15.329 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:34:15.543 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:34:15.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:34:16.004 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:34:16.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:34:16.005 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:34:16.005 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:34:16.268 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:34:16.268 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:34:46.298 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:34:46.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:34:46.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:34:46.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:34:46.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:34:46.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:34:46.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-05-29T09:34:46.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:34:46.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-05-29T09:34:46.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:34:46.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:34:46.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:34: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-05-29T09:34:49.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-05-29T09:34:49.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:34:49.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:34:49.189 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:34:49.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:34:49.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:34:49.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:34:49.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:34:49.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:34:49.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:34:49.201 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:34:49.201 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:34:49.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:34:49.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:34:49.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:34:49.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:34:49.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:34:49.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:34:49.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:34:49.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:34:49.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:34:49.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:34:49.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:34:49.465 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:34:49.525 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:34:29
2026-05-29T09:34:49.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71492, datetime.datetime(2026, 5, 29, 9, 34, 29), datetime.datetime(2026, 5, 29, 9, 34, 29), 'salt', 9.72, 73.29, None, 12.21, 85.1, 4.53, 833.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:34:49.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:34:49.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:34:49.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:34:29, diff=20.531296s, valid=True
2026-05-29T09:34:49.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:34:49.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:34:49.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:34:12, diff=37.534127s, valid=True
2026-05-29T09:34:49.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:34:49.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:34:49.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:34:28, diff=21.540776s, valid=True
2026-05-29T09:34:49.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:34:49.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:34:49.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:34:49.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:34:49.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:34:49.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:34:49.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:34:12, diff=37.543799s, valid=True
2026-05-29T09:34:49.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:34:49.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:34:49.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:34:49.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972731.544465s, valid=True
2026-05-29T09:34:49.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:34:49.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:34:49.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:34:49.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:34:49.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:34:49.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:34:49.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:34:49.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:34:49.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:34:49.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:34:49.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:34:49.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:34:49.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:34:49.876 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:34:50.109 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:34:50.458 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:34:50.562 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:34:50.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:34: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-05-29T09:34: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-05-29T09:34:50.816 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:34:50.816 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:35:20.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:35:20.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:35:20.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:35:21.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:35:21.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:35:21.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:35:21.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-05-29T09:35:21.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:35:21.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-05-29T09:35:21.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:35:21.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:35:21.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:35:21.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-05-29T09:35:23.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-05-29T09:35:23.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:35:23.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:35:23.642 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:35:23.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:35:23.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:35:23.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:35:23.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:35:23.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:35:23.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:35:23.663 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:35:23.663 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:35:23.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:35:23.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:35:23.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:35:23.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:35:23.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:35:23.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:35:23.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:35:23.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:35:23.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:35:23.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:35:23.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:35:23.918 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:35:23.976 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:35:00
2026-05-29T09:35:23.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71493, datetime.datetime(2026, 5, 29, 9, 35), datetime.datetime(2026, 5, 29, 9, 34, 59), 'salt', 9.72, 73.53, None, 12.99, 81.95, 4.49, 833.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:35:23.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:35:23.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:35:23.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:34:59, diff=24.983027s, valid=True
2026-05-29T09:35:23.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:35:23.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:35:23.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:35:12, diff=11.985909s, valid=True
2026-05-29T09:35:23.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:35:23.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:35:23.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:34:59, diff=24.992538s, valid=True
2026-05-29T09:35:23.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:35:23.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:35:23.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:35:23.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:35:23.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:35:23.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:35:23.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:35:12, diff=11.995568s, valid=True
2026-05-29T09:35:23.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:35:23.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:35:23.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:35:23.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972765.99623s, valid=True
2026-05-29T09:35:23.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:35:23.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:35:23.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:35:23.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:35:23.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:35:24.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:35:24.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:35:24.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:35:24.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:35:24.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:35:24.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:35:24.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:35:24.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:35:24.380 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:35:24.585 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:35:24.925 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:35:25.024 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:35:25.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:35:25.024 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:35:25.024 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:35:25.289 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:35:25.289 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:35:55.303 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:35:55.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:35:55.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:35:55.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:35:55.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:35:55.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:35:55.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T09:35:55.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:35:55.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-05-29T09:35:55.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:35:55.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:35:55.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:35:55.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-05-29T09:35:58.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-05-29T09:35:58.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:35:58.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:35:58.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:35:58.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:35:58.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:35:58.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:35:58.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:35:58.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:35:58.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:35:58.411 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:35:58.411 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:35:58.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:35:58.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:35:58.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:35:58.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:35:58.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:35:58.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:35:58.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:35:58.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:35:58.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:35:58.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:35:58.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:35:58.678 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:35:58.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:35:30
2026-05-29T09:35:58.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71494, datetime.datetime(2026, 5, 29, 9, 35, 30), datetime.datetime(2026, 5, 29, 9, 35, 29), 'salt', 9.66, 72.83, None, 13.94, 84.11, 4.63, 833.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:35:58.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:35:58.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:35:58.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:35:29, diff=29.744396s, valid=True
2026-05-29T09:35:58.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:35:58.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:35:58.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:35:12, diff=46.74738s, valid=True
2026-05-29T09:35:58.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:35:58.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:35:58.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:35:23, diff=35.754152s, valid=True
2026-05-29T09:35:58.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:35:58.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:35:58.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:35:58.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:35:58.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:35:58.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:35:58.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:35:12, diff=46.757456s, valid=True
2026-05-29T09:35:58.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:35:58.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:35:58.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:35:58.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972800.758169s, valid=True
2026-05-29T09:35:58.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:35:58.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:35:58.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:35:58.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:35:58.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:35:58.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:35:58.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:35:58.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:35:58.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:35:58.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:35:58.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:35:59.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:35:59.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:35:59.102 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:35:59.323 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:35:59.679 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:35:59.786 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:35:59.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:35:59.786 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:35:59.786 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:35:59.983 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:35:59.983 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:36:30.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:36:30.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:36:30.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:36:30.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:36:30.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:36:30.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:36:30.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-05-29T09:36:30.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:36:30.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-05-29T09:36:30.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:36:30.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:36:30.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:36:30.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T09:36:33.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-05-29T09:36:33.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:36:33.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:36:33.037 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:36:33.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:36:33.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:36:33.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:36:33.057 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:36:33.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:36:33.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:36:33.057 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:36:33.058 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:36:33.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:36:33.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:36:33.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:36:33.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:36:33.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:36:33.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:36:33.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:36:33.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:36:33.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:36:33.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:36:33.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:36:33.313 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:36:33.374 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:36:31
2026-05-29T09:36:33.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71496, datetime.datetime(2026, 5, 29, 9, 36, 31), datetime.datetime(2026, 5, 29, 9, 36, 31), 'salt', 9.62, 71.83, None, 12.85, 84.35, 4.82, 833.58, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:36:33.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:36:33.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:36:33.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:36:31, diff=2.380635s, valid=True
2026-05-29T09:36:33.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:36:33.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:36:33.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:36:12, diff=21.383437s, valid=True
2026-05-29T09:36:33.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:36:33.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:36:33.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:36:24, diff=9.390104s, valid=True
2026-05-29T09:36:33.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:36:33.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:36:33.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:36:33.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:36:33.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:36:33.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:36:33.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:36:12, diff=21.393179s, valid=True
2026-05-29T09:36:33.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:36:33.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:36:33.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:36:33.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972835.393856s, valid=True
2026-05-29T09:36:33.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:36:33.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:36:33.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:36:33.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:36:33.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:36:33.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:36:33.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:36:33.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:36:33.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:36:33.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:36:33.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:36:33.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:36:33.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:36:33.783 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:36:33.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:36:34.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:36:34.436 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:36:34.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:36:34.436 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:36:34.436 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:36:34.586 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:36:34.586 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:37:04.600 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:37:04.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:37:04.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:37:04.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:37:04.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:37:04.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:37:04.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-05-29T09:37:04.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:37:04.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-05-29T09:37:04.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:37:04.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:37:04.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:37:04.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-05-29T09:37:07.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-05-29T09:37:07.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:37:07.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:37:07.452 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:37:07.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:37:07.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:37:07.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:37:07.473 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:37:07.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:37:07.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:37:07.473 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:37:07.473 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:37:07.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:37:07.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:37:07.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:37:07.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:37:07.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:37:07.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:37:07.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:37:07.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:37:07.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:37:07.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:37:07.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:37:07.732 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:37:07.790 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:37:01
2026-05-29T09:37:07.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71497, datetime.datetime(2026, 5, 29, 9, 37, 1), datetime.datetime(2026, 5, 29, 9, 37, 1), 'salt', 9.49, 72.13, None, 11.05, 87.4, 4.76, 833.58, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:37:07.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:37:07.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:37:07.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:37:01, diff=6.796551s, valid=True
2026-05-29T09:37:07.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:37:07.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:37:07.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:37:12, diff=-4.200622s, valid=True
2026-05-29T09:37:07.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:37:07.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:37:07.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:36:55, diff=12.805957s, valid=True
2026-05-29T09:37:07.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:37:07.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:37:07.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:37:07.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:37:07.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:37:07.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:37:07.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:37:12, diff=-4.191057s, valid=True
2026-05-29T09:37:07.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:37:07.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:37:07.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:37:07.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972869.809586s, valid=True
2026-05-29T09:37:07.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:37:07.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:37:07.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:37:07.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:37:07.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:37:07.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:37:07.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:37:07.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:37:07.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:37:07.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:37:08.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:37:08.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:37:08.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:37:08.130 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:37:08.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:37:08.655 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:37:08.754 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:37:08.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:37:08.754 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:37:08.754 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:37:09.010 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:37:09.010 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:37:39.041 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:37:39.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:37:39.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:37:39.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:37:39.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:37:39.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:37:39.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-05-29T09:37:39.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:37:39.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-05-29T09:37:39.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:37:39.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:37:39.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:37:39.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-05-29T09:37:42.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-05-29T09:37:42.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:37:42.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:37:42.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:37:42.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:37:42.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:37:42.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:37:42.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:37:42.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:37:42.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:37:42.259 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:37:42.259 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:37:42.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:37:42.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:37:42.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:37:42.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:37:42.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:37:42.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:37:42.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:37:42.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T09:37:42.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:37:42.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:37:42.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:37:42.514 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:37:42.580 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:37:33
2026-05-29T09:37:42.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71498, datetime.datetime(2026, 5, 29, 9, 37, 33), datetime.datetime(2026, 5, 29, 9, 37, 31), 'salt', 9.39, 73.13, None, 14.64, 79.37, 4.56, 833.58, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:37:42.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:37:42.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:37:42.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:37:31, diff=11.586212s, valid=True
2026-05-29T09:37:42.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:37:42.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:37:42.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:37:12, diff=30.589013s, valid=True
2026-05-29T09:37:42.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:37:42.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:37:42.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:37:26, diff=16.595597s, valid=True
2026-05-29T09:37:42.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:37:42.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:37:42.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:37:42.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:37:42.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:37:42.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T09:37:42.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:37:12, diff=30.598579s, valid=True
2026-05-29T09:37:42.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:37:42.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:37:42.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:37:42.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972904.599232s, valid=True
2026-05-29T09:37:42.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:37:42.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:37:42.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:37:42.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:37:42.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:37:42.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:37:42.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:37:42.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:37:42.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:37:42.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:37:42.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:37:42.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:37:42.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:37:42.914 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:37:43.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:37:43.460 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:37:43.559 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:37:43.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:37:43.560 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:37:43.560 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:37:43.810 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:37:43.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:38:13.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:38:13.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:38:13.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:38:14.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:38:14.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:38:14.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:38:14.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-05-29T09:38:14.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:38:14.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-05-29T09:38:14.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:38:14.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:38:14.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:38:14.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-05-29T09:38:16.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-05-29T09:38:16.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:38:16.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:38:16.961 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:38:16.961 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:38:16.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:38:16.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:38:16.983 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:38:16.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:38:16.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:38:16.983 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:38:16.983 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:38:16.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:38:17.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:38:17.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:38:17.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:38:17.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:38:17.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:38:17.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:38:17.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:38:17.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:38:17.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:38:17.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:38:17.237 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:38:17.296 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:38:03
2026-05-29T09:38:17.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71499, datetime.datetime(2026, 5, 29, 9, 38, 3), datetime.datetime(2026, 5, 29, 9, 38, 3), 'salt', 9.43, 73.2, None, 11.96, 91.93, 4.55, 833.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:38:17.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:38:17.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:38:17.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:38:03, diff=14.302805s, valid=True
2026-05-29T09:38:17.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:38:17.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:38:17.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:37:12, diff=65.305629s, valid=True
2026-05-29T09:38:17.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:38:17.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:38:17.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:37:57, diff=20.312185s, valid=True
2026-05-29T09:38:17.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:38:17.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:38:17.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:38:17.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:38:17.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:38:17.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:38:17.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:37:12, diff=65.315191s, valid=True
2026-05-29T09:38:17.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:38:17.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:38:17.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:38:17.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972939.315861s, valid=True
2026-05-29T09:38:17.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:38:17.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:38:17.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:38:17.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:38:17.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:38:17.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:38:17.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:38:17.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:38:17.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:38:17.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:38:17.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:38:17.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:38:17.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:38:17.631 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:38:17.827 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:38:18.161 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:38:18.319 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:38:18.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:38:18.320 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:38:18.320 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:38:18.579 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:38:18.579 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:38:48.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:38:48.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:38:48.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:38:49.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:38:49.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:38:49.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:38:49.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-05-29T09:38:49.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:38:49.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-05-29T09:38:49.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:38:49.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:38:49.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:38:49.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-05-29T09:38:51.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-05-29T09:38:51.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:38:51.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:38:51.839 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:38:51.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:38:51.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:38:51.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:38:51.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:38:51.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:38:51.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:38:51.859 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:38:51.859 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:38:51.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:38:51.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:38:51.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:38:52.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:38:52.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:38:52.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:38:52.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:38:52.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T09:38:52.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:38:52.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:38:52.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:38:52.109 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:38:52.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:38:33
2026-05-29T09:38:52.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71500, datetime.datetime(2026, 5, 29, 9, 38, 33), datetime.datetime(2026, 5, 29, 9, 38, 33), 'salt', 9.52, 71.5, None, 14.86, 82.07, 4.88, 833.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:38:52.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:38:52.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:38:52.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:38:33, diff=19.17282s, valid=True
2026-05-29T09:38:52.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:38:52.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:38:52.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:37:12, diff=100.175652s, valid=True
2026-05-29T09:38:52.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:38:52.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:38:52.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:38:29, diff=23.182357s, valid=True
2026-05-29T09:38:52.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:38:52.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:38:52.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:38:52.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:38:52.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:38:52.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T09:38:52.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:37:12, diff=100.185411s, valid=True
2026-05-29T09:38:52.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:38:52.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:38:52.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:38:52.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=972974.186077s, valid=True
2026-05-29T09:38:52.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:38:52.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:38:52.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:38:52.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:38:52.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:38:52.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:38:52.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:38:52.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:38:52.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:38:52.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:38:52.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:38:52.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:38:52.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:38:52.502 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:38:52.700 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:38:53.029 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:38:53.128 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:38:53.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:38:53.128 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:38:53.128 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:38:53.291 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:38:53.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:39:23.321 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:39:23.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:39:23.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:39:23.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:39:23.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:39:23.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:39:23.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-05-29T09:39:23.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:39:23.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-05-29T09:39:23.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:39:23.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:39:23.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:39:23.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-05-29T09:39:26.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-05-29T09:39:26.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:39:26.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:39:26.152 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:39:26.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:39:26.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:39:26.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:39:26.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:39:26.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:39:26.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:39:26.172 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:39:26.172 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:39:26.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:39:26.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:39:26.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:39:26.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:39:26.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:39:26.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:39:26.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:39:26.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:39:26.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:39:26.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:39:26.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:39:26.425 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:39:26.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:39:03
2026-05-29T09:39:26.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71501, datetime.datetime(2026, 5, 29, 9, 39, 3), datetime.datetime(2026, 5, 29, 9, 39, 3), 'salt', 9.46, 70.24, None, 10.87, 111.79, 5.14, 833.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:39:26.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:39:26.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:39:26.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:39:03, diff=23.496231s, valid=True
2026-05-29T09:39:26.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:39:26.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:39:26.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:37:12, diff=134.499028s, valid=True
2026-05-29T09:39:26.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:39:26.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:39:26.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:39:00, diff=26.505658s, valid=True
2026-05-29T09:39:26.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:39:26.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:39:26.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:39:26.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:39:26.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:39:26.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:39:26.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:37:12, diff=134.508647s, valid=True
2026-05-29T09:39:26.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:39:26.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:39:26.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:39:26.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973008.509295s, valid=True
2026-05-29T09:39:26.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:39:26.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:39:26.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:39:26.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:39:26.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:39:26.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:39:26.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:39:26.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:39:26.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:39:26.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:39:26.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:39:26.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:39:26.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:39:26.824 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:39:27.020 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:39:27.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:39:27.514 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:39:27.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:39: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-05-29T09:39: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-05-29T09:39:27.686 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:39:27.687 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:39:57.717 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:39:57.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:39:57.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:39:58.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:39:58.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:39:58.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:39:58.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-05-29T09:39:58.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:39:58.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-05-29T09:39:58.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:39:58.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:39:58.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:39:58.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-05-29T09:40:00.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T09:40:00.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:40:00.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:40:00.876 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:40:00.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:40:00.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:40:00.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:40:00.897 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:40:00.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:40:00.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:40:00.898 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:40:00.898 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:40:00.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:40:00.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:40:00.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:40:01.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:40:01.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:40:01.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:40:01.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:40:01.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:40:01.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:40:01.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:40:01.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:40:01.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:40:01.217 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:39:34
2026-05-29T09:40:01.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71502, datetime.datetime(2026, 5, 29, 9, 39, 34), datetime.datetime(2026, 5, 29, 9, 39, 33), 'salt', 9.72, 71.67, None, 12.74, 78.43, 4.86, 833.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:40:01.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:40:01.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:40:01.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:39:33, diff=28.223787s, valid=True
2026-05-29T09:40:01.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:40:01.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:40:01.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:37:12, diff=169.226593s, valid=True
2026-05-29T09:40:01.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:40:01.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:40:01.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:39:31, diff=30.233311s, valid=True
2026-05-29T09:40:01.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:40:01.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:40:01.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:40:01.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:40:01.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:40:01.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:40:01.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:37:12, diff=169.236399s, valid=True
2026-05-29T09:40:01.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:40:01.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:40:01.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:40:01.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973043.237078s, valid=True
2026-05-29T09:40:01.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:40:01.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:40:01.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:40:01.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:40:01.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:40:01.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:40:01.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:40:01.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:40:01.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:40:01.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:40:01.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:40:01.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:40:01.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:40:01.552 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:40:01.768 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:40:02.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:40:02.245 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:40:02.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:40:02.245 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:40:02.245 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:40:02.418 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:40:02.418 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:40:32.449 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:40:32.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:40:32.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:40:32.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:40:32.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:40:32.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:40:32.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-05-29T09:40:32.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:40:32.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T09:40:32.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:40:32.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:40:32.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:40:32.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T09:40:35.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-05-29T09:40:35.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:40:35.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:40:35.288 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:40:35.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:40:35.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:40:35.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:40:35.308 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:40:35.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:40:35.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:40:35.308 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:40:35.308 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:40:35.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:40:35.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:40:35.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:40:35.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:40:35.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:40:35.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:40:35.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:40:35.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:40:35.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:40:35.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:40:35.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:40:35.566 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:40:35.624 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:40:34
2026-05-29T09:40:35.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71504, datetime.datetime(2026, 5, 29, 9, 40, 34), datetime.datetime(2026, 5, 29, 9, 40, 33), 'salt', 9.82, 71.04, None, 13.87, 90.12, 4.99, 833.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:40:35.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:40:35.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:40:35.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:40:33, diff=2.630256s, valid=True
2026-05-29T09:40:35.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:40:35.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:40:35.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:41:12, diff=-36.366964s, valid=True
2026-05-29T09:40:35.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:40:35.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:40:35.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:40:25, diff=10.639557s, valid=True
2026-05-29T09:40:35.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:40:35.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:40:35.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:40:35.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:40:35.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:40:35.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:40:35.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:41:12, diff=-36.35742s, valid=True
2026-05-29T09:40:35.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:40:35.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:40:35.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:40:35.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973077.643258s, valid=True
2026-05-29T09:40:35.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:40:35.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:40:35.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:40:35.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:40:35.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:40:35.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:40:35.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:40:35.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:40:35.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:40:35.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:40:35.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:40:35.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:40:35.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:40:35.967 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:40:36.238 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:40:36.572 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:40:36.670 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:40:36.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:40:36.671 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:40:36.671 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:40:36.914 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:40:36.914 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:41:06.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:41:06.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:41:06.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:41:07.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:41:07.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:41:07.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:41:07.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-05-29T09:41:07.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:41:07.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-05-29T09:41:07.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:41:07.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:41:07.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:41:07.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-05-29T09:41:09.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-05-29T09:41:09.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:41:09.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:41:09.958 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:41:09.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:41:09.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:41:09.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:41:09.980 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:41:09.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:41:09.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:41:09.980 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:41:09.980 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:41:09.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:41:10.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:41:10.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:41:10.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:41:10.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:41:10.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:41:10.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:41:10.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:41:10.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:41:10.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:41:10.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:41:10.247 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:41:10.306 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:41:04
2026-05-29T09:41:10.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71505, datetime.datetime(2026, 5, 29, 9, 41, 4), datetime.datetime(2026, 5, 29, 9, 41, 4), 'salt', 9.69, 69.71, None, 15.1, 77.59, 5.26, 833.58, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:41:10.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:41:10.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:41:10.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:41:04, diff=6.312675s, valid=True
2026-05-29T09:41:10.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:41:10.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:41:10.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:41:12, diff=-1.684476s, valid=True
2026-05-29T09:41:10.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:41:10.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:41:10.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:40:56, diff=14.322208s, valid=True
2026-05-29T09:41:10.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:41:10.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:41:10.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:41:10.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:41:10.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:41:10.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:41:10.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:41:12, diff=-1.674773s, valid=True
2026-05-29T09:41:10.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:41:10.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:41:10.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:41:10.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973112.32589s, valid=True
2026-05-29T09:41:10.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:41:10.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:41:10.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:41:10.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:41:10.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:41:10.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:41:10.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:41:10.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:41:10.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:41:10.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:41:10.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:41:10.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:41:10.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:41:10.641 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:41:10.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:41:11.196 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:41:11.296 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:41:11.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:41:11.296 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:41:11.296 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:41:11.465 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:41:11.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:41:41.496 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:41:41.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:41:41.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:41:41.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:41:41.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:41:42.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:41:42.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T09:41:42.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:41:42.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-05-29T09:41:42.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:41:42.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:41:42.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:41:42.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-05-29T09:41:44.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-05-29T09:41:44.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:41:44.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:41:44.470 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:41:44.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:41:44.478 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:41:44.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:41:44.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:41:44.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:41:44.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:41:44.491 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:41:44.491 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:41:44.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:41:44.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:41:44.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:41:44.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:41:44.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:41:44.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:41:44.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:41:44.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:41:44.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:41:44.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:41:44.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:41:44.742 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:41:44.799 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:41:34
2026-05-29T09:41:44.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71506, datetime.datetime(2026, 5, 29, 9, 41, 34), datetime.datetime(2026, 5, 29, 9, 41, 34), 'salt', 9.56, 69.38, None, 15.24, 80.61, 5.32, 833.64, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:41:44.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:41:44.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:41:44.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:41:34, diff=10.805281s, valid=True
2026-05-29T09:41:44.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:41:44.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:41:44.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:42:12, diff=-27.191827s, valid=True
2026-05-29T09:41:44.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:41:44.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:41:44.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:41:27, diff=17.814761s, valid=True
2026-05-29T09:41:44.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:41:44.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:41:44.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:41:44.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:41:44.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:41:44.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:41:44.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:42:12, diff=-27.182211s, valid=True
2026-05-29T09:41:44.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:41:44.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:41:44.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:41:44.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973146.818449s, valid=True
2026-05-29T09:41:44.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:41:44.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:41:44.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:41:44.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:41:44.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:41:44.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:41:44.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:41:44.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:41:44.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:41:44.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:41:45.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:41:45.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:41:45.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:41:45.212 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:41:45.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:41:45.742 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:41:45.841 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:41:45.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:41:45.841 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:41:45.841 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:41:46.084 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:41:46.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:42:16.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:42:16.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:42:16.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:42:16.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:42:16.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:42:16.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:42:16.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-05-29T09:42:16.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:42:16.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-05-29T09:42:16.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:42:16.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:42:16.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:42:16.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-05-29T09:42:18.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-05-29T09:42:18.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:42:18.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:42:18.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:42:18.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:42:18.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:42:18.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:42:18.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:42:18.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:42:18.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:42:18.946 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:42:18.946 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:42:18.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:42:19.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:42:19.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:42:19.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:42:19.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:42:19.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:42:19.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:42:19.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:42:19.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:42:19.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:42:19.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:42:19.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:42:19.265 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:42:05
2026-05-29T09:42:19.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71507, datetime.datetime(2026, 5, 29, 9, 42, 5), datetime.datetime(2026, 5, 29, 9, 42, 4), 'salt', 9.66, 70.04, None, 14.79, 92.05, 5.19, 833.64, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:42:19.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:42:19.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:42:19.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:42:04, diff=15.272225s, valid=True
2026-05-29T09:42:19.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:42:19.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:42:19.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:42:12, diff=7.275169s, valid=True
2026-05-29T09:42:19.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:42:19.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:42:19.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:41:58, diff=21.282796s, valid=True
2026-05-29T09:42:19.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:42:19.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:42:19.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:42:19.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:42:19.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:42:19.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:42:19.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:42:12, diff=7.285963s, valid=True
2026-05-29T09:42:19.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:42:19.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:42:19.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:42:19.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973181.286641s, valid=True
2026-05-29T09:42:19.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:42:19.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:42:19.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:42:19.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:42:19.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:42:19.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:42:19.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:42:19.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:42:19.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:42:19.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:42:19.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:42:19.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:42:19.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:42:19.623 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:42:19.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:42:20.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:42:20.307 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:42:20.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:42:20.307 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:42:20.307 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:42:20.458 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:42:20.458 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:42:50.460 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:42:50.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:42:50.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:42:50.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:42:50.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:42:50.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:42:50.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-05-29T09:42:50.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:42:50.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-05-29T09:42:50.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:42:50.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:42:50.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:42:50.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-05-29T09:42:53.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-05-29T09:42:53.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:42:53.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:42:53.240 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:42:53.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:42:53.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:42:53.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:42:53.262 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:42:53.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:42:53.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:42:53.262 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:42:53.262 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:42:53.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:42:53.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:42:53.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:42:53.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:42:53.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:42:53.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:42:53.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:42:53.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:42:53.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:42:53.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:42:53.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:42:53.514 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:42:53.572 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:42:35
2026-05-29T09:42:53.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71508, datetime.datetime(2026, 5, 29, 9, 42, 35), datetime.datetime(2026, 5, 29, 9, 42, 34), 'salt', 9.62, 72.26, None, 13.73, 77.73, 4.73, 833.58, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:42:53.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:42:53.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:42:53.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:42:34, diff=19.579048s, valid=True
2026-05-29T09:42:53.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:42:53.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:42:53.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:43:12, diff=-18.418126s, valid=True
2026-05-29T09:42:53.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:42:53.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:42:53.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:42:30, diff=23.588512s, valid=True
2026-05-29T09:42:53.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:42:53.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:42:53.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:42:53.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:42:53.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:42:53.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:42:53.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:43:12, diff=-18.408468s, valid=True
2026-05-29T09:42:53.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:42:53.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:42:53.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:42:53.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973215.592223s, valid=True
2026-05-29T09:42:53.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:42:53.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:42:53.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:42:53.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:42:53.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:42:53.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:42:53.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:42:53.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:42:53.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:42:53.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:42:53.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:42:53.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:42:53.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:42:53.982 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:42:54.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:42:54.522 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:42:54.621 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:42:54.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:42:54.621 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:42:54.621 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:42:54.861 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:42:54.861 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:43:24.889 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:43:24.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:43:24.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:43:25.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:43:25.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:43:25.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:43:25.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-05-29T09:43:25.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:43:25.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-05-29T09:43:25.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:43:25.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:43:25.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:43:25.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-05-29T09:43:28.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T09:43:28.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:43:28.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:43:28.085 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:43:28.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:43:28.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:43:28.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:43:28.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:43:28.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:43:28.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:43:28.104 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:43:28.105 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:43:28.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:43:28.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:43:28.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:43:28.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:43:28.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:43:28.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:43:28.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:43:28.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:43:28.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:43:28.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:43:28.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:43:28.358 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:43:28.416 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:43:05
2026-05-29T09:43:28.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71509, datetime.datetime(2026, 5, 29, 9, 43, 5), datetime.datetime(2026, 5, 29, 9, 43, 5), 'salt', 9.52, 72.46, None, 14.22, 77.02, 4.69, 833.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:43:28.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:43:28.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:43:28.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:43:05, diff=23.422881s, valid=True
2026-05-29T09:43:28.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:43:28.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:43:28.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:43:12, diff=16.425747s, valid=True
2026-05-29T09:43:28.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:43:28.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:43:28.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:43:01, diff=27.432467s, valid=True
2026-05-29T09:43:28.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:43:28.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:43:28.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:43:28.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:43:28.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:43:28.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:43:28.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:43:12, diff=16.435481s, valid=True
2026-05-29T09:43:28.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:43:28.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:43:28.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:43:28.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973250.43614s, valid=True
2026-05-29T09:43:28.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:43:28.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:43:28.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:43:28.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:43:28.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:43:28.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:43:28.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:43:28.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:43:28.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:43:28.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:43:28.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:43:28.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:43:28.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:43:28.754 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:43:28.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:43:29.280 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:43:29.379 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:43:29.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:43:29.379 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:43:29.379 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:43:29.542 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:43:29.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:43:59.571 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:43:59.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:43:59.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:44:00.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:44:00.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:44:00.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:44:00.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-05-29T09:44:00.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:44:00.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T09:44:00.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:44:00.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:44:00.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:44:00.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-05-29T09:44:02.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-05-29T09:44:02.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:44:02.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:44:02.811 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:44:02.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:44:02.818 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:44:02.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:44:02.839 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:44:02.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:44:02.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:44:02.840 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:44:02.840 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:44:02.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:44:02.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:44:02.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:44:03.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:44:03.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:44:03.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:44:03.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:44:03.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:44:03.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:44:03.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:44:03.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:44:03.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:44:03.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:43:35
2026-05-29T09:44:03.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71510, datetime.datetime(2026, 5, 29, 9, 43, 35), datetime.datetime(2026, 5, 29, 9, 43, 35), 'salt', 9.32, 72.79, None, 13.76, 86.65, 4.62, 833.39, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:44:03.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:44:03.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:44:03.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:43:35, diff=28.165215s, valid=True
2026-05-29T09:44:03.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:44:03.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:44:03.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:44:12, diff=-8.831831s, valid=True
2026-05-29T09:44:03.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:44:03.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:44:03.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:43:33, diff=30.174892s, valid=True
2026-05-29T09:44:03.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:44:03.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:44:03.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:44:03.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:44:03.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:44:03.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:44:03.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:44:12, diff=-8.822052s, valid=True
2026-05-29T09:44:03.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:44:03.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:44:03.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:44:03.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973285.178602s, valid=True
2026-05-29T09:44:03.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:44:03.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:44:03.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:44:03.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:44:03.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:44:03.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:44:03.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:44:03.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:44:03.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:44:03.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:44:03.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:44:03.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:44:03.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:44:03.568 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:44:03.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:44:04.124 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:44:04.226 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:44:04.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:44:04.226 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:44:04.226 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:44:04.490 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:44:04.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:44:34.520 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:44:34.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:44:34.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:44:34.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:44:34.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:44:34.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:44:34.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-05-29T09:44:34.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:44:34.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T09:44:34.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:44:34.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:44:34.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:44:34.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-05-29T09:44:37.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-05-29T09:44:37.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:44:37.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:44:37.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:44:37.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:44:37.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:44:37.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:44:37.608 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:44:37.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:44:37.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:44:37.609 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:44:37.609 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:44:37.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:44:37.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:44:37.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:44:37.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:44:37.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:44:37.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:44:37.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:44:37.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:44:37.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:44:37.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:44:37.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:44:37.855 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:44:37.917 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:44:36
2026-05-29T09:44:37.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71512, datetime.datetime(2026, 5, 29, 9, 44, 36), datetime.datetime(2026, 5, 29, 9, 44, 35), 'salt', 9.29, 73.59, None, 12.99, 83.88, 4.47, 833.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:44:37.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:44:37.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:44:37.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:44:35, diff=2.923749s, valid=True
2026-05-29T09:44:37.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:44:37.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:44:37.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:45:12, diff=-34.073427s, valid=True
2026-05-29T09:44:37.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:44:37.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:44:37.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:44:35, diff=2.933172s, valid=True
2026-05-29T09:44:37.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:44:37.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:44:37.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:44:37.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:44:37.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:44:37.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:44:37.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:45:12, diff=-34.063799s, valid=True
2026-05-29T09:44:37.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:44:37.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:44:37.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:44:37.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973319.936873s, valid=True
2026-05-29T09:44:37.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:44:37.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:44:37.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:44:37.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:44:37.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:44:37.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:44:37.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:44:37.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:44:38.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:44:38.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:44:38.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:44:38.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:44:38.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:44:38.255 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:44:38.449 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:44:38.780 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:44:38.879 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:44:38.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:44:38.879 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:44:38.879 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:44:39.126 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:44:39.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:45:09.138 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:45:09.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:45:09.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:45:09.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:45:09.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:45:09.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:45:09.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T09:45:09.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:45: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-05-29T09:45:09.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:45:09.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:45:09.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:45:09.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-05-29T09:45:12.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-05-29T09:45:12.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:45:12.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:45:12.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:45:12.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:45:12.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:45:12.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:45:12.066 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:45:12.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:45:12.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:45:12.066 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:45:12.066 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:45:12.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:45:12.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:45:12.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:45:12.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:45:12.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:45:12.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:45:12.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:45:12.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:45:12.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:45:12.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:45:12.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:45:12.319 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:45:12.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:45:06
2026-05-29T09:45:12.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71513, datetime.datetime(2026, 5, 29, 9, 45, 6), datetime.datetime(2026, 5, 29, 9, 45, 6), 'salt', 9.56, 73.26, None, 13.76, 84.27, 4.55, 833.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:45:12.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:45:12.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:45:12.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:45:06, diff=6.38518s, valid=True
2026-05-29T09:45:12.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:45:12.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:45:12.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:45:12, diff=0.387942s, valid=True
2026-05-29T09:45:12.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:45:12.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:45:12.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:44:58, diff=14.394456s, valid=True
2026-05-29T09:45:12.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:45:12.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:45:12.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:45:12.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:45:12.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:45:12.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:45:12.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:45:12, diff=0.397441s, valid=True
2026-05-29T09:45:12.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:45:12.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:45:12.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:45:12.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973354.398137s, valid=True
2026-05-29T09:45:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:45:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:45:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:45:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:45:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:45:12.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:45:12.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:45:12.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:45:12.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:45:12.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:45:12.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:45:12.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:45:12.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:45:12.715 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:45:12.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:45:13.240 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:45:13.340 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:45:13.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:45:13.340 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:45:13.340 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:45:13.546 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:45:13.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:45:43.547 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:45:43.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:45:43.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:45:43.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:45:43.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:45:43.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:45:43.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-05-29T09:45:43.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:45:43.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-05-29T09:45:43.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:45:43.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:45:43.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:45:43.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-05-29T09:45:46.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-05-29T09:45:46.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:45:46.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:45:46.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:45:46.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:45:46.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:45:46.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:45:46.303 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:45:46.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:45:46.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:45:46.303 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:45:46.303 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:45:46.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:45:46.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:45:46.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:45:46.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:45:46.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:45:46.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:45:46.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:45:46.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:45:46.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:45:46.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:45:46.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:45:46.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:45:46.609 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:45:36
2026-05-29T09:45:46.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71514, datetime.datetime(2026, 5, 29, 9, 45, 36), datetime.datetime(2026, 5, 29, 9, 45, 36), 'salt', 9.42, 71.9, None, 13.34, 80.71, 4.8, 833.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:45:46.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:45:46.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:45:46.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:45:36, diff=10.61585s, valid=True
2026-05-29T09:45:46.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:45:46.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:45:46.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:46:12, diff=-25.381307s, valid=True
2026-05-29T09:45:46.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:45:46.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:45:46.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:45:28, diff=18.625297s, valid=True
2026-05-29T09:45:46.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:45:46.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:45:46.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:45:46.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:45:46.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:45:46.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:45:46.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:46:12, diff=-25.371668s, valid=True
2026-05-29T09:45:46.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:45:46.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:45:46.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:45:46.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973388.629s, valid=True
2026-05-29T09:45:46.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:45:46.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:45:46.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:45:46.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:45:46.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:45:46.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:45:46.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:45:46.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:45:46.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:45:46.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:45:46.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:45:46.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:45:46.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:45:46.946 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:45:47.144 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:45:47.477 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:45:47.578 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:45:47.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:45:47.578 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:45:47.578 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:45:47.782 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:45:47.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:46:17.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:46:17.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:46:17.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:46:18.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:46:18.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:46:18.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:46:18.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-05-29T09:46:18.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:46:18.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-05-29T09:46:18.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:46:18.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:46:18.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:46:18.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-05-29T09:46:20.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-05-29T09:46:20.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:46:20.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:46:20.884 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:46:20.884 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:46:20.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:46:20.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:46:20.905 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:46:20.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:46:20.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:46:20.905 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:46:20.905 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:46:20.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:46:20.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:46:20.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:46:21.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:46:21.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:46:21.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:46:21.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:46:21.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:46:21.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:46:21.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:46:21.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:46:21.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:46:21.238 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:46:06
2026-05-29T09:46:21.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71515, datetime.datetime(2026, 5, 29, 9, 46, 6), datetime.datetime(2026, 5, 29, 9, 46, 6), 'salt', 9.46, 72.49, None, 16.9, 71.39, 4.69, 833.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:46:21.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:46:21.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:46:21.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:46:06, diff=15.244652s, valid=True
2026-05-29T09:46:21.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:46:21.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:46:21.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:46:12, diff=9.247498s, valid=True
2026-05-29T09:46:21.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:46:21.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:46:21.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:45:59, diff=22.254197s, valid=True
2026-05-29T09:46:21.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:46:21.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:46:21.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:46:21.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:46:21.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:46:21.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:46:21.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:46:12, diff=9.257202s, valid=True
2026-05-29T09:46:21.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:46:21.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:46:21.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:46:21.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973423.257913s, valid=True
2026-05-29T09:46:21.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:46:21.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:46:21.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:46:21.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:46:21.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:46:21.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:46:21.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:46:21.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:46:21.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:46:21.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:46:21.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:46:21.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:46:21.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:46:21.572 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:46:21.770 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:46:22.105 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:46:22.204 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:46:22.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:46:22.205 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:46:22.205 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:46:24.041 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:46:24.042 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:46:54.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:46:54.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:46:54.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:46:54.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:46:54.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:46:54.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:46:54.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-05-29T09:46:54.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:46:54.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-05-29T09:46:54.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:46:54.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:46:54.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:46: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-05-29T09:46:57.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-05-29T09:46:57.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:46:57.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:46:57.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:46:57.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:46:57.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:46:57.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:46:57.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:46:57.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:46:57.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:46:57.065 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:46:57.065 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:46:57.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:46:57.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:46:57.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:46:57.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:46:57.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:46:57.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:46:57.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:46:57.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:46:57.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:46:57.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:46:57.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:46:57.326 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:46:57.387 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:46:37
2026-05-29T09:46:57.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71516, datetime.datetime(2026, 5, 29, 9, 46, 37), datetime.datetime(2026, 5, 29, 9, 46, 36), 'salt', 9.49, 71.27, None, 15.1, 87.72, 4.93, 833.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:46:57.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:46:57.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:46:57.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:46:36, diff=21.394074s, valid=True
2026-05-29T09:46:57.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:46:57.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:46:57.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:47:12, diff=-14.603015s, valid=True
2026-05-29T09:46:57.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:46:57.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:46:57.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:46:31, diff=26.40445s, valid=True
2026-05-29T09:46:57.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:46:57.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:46:57.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:46:57.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:46:57.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:46:57.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:46:57.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:47:12, diff=-14.592442s, valid=True
2026-05-29T09:46:57.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:46:57.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:46:57.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:46:57.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973459.408228s, valid=True
2026-05-29T09:46:57.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:46:57.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:46:57.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:46:57.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:46:57.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:46:57.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:46:57.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:46:57.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:46:57.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:46:57.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:46:57.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:46:57.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:46:57.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:46:57.747 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:46:57.954 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:46:58.370 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:46:58.474 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:46:58.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:46:58.475 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:46:58.475 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:46:58.734 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:46:58.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:47:28.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:47:28.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:47:28.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:47:29.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:47:29.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:47:29.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:47:29.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-05-29T09:47:29.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:47:29.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-05-29T09:47:29.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:47:29.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:47:29.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:47:29.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-05-29T09:47:31.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-05-29T09:47:31.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:47:31.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:47:31.922 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:47:31.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:47:31.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:47:31.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:47:31.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:47:31.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:47:31.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:47:31.945 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:47:31.945 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:47:31.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:47:32.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:47:32.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:47:32.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:47:32.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:47:32.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:47:32.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:47:32.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:47:32.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:47:32.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:47:32.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:47:32.214 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:47:32.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:47:07
2026-05-29T09:47:32.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71517, datetime.datetime(2026, 5, 29, 9, 47, 7), datetime.datetime(2026, 5, 29, 9, 47, 6), 'salt', 9.59, 70.07, None, 14.79, 76.39, 5.18, 833.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:47:32.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:47:32.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:47:32.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:47:06, diff=26.282247s, valid=True
2026-05-29T09:47:32.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:47:32.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:47:32.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:47:12, diff=20.285026s, valid=True
2026-05-29T09:47:32.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:47:32.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:47:32.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:47:02, diff=30.291658s, valid=True
2026-05-29T09:47:32.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:47:32.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:47:32.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:47:32.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:47:32.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:47:32.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:47:32.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:47:12, diff=20.294563s, valid=True
2026-05-29T09:47:32.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:47:32.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:47:32.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:47:32.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973494.295214s, valid=True
2026-05-29T09:47:32.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:47:32.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:47:32.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:47:32.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:47:32.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:47:32.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:47:32.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:47:32.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:47:32.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:47:32.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:47:32.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:47:32.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:47:32.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:47:32.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:47:32.808 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:47:33.139 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:47:33.238 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:47:33.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:47:33.238 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:47:33.238 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:47:33.395 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:47:33.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:48:03.420 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:48:03.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:48:03.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:48:03.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:48:03.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:48:04.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:48:04.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T09:48:04.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:48:04.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-05-29T09:48:04.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:48:04.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:48:04.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:48:04.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-05-29T09:48:06.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-05-29T09:48:06.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:48:06.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:48:06.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:48:06.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:48:06.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:48:06.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:48:06.819 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:48:06.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:48:06.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:48:06.820 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:48:06.820 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:48:06.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:48:06.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:48:06.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:48:06.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:48:06.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:48:07.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:48:07.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:48:07.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:48:07.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:48:07.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:48:07.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:48:07.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:48:07.146 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:47:37
2026-05-29T09:48:07.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71518, datetime.datetime(2026, 5, 29, 9, 47, 37), datetime.datetime(2026, 5, 29, 9, 47, 37), 'salt', 9.49, 69.44, None, 14.22, 80.21, 5.31, 833.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:48:07.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:48:07.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:48:07.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:47:37, diff=30.152651s, valid=True
2026-05-29T09:48:07.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:48:07.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:48:07.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:48:12, diff=-4.844462s, valid=True
2026-05-29T09:48:07.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:48:07.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:48:07.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:47:33, diff=34.16228s, valid=True
2026-05-29T09:48:07.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:48:07.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:48:07.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:48:07.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:48:07.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:48:07.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:48:07.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:48:12, diff=-4.834665s, valid=True
2026-05-29T09:48:07.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:48:07.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:48:07.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:48:07.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973529.166006s, valid=True
2026-05-29T09:48:07.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:48:07.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:48:07.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:48:07.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:48:07.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:48:07.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:48:07.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:48:07.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:48:07.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:48:07.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:48:07.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:48:07.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:48:07.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:48:07.484 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:48:07.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:48:08.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:48:08.188 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:48:08.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:48:08.188 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:48:08.188 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:48:08.439 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:48:08.439 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:48:38.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:48:38.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:48:38.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:48:38.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:48:38.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:48:39.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:48:39.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-05-29T09:48:39.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:48:39.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-05-29T09:48:39.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:48:39.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:48:39.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:48:39.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-05-29T09:48:41.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-05-29T09:48:41.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:48:41.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:48:41.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:48:41.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:48:41.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:48:41.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:48:41.757 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:48:41.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:48:41.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:48:41.757 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:48:41.757 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:48:41.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:48:41.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:48:41.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:48:41.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:48:41.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:48:42.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:48:42.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:48:42.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:48:42.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:48:42.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:48:42.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:48:42.042 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:48:42.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:48:37
2026-05-29T09:48:42.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71520, datetime.datetime(2026, 5, 29, 9, 48, 37), datetime.datetime(2026, 5, 29, 9, 48, 37), 'salt', 9.72, 67.75, None, 16.27, 81.76, 5.66, 833.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:48:42.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:48:42.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:48:42.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:48:37, diff=5.111507s, valid=True
2026-05-29T09:48:42.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:48:42.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:48:42.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:49:12, diff=-29.885601s, valid=True
2026-05-29T09:48:42.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:48:42.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:48:42.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:48:36, diff=6.121166s, valid=True
2026-05-29T09:48:42.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:48:42.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:48:42.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:48:42.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:48:42.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:48:42.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:48:42.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:49:12, diff=-29.875776s, valid=True
2026-05-29T09:48:42.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:48:42.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:48:42.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:48:42.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973564.124897s, valid=True
2026-05-29T09:48:42.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:48:42.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:48:42.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:48:42.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:48:42.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:48:42.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:48:42.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:48:42.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:48:42.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:48:42.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:48:42.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:48:42.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:48:42.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:48:42.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:48:42.642 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:48:42.978 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:48:43.079 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:48:43.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:48:43.080 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:48:43.080 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:48:43.234 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:48:43.234 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:49:13.264 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:49:13.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:49:13.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:49:13.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:49:13.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:49:13.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:49:13.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T09:49:13.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:49:13.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-05-29T09:49:13.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:49:13.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:49:13.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:49:13.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-05-29T09:49:16.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-05-29T09:49:16.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:49:16.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:49:16.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:49:16.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:49:16.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:49:16.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:49:16.403 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:49:16.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:49:16.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:49:16.404 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:49:16.404 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:49:16.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:49:16.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:49:16.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:49:16.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:49:16.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:49:16.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:49:16.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:49:16.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:49:16.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:49:16.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:49:16.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:49:16.663 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:49:16.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:49:08
2026-05-29T09:49:16.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71521, datetime.datetime(2026, 5, 29, 9, 49, 8), datetime.datetime(2026, 5, 29, 9, 49, 7), 'salt', 9.92, 68.25, None, 17.01, 70.42, 5.57, 833.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:49:16.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:49:16.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:49:16.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:49:07, diff=9.726967s, valid=True
2026-05-29T09:49:16.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:49:16.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:49:16.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:49:12, diff=4.729761s, valid=True
2026-05-29T09:49:16.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:49:16.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:49:16.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:49:00, diff=16.736337s, valid=True
2026-05-29T09:49:16.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:49:16.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:49:16.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:49:16.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:49:16.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:49:16.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:49:16.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:49:12, diff=4.739322s, valid=True
2026-05-29T09:49:16.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:49:16.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:49:16.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:49:16.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973598.739984s, valid=True
2026-05-29T09:49:16.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:49:16.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:49:16.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:49:16.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:49:16.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:49:16.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:49:16.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:49:16.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:49:16.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:49:16.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:49:16.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:49:17.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:49:17.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:49:17.139 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:49:17.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:49:17.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:49:17.771 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:49:17.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:49:17.772 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:49:17.772 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:49:18.003 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:49:18.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:49:48.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:49:48.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:49:48.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:49:48.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:49:48.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:49:48.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:49:48.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-05-29T09:49:48.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:49:48.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-05-29T09:49:48.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:49:48.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:49:48.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:49:48.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-05-29T09:49:51.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-05-29T09:49:51.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:49:51.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:49:51.074 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:49:51.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:49:51.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:49:51.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:49:51.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:49:51.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:49:51.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:49:51.095 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:49:51.095 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:49:51.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:49:51.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:49:51.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:49:51.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:49:51.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:49:51.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:49:51.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:49:51.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:49:51.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:49:51.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:49:51.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:49:51.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:49:51.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:49:38
2026-05-29T09:49:51.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71522, datetime.datetime(2026, 5, 29, 9, 49, 38), datetime.datetime(2026, 5, 29, 9, 49, 38), 'salt', 9.92, 67.18, None, 13.2, 65.38, 5.79, 833.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:49:51.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:49:51.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:49:51.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:49:38, diff=13.410235s, valid=True
2026-05-29T09:49:51.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:49:51.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:49:51.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:50:12, diff=-20.586911s, valid=True
2026-05-29T09:49:51.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:49:51.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:49:51.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:49:30, diff=21.422206s, valid=True
2026-05-29T09:49:51.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:49:51.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:49:51.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:49:51.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:49:51.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:49:51.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:49:51.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:50:12, diff=-20.57237s, valid=True
2026-05-29T09:49:51.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:49:51.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:49:51.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:49:51.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973633.428724s, valid=True
2026-05-29T09:49:51.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:49:51.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:49:51.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:49:51.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:49:51.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:49:51.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:49:51.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:49:51.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:49:51.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:49:51.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:49:51.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:49:51.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:49:51.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:49:51.762 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:49:51.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:49:52.310 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:49:52.413 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:49:52.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:49:52.413 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:49:52.413 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:49:52.481 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:49:52.481 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:50:22.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:50:22.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:50:22.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:50:23.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:50:23.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:50:23.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:50:23.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-05-29T09:50:23.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:50: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-05-29T09:50:23.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:50:23.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:50:23.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:50:23.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-05-29T09:50:25.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-05-29T09:50:25.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:50:25.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:50:25.926 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:50:25.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:50:25.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:50:25.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:50:25.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:50:25.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:50:25.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:50:25.950 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:50:25.950 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:50:25.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:50:26.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:50:26.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:50:26.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:50:26.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:50:26.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:50:26.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:50:26.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:50:26.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:50:26.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:50:26.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:50:26.200 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:50:26.258 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:50:08
2026-05-29T09:50:26.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71523, datetime.datetime(2026, 5, 29, 9, 50, 8), datetime.datetime(2026, 5, 29, 9, 50, 8), 'salt', 9.89, 67.75, None, 16.97, 75.45, 5.68, 833.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:50:26.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:50:26.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:50:26.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:50:08, diff=18.264052s, valid=True
2026-05-29T09:50:26.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:50:26.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:50:26.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:50:12, diff=14.266854s, valid=True
2026-05-29T09:50:26.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:50:26.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:50:26.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:50:00, diff=26.273416s, valid=True
2026-05-29T09:50:26.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:50:26.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:50:26.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:50:26.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:50:26.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:50:26.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:50:26.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:50:12, diff=14.276404s, valid=True
2026-05-29T09:50:26.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:50:26.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:50:26.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:50:26.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973668.277064s, valid=True
2026-05-29T09:50:26.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:50:26.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:50:26.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:50:26.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:50:26.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:50:26.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:50:26.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:50:26.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:50:26.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:50:26.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:50:26.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:50:26.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:50:26.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:50:26.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:50:26.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:50:27.201 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:50:27.302 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:50:27.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:50:27.302 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:50:27.302 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:50:27.552 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:50:27.552 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:50:57.566 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:50:57.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:50:57.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:50:57.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:50:57.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:50:58.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:50:58.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-05-29T09:50:58.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:50:58.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-05-29T09:50:58.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:50:58.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:50:58.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:50:58.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-05-29T09:51:01.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-05-29T09:51:01.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:51:01.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:51:01.100 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:51:01.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:51:01.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:51:01.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:51:01.120 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:51:01.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:51:01.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:51:01.121 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:51:01.121 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:51:01.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:51:01.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:51:01.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:51:01.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:51:01.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:51:01.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:51:01.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:51:01.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:51:01.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:51:01.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:51:01.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:51:01.423 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:51:01.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:50:38
2026-05-29T09:51:01.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71524, datetime.datetime(2026, 5, 29, 9, 50, 38), datetime.datetime(2026, 5, 29, 9, 50, 38), 'salt', 9.85, 67.81, None, 13.76, 70.75, 5.65, 833.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:51:01.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:51:01.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:51:01.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:50:38, diff=23.489225s, valid=True
2026-05-29T09:51:01.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:51:01.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:51:01.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:51:12, diff=-10.507874s, valid=True
2026-05-29T09:51:01.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:51:01.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:51:01.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:50:31, diff=30.49894s, valid=True
2026-05-29T09:51:01.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:51:01.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:51:01.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:51:01.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:51:01.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:51:01.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:51:01.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:51:12, diff=-10.498002s, valid=True
2026-05-29T09:51:01.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:51:01.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:51:01.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:51:01.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973703.50268s, valid=True
2026-05-29T09:51:01.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:51:01.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:51:01.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:51:01.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:51:01.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:51:01.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:51:01.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:51:01.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:51:01.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:51:01.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:51:01.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:51:01.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:51:01.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:51:01.823 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:51:02.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:51:02.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:51:02.494 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:51:02.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:51:02.494 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:51:02.494 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:51:02.733 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:51:02.733 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:51:32.763 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:51:32.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:51:32.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:51:33.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:51:33.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:51:33.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:51:33.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-05-29T09:51:33.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:51:33.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-05-29T09:51:33.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:51:33.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:51:33.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:51:33.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-05-29T09:51:35.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-05-29T09:51:35.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:51:36.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:51:36.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:51:36.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:51:36.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:51:36.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:51:36.022 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:51:36.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:51:36.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:51:36.023 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:51:36.023 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:51:36.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:51:36.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:51:36.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:51:36.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:51:36.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:51:36.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:51:36.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:51:36.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:51:36.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:51:36.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:51:36.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:51:36.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:51:36.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:51:08
2026-05-29T09:51:36.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71525, datetime.datetime(2026, 5, 29, 9, 51, 8), datetime.datetime(2026, 5, 29, 9, 51, 8), 'salt', 9.79, 68.74, None, 14.47, 70.78, 5.46, 833.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:51:36.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:51:36.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:51:36.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:51:08, diff=28.355539s, valid=True
2026-05-29T09:51:36.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:51:36.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:51:36.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:51:12, diff=24.358368s, valid=True
2026-05-29T09:51:36.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:51:36.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:51:36.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:51:03, diff=33.36494s, valid=True
2026-05-29T09:51:36.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:51:36.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:51:36.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:51:36.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:51:36.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:51:36.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:51:36.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:51:12, diff=24.369182s, valid=True
2026-05-29T09:51:36.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:51:36.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:51:36.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:51:36.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973738.369872s, valid=True
2026-05-29T09:51:36.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:51:36.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:51:36.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:51:36.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:51:36.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:51:36.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:51:36.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:51:36.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:51:36.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:51:36.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:51:36.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:51:36.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:51:36.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:51:36.699 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:51:36.921 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:51:37.289 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:51:37.389 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:51:37.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:51:37.389 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:51:37.390 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:51:37.551 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:51:37.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:52:07.581 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:52:07.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:52:07.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:52:07.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:52:07.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:52:07.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:52:07.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-05-29T09:52:07.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:52:07.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-05-29T09:52:07.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:52:07.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:52:07.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:52:07.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-05-29T09:52:10.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-05-29T09:52:10.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:52:10.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:52:10.234 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:52:10.234 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:52:10.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:52:10.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:52:10.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:52:10.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:52:10.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:52:10.255 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:52:10.255 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:52:10.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:52:10.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:52:10.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:52:10.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:52:10.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:52:10.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:52:10.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:52:10.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:52:10.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:52:10.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:52:10.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:52:10.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:52:10.598 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:52:09
2026-05-29T09:52:10.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71527, datetime.datetime(2026, 5, 29, 9, 52, 9), datetime.datetime(2026, 5, 29, 9, 52, 9), 'salt', 9.75, 70.37, None, 12.63, 79.41, 5.12, 833.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:52:10.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:52:10.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:52:10.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:52:09, diff=1.604818s, valid=True
2026-05-29T09:52:10.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:52:10.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:52:10.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:52:12, diff=-1.392269s, valid=True
2026-05-29T09:52:10.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:52:10.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:52:10.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:52:06, diff=4.614425s, valid=True
2026-05-29T09:52:10.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:52:10.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:52:10.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:52:10.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:52:10.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:52:10.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:52:10.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:52:12, diff=-1.382531s, valid=True
2026-05-29T09:52:10.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:52:10.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:52:10.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:52:10.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973772.618136s, valid=True
2026-05-29T09:52:10.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:52:10.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:52:10.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:52:10.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:52:10.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:52:10.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:52:10.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:52:10.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:52:10.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:52:10.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:52:10.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:52:10.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:52:10.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:52:10.935 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:52:11.139 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:52:11.478 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:52:11.643 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:52:11.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:52:11.643 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:52:11.643 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:52:11.712 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:52:11.712 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:52:41.742 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:52:41.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:52:41.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:52:42.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:52:42.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:52:43.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:52:43.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-05-29T09:52:43.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:52:43.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-05-29T09:52:44.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:52:44.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:52:44.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:52:44.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-05-29T09:52:46.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-05-29T09:52:46.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:52:46.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:52:46.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:52:46.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:52:46.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:52:46.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:52:46.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:52:46.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:52:46.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:52:46.927 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:52:46.928 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:52:46.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:52:47.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:52:47.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:52:47.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:52:47.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:52:47.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:52:47.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:52:47.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:52:47.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:52:47.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:52:47.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:52:47.181 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:52:47.239 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:52:39
2026-05-29T09:52:47.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71528, datetime.datetime(2026, 5, 29, 9, 52, 39), datetime.datetime(2026, 5, 29, 9, 52, 39), 'salt', 9.65, 70.1, None, 11.26, 81.1, 5.17, 833.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:52:47.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:52:47.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:52:47.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:52:39, diff=8.245889s, valid=True
2026-05-29T09:52:47.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:52:47.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:52:47.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:53:12, diff=-24.751256s, valid=True
2026-05-29T09:52:47.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:52:47.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:52:47.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:52:37, diff=10.255287s, valid=True
2026-05-29T09:52:47.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:52:47.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:52:47.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:52:47.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:52:47.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:52:47.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:52:47.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:53:12, diff=-24.741671s, valid=True
2026-05-29T09:52:47.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:52:47.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:52:47.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:52:47.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973809.25899s, valid=True
2026-05-29T09:52:47.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:52:47.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:52:47.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:52:47.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:52:47.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:52:47.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:52:47.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:52:47.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:52:47.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:52:47.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:52:47.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:52:47.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:52:47.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:52:47.576 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:52:47.782 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:52:48.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:52:48.226 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:52:48.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:52:48.227 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:52:48.227 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:52:49.996 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:52:49.996 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:53:20.026 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:53:20.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:53:20.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:53:20.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:53:20.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:53:20.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:53:20.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-05-29T09:53:20.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:53:20.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-05-29T09:53:20.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:53:20.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:53:20.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:53:20.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-05-29T09:53:23.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-05-29T09:53:23.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:53:23.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:53:23.442 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:53:23.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:53:23.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:53:23.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:53:23.463 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:53:23.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:53:23.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:53:23.464 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:53:23.464 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:53:23.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:53:23.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:53:23.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:53:23.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:53:23.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:53:23.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:53:23.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:53:23.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:53:23.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:53:23.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:53:23.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:53:23.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:53:23.778 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:53:09
2026-05-29T09:53:23.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71529, datetime.datetime(2026, 5, 29, 9, 53, 9), datetime.datetime(2026, 5, 29, 9, 53, 9), 'salt', 9.79, 71.16, None, 14.64, 70.42, 4.97, 833.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:53:23.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:53:23.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:53:23.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:53:09, diff=14.785019s, valid=True
2026-05-29T09:53:23.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:53:23.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:53:23.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:53:12, diff=11.787845s, valid=True
2026-05-29T09:53:23.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:53:23.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:53:23.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:53:09, diff=14.794369s, valid=True
2026-05-29T09:53:23.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:53:23.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:53:23.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:53:23.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:53:23.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:53:23.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:53:23.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:53:12, diff=11.797385s, valid=True
2026-05-29T09:53:23.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:53:23.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:53:23.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:53:23.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973845.798055s, valid=True
2026-05-29T09:53:23.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:53:23.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:53:23.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:53:23.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:53:23.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:53:23.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:53:23.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:53:23.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:53:23.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:53:23.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:53:23.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:53:24.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:53:24.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:53:24.123 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:53:24.332 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:53:24.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:53:24.853 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:53:24.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:53:24.853 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:53:24.854 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:53:24.922 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:53:24.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:53:54.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:53:54.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:53:54.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:53:55.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:53:55.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:53:55.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:53:55.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-05-29T09:53:55.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:53:55.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-05-29T09:53:55.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:53:55.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:53:55.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:53:55.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T09:53:57.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-05-29T09:53:57.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:53:57.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:53:57.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:53:57.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:53:57.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:53:57.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:53:57.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:53:57.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:53:57.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:53:57.817 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:53:57.817 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:53:57.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:53:57.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:53:57.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:53:57.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:53:57.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:53:58.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:53:58.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:53:58.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:53:58.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:53:58.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:53:58.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:53:58.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:53:58.124 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:53:40
2026-05-29T09:53:58.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71530, datetime.datetime(2026, 5, 29, 9, 53, 40), datetime.datetime(2026, 5, 29, 9, 53, 39), 'salt', 9.79, 70.73, None, 12.1, 73.33, 5.06, 833.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:53:58.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:53:58.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:53:58.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:53:39, diff=19.130666s, valid=True
2026-05-29T09:53:58.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:53:58.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:53:58.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:54:12, diff=-13.866452s, valid=True
2026-05-29T09:53:58.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:53:58.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:53:58.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:53:32, diff=26.140065s, valid=True
2026-05-29T09:53:58.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:53:58.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:53:58.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:53:58.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:53:58.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:53:58.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:53:58.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:54:12, diff=-13.856869s, valid=True
2026-05-29T09:53:58.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:53:58.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:53:58.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:53:58.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973880.143807s, valid=True
2026-05-29T09:53:58.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:53:58.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:53:58.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:53:58.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:53:58.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:53:58.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:53:58.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:53:58.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:53:58.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:53:58.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:53:58.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:53:58.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:53:58.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:53:58.472 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:53:58.678 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:53:59.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:53:59.117 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:53:59.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:53:59.118 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:53:59.118 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:53:59.267 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:53:59.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:54:29.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:54:29.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:54:29.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:54:29.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:54:29.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:54:30.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:54:30.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-05-29T09:54:30.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:54:30.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T09:54:30.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:54:30.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:54:30.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:54:30.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-05-29T09:54:32.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-05-29T09:54:32.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:54:32.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:54:32.559 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:54:32.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:54:32.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:54:32.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:54:32.579 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:54:32.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:54:32.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:54:32.579 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:54:32.579 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:54:32.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:54:32.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:54:32.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:54:32.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:54:32.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:54:32.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:54:32.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:54:32.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:54:32.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:54:32.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:54:32.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:54:32.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:54:32.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:54:10
2026-05-29T09:54:32.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71531, datetime.datetime(2026, 5, 29, 9, 54, 10), datetime.datetime(2026, 5, 29, 9, 54, 9), 'salt', 9.78, 71.83, None, 12.35, 77.63, 4.83, 833.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:54:32.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:54:32.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:54:32.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:54:09, diff=23.897566s, valid=True
2026-05-29T09:54:32.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:54:32.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:54:32.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:54:12, diff=20.900418s, valid=True
2026-05-29T09:54:32.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:54:32.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:54:32.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:54:02, diff=30.907016s, valid=True
2026-05-29T09:54:32.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:54:32.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:54:32.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:54:32.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:54:32.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:54:32.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:54:32.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:54:12, diff=20.910027s, valid=True
2026-05-29T09:54:32.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:54:32.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:54:32.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:54:32.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973914.910695s, valid=True
2026-05-29T09:54:32.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:54:32.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:54:32.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:54:32.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:54:32.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:54:32.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:54:32.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:54:32.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:54:32.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:54:33.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:54:33.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:54:33.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:54:33.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:54:33.305 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:54:33.515 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:54:33.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:54:33.965 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:54:33.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:54:33.965 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:54:33.965 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:54:34.219 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:54:34.219 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:55:04.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:55:04.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:55:04.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:55:04.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:55:04.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:55:04.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:55:04.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-05-29T09:55:04.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:55: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-05-29T09:55:04.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:55:04.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:55:04.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:55: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-05-29T09:55:07.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-05-29T09:55:07.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:55:07.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:55:07.217 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:55:07.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:55:07.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:55:07.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:55:07.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:55:07.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:55:07.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:55:07.239 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:55:07.239 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:55:07.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:55:07.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:55:07.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:55:07.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:55:07.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:55:07.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:55:07.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:55:07.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:55:07.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:55:07.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:55:07.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:55:07.496 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:55:07.569 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:54:40
2026-05-29T09:55:07.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71532, datetime.datetime(2026, 5, 29, 9, 54, 40), datetime.datetime(2026, 5, 29, 9, 54, 40), 'salt', 9.85, 72.03, None, 14.19, 76.81, 4.79, 833.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:55:07.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:55:07.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:55:07.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:54:40, diff=27.57567s, valid=True
2026-05-29T09:55:07.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:55:07.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:55:07.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:55:12, diff=-4.421466s, valid=True
2026-05-29T09:55:07.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:55:07.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:55:07.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:54:33, diff=34.585149s, valid=True
2026-05-29T09:55:07.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:55:07.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:55:07.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:55:07.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:55:07.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:55:07.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:55:07.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:55:12, diff=-4.411788s, valid=True
2026-05-29T09:55:07.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:55:07.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:55:07.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:55:07.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973949.588883s, valid=True
2026-05-29T09:55:07.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:55:07.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:55:07.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:55:07.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:55:07.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:55:07.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:55:07.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:55:07.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:55:07.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:55:07.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:55:07.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:55:07.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:55:07.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:55:07.906 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:55:08.113 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:55:08.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:55:08.556 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:55:08.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:55:08.556 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:55:08.556 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:55:08.782 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:55:08.783 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:55:38.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:55:38.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:55:38.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:55:39.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:55:39.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:55:39.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:55:39.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-05-29T09:55:39.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:55:39.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-05-29T09:55:39.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:55:39.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:55:39.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:55:39.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T09:55:41.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-05-29T09:55:41.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:55:41.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:55:41.867 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:55:41.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:55:41.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:55:41.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:55:41.888 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:55:41.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:55:41.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:55:41.889 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:55:41.889 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:55:41.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:55:42.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:55:42.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:55:42.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:55:42.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:55:42.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:55:42.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:55:42.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:55:42.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:55:42.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:55:42.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:55:42.173 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:55:42.233 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:55:41
2026-05-29T09:55:42.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71534, datetime.datetime(2026, 5, 29, 9, 55, 41), datetime.datetime(2026, 5, 29, 9, 55, 40), 'salt', 9.82, 69.94, None, 12.1, 87.46, 5.22, 833.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:55:42.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:55:42.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:55:42.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:55:40, diff=2.239967s, valid=True
2026-05-29T09:55:42.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:55:42.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:55:42.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:56:12, diff=-29.757201s, valid=True
2026-05-29T09:55:42.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:55:42.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:55:42.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:55:33, diff=9.249425s, valid=True
2026-05-29T09:55:42.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:55:42.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:55:42.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:55:42.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:55:42.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:55:42.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:55:42.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:56:12, diff=-29.747525s, valid=True
2026-05-29T09:55:42.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:55:42.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:55:42.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:55:42.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=973984.253139s, valid=True
2026-05-29T09:55:42.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:55:42.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:55:42.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:55:42.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:55:42.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:55:42.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:55:42.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:55:42.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:55:42.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:55:42.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:55:42.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:55:42.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:55:42.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:55:42.660 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:55:42.877 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:55:43.237 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:55:43.334 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:55:43.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:55:43.334 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:55:43.334 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:55:43.579 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:55:43.579 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:56:13.609 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:56:13.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:56:13.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:56:13.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:56:13.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:56:14.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:56:14.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-05-29T09:56:14.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:56:14.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-05-29T09:56:14.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:56:14.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:56:14.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:56:14.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-05-29T09:56:16.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-05-29T09:56:16.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:56:16.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:56:16.469 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:56:16.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:56:16.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:56:16.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:56:16.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:56:16.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:56:16.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:56:16.491 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:56:16.491 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:56:16.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:56:16.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:56:16.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:56:16.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:56:16.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:56:16.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:56:16.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:56:16.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:56:16.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:56:16.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:56:16.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:56:16.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:56:16.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:56:12
2026-05-29T09:56:16.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71535, datetime.datetime(2026, 5, 29, 9, 56, 12), datetime.datetime(2026, 5, 29, 9, 56, 11), 'salt', 9.75, 70.7, None, 9.71, 72.7, 5.06, 833.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:56:16.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:56:16.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:56:16.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:56:11, diff=5.832452s, valid=True
2026-05-29T09:56:16.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:56:16.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:56:16.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:56:12, diff=4.835319s, valid=True
2026-05-29T09:56:16.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:56:16.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:56:16.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:56:04, diff=12.841988s, valid=True
2026-05-29T09:56:16.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:56:16.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:56:16.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:56:16.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:56:16.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:56:16.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:56:16.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:56:12, diff=4.845031s, valid=True
2026-05-29T09:56:16.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:56:16.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:56:16.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:56:16.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974018.845719s, valid=True
2026-05-29T09:56:16.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:56:16.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:56:16.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:56:16.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:56:16.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:56:16.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:56:16.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:56:16.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:56:16.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:56:16.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:56:17.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:56:17.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:56:17.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:56:17.162 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:56:17.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:56:17.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:56:17.804 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:56:17.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:56:17.804 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:56:17.804 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:56:17.954 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:56:17.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:56:47.960 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:56:47.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:56:47.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:56:48.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:56:48.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:56:48.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:56:48.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-05-29T09:56:48.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:56:48.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-05-29T09:56:48.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:56:48.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:56:48.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:56:48.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-05-29T09:56:50.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-05-29T09:56:50.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:56:50.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:56:50.869 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:56:50.869 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:56:50.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:56:50.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:56:50.890 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:56:50.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:56:50.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:56:50.890 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:56:50.890 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:56:50.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:56:50.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:56:50.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:56:51.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:56:51.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:56:51.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:56:51.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:56:51.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:56:51.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:56:51.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:56:51.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:56:51.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:56:51.224 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:56:42
2026-05-29T09:56:51.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71536, datetime.datetime(2026, 5, 29, 9, 56, 42), datetime.datetime(2026, 5, 29, 9, 56, 42), 'salt', 9.68, 70.9, None, 11.08, 73.92, 5.01, 833.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:56:51.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:56:51.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:56:51.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:56:42, diff=9.231051s, valid=True
2026-05-29T09:56:51.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:56:51.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:56:51.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:57:12, diff=-20.76614s, valid=True
2026-05-29T09:56:51.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:56:51.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:56:51.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:56:36, diff=15.240357s, valid=True
2026-05-29T09:56:51.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:56:51.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:56:51.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:56:51.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:56:51.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:56:51.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:56:51.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:57:12, diff=-20.756653s, valid=True
2026-05-29T09:56:51.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:56:51.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:56:51.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:56:51.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974053.244007s, valid=True
2026-05-29T09:56:51.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:56:51.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:56:51.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:56:51.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:56:51.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:56:51.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:56:51.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:56:51.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:56:51.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:56:51.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:56:51.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:56:51.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:56:51.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:56:51.648 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:56:51.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:56:52.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:56:52.309 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:56:52.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:56:52.309 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:56:52.309 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:56:52.377 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:56:52.377 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:57:22.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:57:22.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:57:22.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:57:22.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:57:22.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:57:22.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:57:22.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T09:57:22.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:57:22.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-05-29T09:57:22.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:57:22.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:57:22.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:57:22.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-05-29T09:57:25.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-05-29T09:57:25.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:57:25.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:57:25.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:57:25.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:57:25.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:57:25.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:57:25.341 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:57:25.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:57:25.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:57:25.341 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:57:25.341 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:57:25.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:57:25.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:57:25.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:57:25.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:57:25.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:57:25.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:57:25.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:57:25.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:57:25.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:57:25.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:57:25.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:57:25.628 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:57:25.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:57:12
2026-05-29T09:57:25.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71537, datetime.datetime(2026, 5, 29, 9, 57, 12), datetime.datetime(2026, 5, 29, 9, 57, 12), 'salt', 9.98, 71.96, None, 13.34, 88.0, 4.81, 833.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:57:25.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:57:25.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:57:25.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:57:12, diff=13.70128s, valid=True
2026-05-29T09:57:25.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:57:25.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:57:25.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:57:12, diff=13.704176s, valid=True
2026-05-29T09:57:25.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:57:25.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:57:25.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:57:07, diff=18.710943s, valid=True
2026-05-29T09:57:25.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:57:25.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:57:25.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:57:25.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:57:25.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:57:25.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:57:25.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:57:12, diff=13.714s, valid=True
2026-05-29T09:57:25.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:57:25.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:57:25.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:57:25.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974087.714668s, valid=True
2026-05-29T09:57:25.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:57:25.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:57:25.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:57:25.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:57:25.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:57:25.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:57:25.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:57:25.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:57:25.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:57:25.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:57:25.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:57:25.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:57:26.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:57:26.048 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:57:26.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:57:26.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:57:26.705 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:57:26.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:57:26.706 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:57:26.706 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:57:26.964 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:57:26.965 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:57:56.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:57:56.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:57:56.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:57:57.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:57:57.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:57:57.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:57:57.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-05-29T09:57:57.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:57:57.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-05-29T09:57:57.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:57:57.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:57:57.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:57:57.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-05-29T09:58:00.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-05-29T09:58:00.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:58:00.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:58:00.631 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:58:00.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:58:00.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:58:00.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:58:00.652 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:58:00.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:58:00.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:58:00.653 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:58:00.653 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:58:00.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:58:00.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T09:58:00.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:58:00.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:58:00.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:58:00.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:58:00.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:58:00.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T09:58:00.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:58:00.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:58:00.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:58:00.914 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:58:00.984 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:57:44
2026-05-29T09:58:00.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71538, datetime.datetime(2026, 5, 29, 9, 57, 44), datetime.datetime(2026, 5, 29, 9, 57, 42), 'salt', 9.95, 72.02, None, 11.86, 86.33, 4.8, 833.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:58:00.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:58:00.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:58:00.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:57:42, diff=18.990208s, valid=True
2026-05-29T09:58:00.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:58:00.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:58:00.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:58:12, diff=-11.00695s, valid=True
2026-05-29T09:58:00.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:58:00.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:58:00.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:57:38, diff=22.999733s, valid=True
2026-05-29T09:58:00.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:58:00.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:58:00.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:58:01.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:58:01.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:58:01.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T09:58:01.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:58:12, diff=-10.997231s, valid=True
2026-05-29T09:58:01.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:58:01.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:58:01.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:58:01.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974123.003411s, valid=True
2026-05-29T09:58:01.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:58:01.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:58:01.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:58:01.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:58:01.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:58:01.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:58:01.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:58:01.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:58:01.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:58:01.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:58:01.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:58:01.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:58:01.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:58:01.378 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:58:01.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:58:01.940 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:58:02.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:58:02.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:58:02.042 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:58:02.042 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:58:02.193 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:58:02.194 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:58:32.207 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:58:32.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:58:32.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:58:32.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:58:32.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:58:32.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:58:32.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-05-29T09:58:32.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:58:32.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-05-29T09:58:32.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:58:32.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:58:32.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:58:32.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-05-29T09:58:35.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-05-29T09:58:35.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:58:35.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:58:35.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:58:35.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:58:35.357 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:58:35.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:58:35.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:58:35.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:58:35.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:58:35.370 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:58:35.370 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:58:35.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:58:35.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:58:35.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:58:35.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:58:35.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:58:35.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:58:35.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:58:35.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:58:35.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:58:35.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:58:35.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:58:35.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:58:35.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:58:14
2026-05-29T09:58:35.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71539, datetime.datetime(2026, 5, 29, 9, 58, 14), datetime.datetime(2026, 5, 29, 9, 58, 14), 'salt', 9.88, 72.66, None, 12.21, 77.32, 4.67, 833.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:58:35.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:58:35.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:58:35.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:58:14, diff=21.68265s, valid=True
2026-05-29T09:58:35.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:58:35.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:58:35.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:58:12, diff=23.685482s, valid=True
2026-05-29T09:58:35.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:58:35.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:58:35.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:58:10, diff=25.692148s, valid=True
2026-05-29T09:58:35.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:58:35.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:58:35.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:58:35.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:58:35.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:58:35.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:58:35.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:58:12, diff=23.695165s, valid=True
2026-05-29T09:58:35.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:58:35.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:58:35.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:58:35.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974157.695845s, valid=True
2026-05-29T09:58:35.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:58:35.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:58:35.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:58:35.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:58:35.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:58:35.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:58:35.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:58:35.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:58:35.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:58:35.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:58:35.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:58:35.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:58:35.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:58:36.013 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:58:36.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:58:36.559 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:58:36.722 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:58:36.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:58: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-05-29T09:58: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-05-29T09:58:36.912 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:58:36.912 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:59:06.931 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:59:06.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:59:06.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:59:07.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:59:07.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:59:07.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:59:07.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-05-29T09:59:07.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:59:07.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-05-29T09:59:07.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:59:07.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:59:07.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:59:07.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-05-29T09:59:10.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T09:59:10.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:59:10.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:59:10.120 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:59:10.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:59:10.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:59:10.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:59:10.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:59:10.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:59:10.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:59:10.141 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:59:10.141 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:59:10.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:59:10.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:59:10.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:59:10.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T09:59:10.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:59:10.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:59:10.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:59:10.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:59:10.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:59:10.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:59:10.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:59:10.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:59:10.449 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:58:44
2026-05-29T09:59:10.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71540, datetime.datetime(2026, 5, 29, 9, 58, 44), datetime.datetime(2026, 5, 29, 9, 58, 44), 'salt', 9.95, 72.19, None, 12.81, 79.53, 4.77, 833.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:59:10.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:59:10.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:59:10.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:58:44, diff=26.456059s, valid=True
2026-05-29T09:59:10.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:59:10.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:59:10.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:59:12, diff=-1.54106s, valid=True
2026-05-29T09:59:10.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:59:10.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T09:59:10.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:58:41, diff=29.465645s, valid=True
2026-05-29T09:59:10.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:59:10.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:59:10.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:59:10.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:59:10.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:59:10.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:59:10.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:59:12, diff=-1.531367s, valid=True
2026-05-29T09:59:10.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:59:10.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:59:10.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:59:10.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974192.469289s, valid=True
2026-05-29T09:59:10.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:59:10.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:59:10.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:59:10.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:59:10.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:59:10.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:59:10.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:59:10.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:59:10.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:59:10.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:59:10.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:59:10.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:59:10.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:59:10.788 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:59:10.999 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:59:11.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:59:11.437 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:59:11.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:59:11.437 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:59:11.437 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:59:11.684 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:59:11.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T09:59:41.703 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T09:59:41.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T09:59:41.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T09:59:42.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T09:59:42.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T09:59:42.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T09:59:42.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-05-29T09:59:42.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T09:59:42.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-05-29T09:59:42.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T09:59:42.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T09:59:42.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T09:59:42.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-05-29T09:59: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-05-29T09:59:44.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T09:59:44.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T09:59:44.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T09:59:44.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T09:59:44.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T09:59:44.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T09:59:44.694 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T09:59:44.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T09:59:44.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T09:59:44.695 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T09:59:44.695 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T09:59:44.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T09:59:44.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T09:59:44.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T09:59:44.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T09:59:44.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:59:44.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:59:44.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:59:44.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T09:59:44.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:59:44.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:59:44.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:59:44.946 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:59:45.003 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 09:59:14
2026-05-29T09:59:45.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71541, datetime.datetime(2026, 5, 29, 9, 59, 14), datetime.datetime(2026, 5, 29, 9, 59, 14), 'salt', 10.01, 71.33, None, 12.56, 79.62, 4.94, 833.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:59:45.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:59:45.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T09:59:45.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:59:14, diff=31.00935s, valid=True
2026-05-29T09:59:45.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:59:45.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:59:45.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:59:12, diff=33.012218s, valid=True
2026-05-29T09:59:45.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:59:45.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:59:45.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:59:44, diff=1.018787s, valid=True
2026-05-29T09:59:45.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:59:45.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:59:45.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:59:45.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:59:45.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:59:45.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T09:59:45.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:59:12, diff=33.021769s, valid=True
2026-05-29T09:59:45.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:59:45.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:59:45.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:59:45.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974227.022414s, valid=True
2026-05-29T09:59:45.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:59:45.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:59:45.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:59:45.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:59:45.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:59:45.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:59:45.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:59:45.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:59:45.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:59:45.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:59:45.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:59:45.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:59:45.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:59:45.340 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:59:45.640 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:59:45.978 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:59:46.077 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:59:46.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:59:46.078 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T09:59:46.078 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T09:59:46.332 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:59:46.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:00:16.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:00:16.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:00:16.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:00:16.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:00:16.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:00:16.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:00:16.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-05-29T10:00:17.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:00:17.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-05-29T10:00:17.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:00:17.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:00:17.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:00:17.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-05-29T10:00:19.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-05-29T10:00:19.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:00:19.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:00:19.394 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:00:19.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:00:19.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:00:19.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:00:19.416 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:00:19.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:00:19.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:00:19.416 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:00:19.416 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:00:19.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:00:19.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:00:19.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:00:19.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:00:19.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:00:19.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:00:19.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:00:19.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:00:19.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:00:19.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:00:19.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:00:19.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:00:19.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:00:15
2026-05-29T10:00:19.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71543, datetime.datetime(2026, 5, 29, 10, 0, 15), datetime.datetime(2026, 5, 29, 10, 0, 15), 'salt', 10.08, 68.27, None, 12.1, 76.55, 5.57, 833.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:00:19.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:00:19.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:00:19.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:00:15, diff=4.740237s, valid=True
2026-05-29T10:00:19.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:00:19.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:00:19.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:00:12, diff=7.743129s, valid=True
2026-05-29T10:00:19.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:00:19.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:00:19.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:00:06, diff=13.749734s, valid=True
2026-05-29T10:00:19.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:00:19.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:00:19.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:00:19.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:00:19.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:00:19.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:00:19.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:00:12, diff=7.752769s, valid=True
2026-05-29T10:00:19.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:00:19.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:00:19.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:00:19.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974261.753416s, valid=True
2026-05-29T10:00:19.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:00:19.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:00:19.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:00:19.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:00:19.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:00:19.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:00:19.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:00:19.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:00:19.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:00:19.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:00:19.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:00:19.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:00:20.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:00:20.095 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:00:20.309 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:00:20.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:00:20.758 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:00:20.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:00:20.758 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:00:20.759 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:00:20.826 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:00:20.826 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:00:50.856 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:00:50.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:00:50.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:00:51.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:00:51.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:00:51.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:00:51.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-05-29T10:00:51.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:00:51.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-05-29T10:00:51.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:00:51.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:00:51.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:00:51.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-05-29T10:00: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-05-29T10:00:53.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:00:53.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:00:53.919 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:00:53.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:00:53.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:00:53.941 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:00:53.941 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:00:53.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:00:53.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:00:53.942 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:00:53.942 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:00:53.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:00:54.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:00:54.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:00:54.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:00:54.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:00:54.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:00:54.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:00:54.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:00:54.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:00:54.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:00:54.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:00:54.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:00:54.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:00:45
2026-05-29T10:00:54.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71544, datetime.datetime(2026, 5, 29, 10, 0, 45), datetime.datetime(2026, 5, 29, 10, 0, 45), 'salt', 9.98, 68.57, None, 14.72, 78.75, 5.5, 833.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:00:54.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:00:54.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:00:54.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:00:45, diff=9.255651s, valid=True
2026-05-29T10:00:54.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:00:54.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:00:54.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:01:12, diff=-17.741524s, valid=True
2026-05-29T10:00:54.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:00:54.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:00:54.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:00:36, diff=18.26522s, valid=True
2026-05-29T10:00:54.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:00:54.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:00:54.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:00:54.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:00:54.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:00:54.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:00:54.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:01:12, diff=-17.731725s, valid=True
2026-05-29T10:00:54.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:00:54.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:00:54.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:00:54.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974296.268939s, valid=True
2026-05-29T10:00:54.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:00:54.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:00:54.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:00:54.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:00:54.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:00:54.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:00:54.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:00:54.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:00:54.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:00:54.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:00:54.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:00:54.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:00:54.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:00:54.667 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:00:54.884 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:00:55.233 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:00:55.336 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:00:55.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:00: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-05-29T10:00: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-05-29T10:00:55.578 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:00:55.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:01:25.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:01:25.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:01:25.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:01:25.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:01:25.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:01:26.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:01:26.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-05-29T10:01:26.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:01:26.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-05-29T10:01:26.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:01:26.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:01:26.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:01:26.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-05-29T10:01: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-05-29T10:01:28.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:01:28.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:01:28.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:01:28.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:01:28.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:01:28.861 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:01:28.861 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:01:28.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:01:28.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:01:28.861 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:01:28.861 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:01:28.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:01:28.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:01:28.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:01:29.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:01:29.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:01:29.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:01:29.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:01:29.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:01:29.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:01:29.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:01:29.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:01:29.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:01:29.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:01:15
2026-05-29T10:01:29.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71545, datetime.datetime(2026, 5, 29, 10, 1, 15), datetime.datetime(2026, 5, 29, 10, 1, 15), 'salt', 10.15, 68.57, None, 14.01, 77.32, 5.51, 833.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:01:29.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:01:29.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:01:29.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:01:15, diff=14.175881s, valid=True
2026-05-29T10:01:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:01:29.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:01:29.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:01:12, diff=17.178766s, valid=True
2026-05-29T10:01:29.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:01:29.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:01:29.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:01:08, diff=21.185391s, valid=True
2026-05-29T10:01:29.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:01:29.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:01:29.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:01:29.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:01:29.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:01:29.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:01:29.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:01:12, diff=17.188416s, valid=True
2026-05-29T10:01:29.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:01:29.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:01:29.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:01:29.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974331.189081s, valid=True
2026-05-29T10:01:29.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:01:29.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:01:29.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:01:29.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:01:29.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:01:29.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:01:29.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:01:29.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:01:29.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:01:29.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:01:29.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:01:29.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:01:29.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:01:29.516 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:01:29.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:01:30.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:01:30.196 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:01:30.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:01:30.196 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:01:30.196 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:01:30.410 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:01:30.410 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:02:00.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:02:00.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:02:00.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:02:00.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:02:00.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:02:01.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:02:01.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-05-29T10:02:01.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:02:01.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-05-29T10:02:01.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:02:01.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:02:01.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:02:01.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-05-29T10:02:03.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-05-29T10:02:03.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:02:03.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:02:03.607 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:02:03.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:02:03.617 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:02:03.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:02:03.629 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:02:03.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:02:03.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:02:03.629 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:02:03.629 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:02:03.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:02:03.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:02:03.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:02:03.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:02:03.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:02:03.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:02:03.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:02:03.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:02:03.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:02:03.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:02:03.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:02:03.880 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:02:03.942 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:01:46
2026-05-29T10:02:03.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71546, datetime.datetime(2026, 5, 29, 10, 1, 46), datetime.datetime(2026, 5, 29, 10, 1, 45), 'salt', 10.05, 67.28, None, 14.12, 84.83, 5.78, 833.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:02:03.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:02:03.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:02:03.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:01:45, diff=18.948118s, valid=True
2026-05-29T10:02:03.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:02:03.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:02:03.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:02:12, diff=-8.049057s, valid=True
2026-05-29T10:02:03.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:02:03.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:02:03.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:01:40, diff=23.957514s, valid=True
2026-05-29T10:02:03.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:02:03.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:02:03.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:02:03.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:02:03.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:02:03.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:02:03.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:02:12, diff=-8.039444s, valid=True
2026-05-29T10:02:03.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:02:03.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:02:03.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:02:03.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974365.961229s, valid=True
2026-05-29T10:02:03.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:02:03.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:02:03.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:02:03.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:02:03.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:02:04.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:02:04.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:02:04.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:02:04.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:02:04.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:02:04.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:02:04.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:02:04.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:02:04.358 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:02:04.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:02:04.902 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:02:05.001 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:02:05.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:02:05.001 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:02:05.002 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:02:05.070 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:02:05.070 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:02:35.100 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:02:35.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:02:35.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:02:35.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:02:35.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:02:35.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:02:35.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-05-29T10:02:35.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:02:35.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-05-29T10:02:35.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:02:35.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:02:35.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:02:35.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-05-29T10:02:38.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-05-29T10:02:38.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:02:38.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:02:38.270 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:02:38.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:02:38.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:02:38.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:02:38.289 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:02:38.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:02:38.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:02:38.290 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:02:38.290 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:02:38.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:02:38.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:02:38.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:02:38.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:02:38.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:02:38.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:02:38.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:02:38.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:02:38.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:02:38.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:02:38.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:02:38.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:02:38.607 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:02:16
2026-05-29T10:02:38.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71547, datetime.datetime(2026, 5, 29, 10, 2, 16), datetime.datetime(2026, 5, 29, 10, 2, 15), 'salt', 10.08, 68.04, None, 13.55, 83.75, 5.62, 833.58, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:02:38.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:02:38.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:02:38.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:02:15, diff=23.613154s, valid=True
2026-05-29T10:02:38.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:02:38.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:02:38.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:02:12, diff=26.61605s, valid=True
2026-05-29T10:02:38.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:02:38.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:02:38.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:02:11, diff=27.622738s, valid=True
2026-05-29T10:02:38.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:02:38.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:02:38.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:02:38.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:02:38.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:02:38.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:02:38.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:02:12, diff=26.625754s, valid=True
2026-05-29T10:02:38.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:02:38.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:02:38.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:02:38.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974400.626404s, valid=True
2026-05-29T10:02:38.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:02:38.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:02:38.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:02:38.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:02:38.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:02:38.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:02:38.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:02:38.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:02:38.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:02:38.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:02:38.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:02:38.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:02:38.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:02:38.947 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:02:39.156 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:02:39.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:02:39.604 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:02:39.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:02:39.604 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:02:39.604 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:02:39.763 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:02:39.763 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:03:09.784 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:03:09.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:03:09.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:03:09.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:03:09.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:03:10.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:03:10.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-05-29T10:03:10.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:03:10.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-05-29T10:03:10.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:03:10.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:03:10.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:03:10.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-05-29T10:03:12.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-05-29T10:03:12.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:03:12.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:03:12.485 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:03:12.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:03:12.493 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:03:12.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:03:12.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:03:12.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:03:12.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:03:12.506 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:03:12.506 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:03:12.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:03:12.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:03:12.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:03:12.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:03:12.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:03:12.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:03:12.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:03:12.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:03:12.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:03:12.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:03:12.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:03:12.771 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:03:12.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:02:46
2026-05-29T10:03:12.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71548, datetime.datetime(2026, 5, 29, 10, 2, 46), datetime.datetime(2026, 5, 29, 10, 2, 46), 'salt', 10.15, 68.57, None, 13.09, 84.97, 5.51, 833.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:03:12.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:03:12.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:03:12.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:02:46, diff=26.840638s, valid=True
2026-05-29T10:03:12.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:03:12.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:03:12.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:03:12, diff=0.844726s, valid=True
2026-05-29T10:03:12.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:03:12.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:03:12.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:02:43, diff=29.852009s, valid=True
2026-05-29T10:03:12.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:03:12.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:03:12.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:03:12.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:03:12.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:03:12.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:03:12.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:03:12, diff=0.855464s, valid=True
2026-05-29T10:03:12.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:03:12.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:03:12.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:03:12.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974434.8563s, valid=True
2026-05-29T10:03:12.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:03:12.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:03:12.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:03:12.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:03:12.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:03:12.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:03:12.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:03:12.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:03:12.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:03:13.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:03:13.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:03:13.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:03:13.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:03:13.261 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:03:13.477 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:03:13.822 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:03:13.918 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:03:13.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:03:13.918 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:03:13.919 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:03:14.073 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:03:14.073 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:03:44.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:03:44.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:03:44.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:03:44.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:03:44.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:03:44.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:03:44.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T10:03:44.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:03:44.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-05-29T10:03:44.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:03:44.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:03:44.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:03:44.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-05-29T10:03:47.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-05-29T10:03:47.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:03:47.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:03:47.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:03:47.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:03:47.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:03:47.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:03:47.192 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:03:47.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:03:47.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:03:47.193 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:03:47.193 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:03:47.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:03:47.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:03:47.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:03:47.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:03:47.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:03:47.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:03:47.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:03:47.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:03:47.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:03:47.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:03:47.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:03:47.452 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:03:47.510 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:03:46
2026-05-29T10:03:47.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71550, datetime.datetime(2026, 5, 29, 10, 3, 46), datetime.datetime(2026, 5, 29, 10, 3, 46), 'salt', 10.05, 69.07, None, 11.79, 83.16, 5.41, 833.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:03:47.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:03:47.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:03:47.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:03:46, diff=1.520339s, valid=True
2026-05-29T10:03:47.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:03:47.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:03:47.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:04:12, diff=-24.476778s, valid=True
2026-05-29T10:03:47.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:03:47.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:03:47.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:03:46, diff=1.531123s, valid=True
2026-05-29T10:03:47.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:03:47.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:03:47.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:03:47.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:03:47.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:03:47.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:03:47.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:04:12, diff=-24.465498s, valid=True
2026-05-29T10:03:47.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:03:47.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:03:47.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:03:47.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974469.535182s, valid=True
2026-05-29T10:03:47.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:03:47.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:03:47.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:03:47.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:03:47.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:03:47.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:03:47.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:03:47.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:03:47.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:03:47.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:03:47.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:03:47.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:03:47.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:03:47.853 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:03:48.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:03:48.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:03:48.500 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:03:48.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:03:48.500 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:03:48.501 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:03:48.649 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:03:48.649 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:04:18.679 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:04:18.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:04:18.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:04:19.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:04:19.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:04:19.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:04:19.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T10:04:19.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:04:19.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-05-29T10:04:19.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:04:19.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:04:19.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:04:19.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-05-29T10:04:21.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T10:04:21.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:04:21.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:04:21.989 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:04:21.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:04:21.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:04:22.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:04:22.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:04:22.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:04:22.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:04:22.012 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:04:22.012 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:04:22.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:04:22.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:04:22.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:04:22.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:04:22.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:04:22.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:04:22.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:04:22.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:04:22.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:04:22.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:04:22.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:04:22.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:04:22.398 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:04:17
2026-05-29T10:04:22.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71551, datetime.datetime(2026, 5, 29, 10, 4, 17), datetime.datetime(2026, 5, 29, 10, 4, 16), 'salt', 9.95, 69.77, None, 12.92, 79.48, 5.26, 833.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:04:22.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:04:22.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:04:22.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:04:16, diff=6.404744s, valid=True
2026-05-29T10:04:22.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:04:22.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:04:22.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:04:12, diff=10.407484s, valid=True
2026-05-29T10:04:22.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:04:22.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:04:22.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:04:07, diff=15.414052s, valid=True
2026-05-29T10:04:22.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:04:22.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:04:22.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:04:22.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:04:22.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:04:22.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:04:22.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:04:12, diff=10.417017s, valid=True
2026-05-29T10:04:22.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:04:22.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:04:22.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:04:22.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974504.417709s, valid=True
2026-05-29T10:04:22.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:04:22.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:04:22.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:04:22.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:04:22.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:04:22.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:04:22.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:04:22.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:04:22.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:04:22.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:04:22.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:04:22.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:04:22.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:04:22.734 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:04:22.942 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:04:23.279 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:04:23.380 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:04:23.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:04:23.380 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:04:23.380 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:04:24.037 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:04:24.038 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:04:54.059 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:04:54.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:04:54.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:04:54.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:04:54.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:04:54.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:04:54.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-05-29T10:04:54.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:04:54.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-05-29T10:04:54.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:04:54.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:04:54.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:04:54.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-05-29T10:04:57.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-05-29T10:04:57.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:04:57.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:04:57.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:04:57.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:04:57.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:04:57.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:04:57.382 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:04:57.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:04:57.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:04:57.383 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:04:57.383 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:04:57.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:04:57.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:04:57.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:04:57.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:04:57.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:04:57.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:04:57.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:04:57.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:04:57.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:04:57.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:04:57.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:04:57.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:04:57.709 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:04:47
2026-05-29T10:04:57.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71552, datetime.datetime(2026, 5, 29, 10, 4, 47), datetime.datetime(2026, 5, 29, 10, 4, 46), 'salt', 9.98, 70.1, None, 13.45, 64.18, 5.19, 833.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:04:57.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:04:57.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:04:57.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:04:46, diff=11.715856s, valid=True
2026-05-29T10:04:57.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:04:57.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:04:57.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:05:12, diff=-14.281263s, valid=True
2026-05-29T10:04:57.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:04:57.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:04:57.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:04:38, diff=19.725443s, valid=True
2026-05-29T10:04:57.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:04:57.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:04:57.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:04:57.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:04:57.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:04:57.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:04:57.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:05:12, diff=-14.271515s, valid=True
2026-05-29T10:04:57.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:04:57.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:04:57.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:04:57.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974539.72916s, valid=True
2026-05-29T10:04:57.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:04:57.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:04:57.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:04:57.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:04:57.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:04:57.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:04:57.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:04:57.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:04:57.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:04:57.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:04:57.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:04:57.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:04:58.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:04:58.045 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:04:58.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:04:58.590 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:04:58.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:04:58.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:04:58.746 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:04:58.746 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:04:58.813 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:04:58.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:05:28.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:05:28.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:05:28.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:05:29.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:05:29.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:05:29.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:05:29.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-05-29T10:05:29.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:05:29.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-05-29T10:05:29.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:05:29.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:05:29.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:05:29.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-05-29T10:05:32.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-05-29T10:05:32.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:05:32.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:05:32.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:05:32.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:05:32.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:05:32.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:05:32.836 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:05:32.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:05:32.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:05:32.836 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:05:32.836 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:05:32.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:05:32.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:05:32.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:05:33.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:05:33.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:05:33.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:05:33.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:05:33.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:05:33.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:05:33.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:05:33.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:05:33.094 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:05:33.157 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:05:17
2026-05-29T10:05:33.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71553, datetime.datetime(2026, 5, 29, 10, 5, 17), datetime.datetime(2026, 5, 29, 10, 5, 17), 'salt', 9.95, 69.73, None, 12.46, 66.59, 5.26, 833.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:05:33.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:05:33.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:05:33.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:05:17, diff=16.16337s, valid=True
2026-05-29T10:05:33.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:05:33.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:05:33.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:05:12, diff=21.166195s, valid=True
2026-05-29T10:05:33.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:05:33.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:05:33.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:05:09, diff=24.172876s, valid=True
2026-05-29T10:05:33.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:05:33.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:05:33.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:05:33.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:05:33.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:05:33.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:05:33.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:05:12, diff=21.175865s, valid=True
2026-05-29T10:05:33.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:05:33.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:05:33.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:05:33.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974575.176515s, valid=True
2026-05-29T10:05:33.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:05:33.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:05:33.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:05:33.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:05:33.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:05:33.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:05:33.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:05:33.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:05:33.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:05:33.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:05:33.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:05:33.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:05:33.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:05:33.494 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:05:33.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:05:34.045 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:05:34.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:05:34.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:05:34.148 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:05:34.148 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:05:34.417 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:05:34.417 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:06:04.447 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:06:04.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:06:04.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:06:04.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:06:04.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:06:04.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:06:04.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-05-29T10:06:04.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:06:04.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-05-29T10:06:04.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:06:04.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:06:04.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:06:04.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-05-29T10:06:07.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-05-29T10:06:07.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:06:07.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:06:07.475 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:06:07.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:06:07.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:06:07.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:06:07.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:06:07.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:06:07.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:06:07.497 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:06:07.497 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:06:07.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:06:07.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:06:07.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:06:07.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:06:07.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:06:07.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:06:07.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:06:07.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:06:07.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:06:07.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:06:07.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:06:07.746 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:06:07.811 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:05:47
2026-05-29T10:06:07.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71554, datetime.datetime(2026, 5, 29, 10, 5, 47), datetime.datetime(2026, 5, 29, 10, 5, 47), 'salt', 9.98, 69.1, None, 16.02, 83.42, 5.39, 833.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:06:07.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:06:07.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:06:07.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:05:47, diff=20.817301s, valid=True
2026-05-29T10:06:07.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:06:07.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:06:07.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:06:12, diff=-4.179794s, valid=True
2026-05-29T10:06:07.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:06:07.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:06:07.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:05:41, diff=26.826868s, valid=True
2026-05-29T10:06:07.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:06:07.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:06:07.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:06:07.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:06:07.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:06:07.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:06:07.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:06:12, diff=-4.170089s, valid=True
2026-05-29T10:06:07.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:06:07.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:06:07.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:06:07.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974609.830565s, valid=True
2026-05-29T10:06:07.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:06:07.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:06:07.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:06:07.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:06:07.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:06:07.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:06:07.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:06:07.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:06:07.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:06:07.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:06:08.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:06:08.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:06:08.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:06:08.147 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:06:08.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:06:08.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:06:08.864 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:06:08.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:06:08.864 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:06:08.865 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:06:09.074 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:06:09.074 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:06:39.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:06:39.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:06:39.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:06:39.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:06:39.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:06:39.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:06:39.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-05-29T10:06:39.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:06:39.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-05-29T10:06:39.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:06:39.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:06:39.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:06:39.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-05-29T10:06:42.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-05-29T10:06:42.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:06:42.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:06:42.184 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:06:42.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:06:42.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:06:42.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:06:42.205 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:06:42.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:06:42.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:06:42.205 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:06:42.205 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:06:42.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:06:42.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:06:42.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:06:42.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:06:42.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:06:42.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:06:42.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:06:42.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:06:42.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:06:42.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:06:42.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:06:42.463 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:06:42.522 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:06:17
2026-05-29T10:06:42.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71555, datetime.datetime(2026, 5, 29, 10, 6, 17), datetime.datetime(2026, 5, 29, 10, 6, 17), 'salt', 10.18, 68.37, None, 13.59, 79.48, 5.55, 833.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:06:42.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:06:42.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:06:42.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:06:17, diff=25.52866s, valid=True
2026-05-29T10:06:42.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:06:42.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:06:42.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:06:12, diff=30.53147s, valid=True
2026-05-29T10:06:42.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:06:42.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:06:42.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:06:12, diff=30.53805s, valid=True
2026-05-29T10:06:42.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:06:42.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:06:42.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:06:42.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:06:42.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:06:42.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:06:42.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:06:12, diff=30.541064s, valid=True
2026-05-29T10:06:42.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:06:42.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:06:42.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:06:42.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974644.541728s, valid=True
2026-05-29T10:06:42.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:06:42.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:06:42.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:06:42.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:06:42.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:06:42.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:06:42.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:06:42.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:06:42.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:06:42.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:06:42.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:06:42.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:06:42.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:06:42.857 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:06:43.063 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:06:43.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:06:43.502 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:06:43.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:06:43.503 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:06:43.503 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:06:43.756 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:06:43.756 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:07:13.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:07:13.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:07:13.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:07:14.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:07:14.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:07:14.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:07:14.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-05-29T10:07:14.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:07:14.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T10:07:14.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:07:14.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:07:14.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:07:14.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-05-29T10:07:17.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-05-29T10:07:17.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:07:17.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:07:17.099 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:07:17.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:07:17.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:07:17.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:07:17.121 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:07:17.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:07:17.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:07:17.122 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:07:17.122 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:07:17.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:07:17.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:07:17.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:07:17.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:07:17.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:07:17.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:07:17.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:07:17.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:07:17.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:07:17.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:07:17.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:07:17.375 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:07:17.434 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:06:48
2026-05-29T10:07:17.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71556, datetime.datetime(2026, 5, 29, 10, 6, 48), datetime.datetime(2026, 5, 29, 10, 6, 47), 'salt', 9.71, 69.07, None, 14.96, 70.89, 5.38, 833.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:07:17.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:07:17.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:07:17.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:06:47, diff=30.441042s, valid=True
2026-05-29T10:07:17.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:07:17.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:07:17.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:07:12, diff=5.443973s, valid=True
2026-05-29T10:07:17.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:07:17.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:07:17.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:06:44, diff=33.450582s, valid=True
2026-05-29T10:07:17.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:07:17.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:07:17.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:07:17.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:07:17.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:07:17.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:07:17.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:07:12, diff=5.453632s, valid=True
2026-05-29T10:07:17.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:07:17.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:07:17.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:07:17.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974679.454299s, valid=True
2026-05-29T10:07:17.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:07:17.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:07:17.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:07:17.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:07:17.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:07:17.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:07:17.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:07:17.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:07:17.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:07:17.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:07:17.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:07:17.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:07:17.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:07:17.865 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:07:18.083 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:07:18.427 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:07:18.529 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:07:18.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:07:18.529 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:07:18.529 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:07:18.596 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:07:18.596 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:07:48.605 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:07:48.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:07:48.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:07:48.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:07:48.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:07:49.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:07:49.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-05-29T10:07:49.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:07:49.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-05-29T10:07:49.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:07:49.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:07:49.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:07:49.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-05-29T10:07:51.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-05-29T10:07:51.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:07:51.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:07:51.471 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:07:51.471 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:07:51.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:07:51.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:07:51.491 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:07:51.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:07:51.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:07:51.491 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:07:51.491 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:07:51.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:07:51.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:07:51.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:07:51.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:07:51.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:07:51.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:07:51.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:07:51.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:07:51.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:07:51.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:07:51.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:07:51.746 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:07:51.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:07:48
2026-05-29T10:07:51.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71558, datetime.datetime(2026, 5, 29, 10, 7, 48), datetime.datetime(2026, 5, 29, 10, 7, 48), 'salt', 9.65, 69.27, None, 13.8, 68.09, 5.35, 833.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:07:51.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:07:51.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:07:51.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:07:48, diff=3.811245s, valid=True
2026-05-29T10:07:51.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:07:51.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:07:51.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:08:12, diff=-20.18592s, valid=True
2026-05-29T10:07:51.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:07:51.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:07:51.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:07:47, diff=4.820788s, valid=True
2026-05-29T10:07:51.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:07:51.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:07:51.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:07:51.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:07:51.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:07:51.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:07:51.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:08:12, diff=-20.176162s, valid=True
2026-05-29T10:07:51.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:07:51.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:07:51.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:07:51.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974713.824493s, valid=True
2026-05-29T10:07:51.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:07:51.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:07:51.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:07:51.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:07:51.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:07:51.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:07:51.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:07:51.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:07:51.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:07:51.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:07:52.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:07:52.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:07:52.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:07:52.141 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:07:52.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:07:52.684 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:07:52.785 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:07:52.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:07:52.785 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:07:52.785 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:07:53.035 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:07:53.035 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:08:23.065 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:08:23.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:08:23.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:08:23.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:08:23.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:08:23.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:08:23.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-05-29T10:08:23.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:08:23.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-05-29T10:08:23.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:08:23.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:08:23.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:08: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-05-29T10:08:26.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-05-29T10:08:26.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:08:26.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:08:26.046 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:08:26.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:08:26.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:08:26.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:08:26.066 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:08:26.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:08:26.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:08:26.066 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:08:26.066 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:08:26.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:08:26.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:08:26.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:08:26.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:08:26.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:08:26.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:08:26.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:08:26.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:08:26.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:08:26.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:08:26.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:08:26.329 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:08:26.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:08:18
2026-05-29T10:08:26.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71559, datetime.datetime(2026, 5, 29, 10, 8, 18), datetime.datetime(2026, 5, 29, 10, 8, 18), 'salt', 9.71, 69.47, None, 15.39, 71.19, 5.3, 833.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:08:26.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:08:26.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:08:26.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:08:18, diff=8.398106s, valid=True
2026-05-29T10:08:26.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:08:26.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:08:26.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:08:12, diff=14.400985s, valid=True
2026-05-29T10:08:26.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:08:26.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:08:26.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:08:18, diff=8.407693s, valid=True
2026-05-29T10:08:26.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:08:26.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:08:26.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:08:26.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:08:26.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:08:26.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:08:26.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:08:12, diff=14.410704s, valid=True
2026-05-29T10:08:26.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:08:26.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:08:26.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:08:26.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974748.411355s, valid=True
2026-05-29T10:08:26.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:08:26.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:08:26.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:08:26.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:08:26.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:08:26.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:08:26.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:08:26.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:08:26.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:08:26.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:08:26.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:08:26.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:08:26.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:08:26.802 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:08:27.009 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:08:27.352 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:08:27.453 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:08:27.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:08:27.453 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:08:27.453 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:08:27.712 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:08:27.712 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:08:57.716 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:08:57.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:08:57.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:08:57.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:08:58.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:08:58.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:08:58.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-05-29T10:08:58.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:08:58.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-05-29T10:08:58.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:08:58.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:08:58.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:08:58.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-05-29T10:09:00.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-05-29T10:09:00.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:09:00.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:09:00.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:09:00.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:09:00.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:09:00.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:09:00.918 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:09:00.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:09:00.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:09:00.919 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:09:00.919 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:09:00.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:09:01.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:09:01.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:09:01.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:09:01.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:09:01.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:09:01.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:09:01.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:09:01.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:09:01.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:09:01.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:09:01.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:09:01.268 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:08:48
2026-05-29T10:09:01.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71560, datetime.datetime(2026, 5, 29, 10, 8, 48), datetime.datetime(2026, 5, 29, 10, 8, 48), 'salt', 9.65, 68.84, None, 14.96, 71.57, 5.44, 833.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:09:01.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:09:01.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:09:01.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:08:48, diff=13.274979s, valid=True
2026-05-29T10:09:01.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:09:01.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:09:01.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:09:12, diff=-10.722094s, valid=True
2026-05-29T10:09:01.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:09:01.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:09:01.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:08:40, diff=21.284742s, valid=True
2026-05-29T10:09:01.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:09:01.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:09:01.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:09:01.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:09:01.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:09:01.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:09:01.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:09:12, diff=-10.71214s, valid=True
2026-05-29T10:09:01.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:09:01.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:09:01.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:09:01.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974783.288527s, valid=True
2026-05-29T10:09:01.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:09:01.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:09:01.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:09:01.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:09:01.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:09:01.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:09:01.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:09:01.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:09:01.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:09:01.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:09:01.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:09:01.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:09:01.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:09:01.615 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:09:01.836 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:09:02.191 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:09:02.301 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:09:02.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:09:02.301 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:09:02.301 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:09:02.556 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:09:02.556 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:09:32.583 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:09:32.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:09:32.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:09:33.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:09:33.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:09:33.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:09:33.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-05-29T10:09:33.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:09:33.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-05-29T10:09:33.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:09:33.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:09:33.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:09:33.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-05-29T10:09:35.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-05-29T10:09:35.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:09:35.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:09:35.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:09:35.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:09:35.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:09:35.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:09:35.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:09:35.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:09:35.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:09:35.965 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:09:35.965 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:09:35.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:09:36.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:09:36.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:09:36.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:09:36.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:09:36.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:09:36.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:09:36.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:09:36.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:09:36.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:09:36.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:09:36.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:09:36.286 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:09:19
2026-05-29T10:09:36.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71561, datetime.datetime(2026, 5, 29, 10, 9, 19), datetime.datetime(2026, 5, 29, 10, 9, 18), 'salt', 9.68, 69.14, None, 14.43, 68.12, 5.37, 833.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:09:36.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:09:36.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:09:36.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:09:18, diff=18.292685s, valid=True
2026-05-29T10:09:36.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:09:36.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:09:36.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:09:12, diff=24.295522s, valid=True
2026-05-29T10:09:36.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:09:36.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:09:36.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:09:10, diff=26.302108s, valid=True
2026-05-29T10:09:36.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:09:36.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:09:36.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:09:36.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:09:36.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:09:36.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:09:36.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:09:12, diff=24.305188s, valid=True
2026-05-29T10:09:36.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:09:36.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:09:36.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:09:36.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974818.305871s, valid=True
2026-05-29T10:09:36.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:09:36.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:09:36.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:09:36.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:09:36.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:09:36.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:09:36.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:09:36.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:09:36.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:09:36.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:09:36.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:09:36.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:09:36.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:09:36.690 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:09:36.912 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:09:37.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:09:37.349 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:09:37.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:09:37.350 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:09:37.350 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:09:37.506 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:09:37.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:10:07.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:10:07.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:10:07.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:10:08.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:10:08.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:10:08.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:10:08.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-05-29T10:10:08.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:10:08.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-05-29T10:10:08.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:10:08.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:10:08.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:10:08.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-05-29T10:10:10.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-05-29T10:10:10.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:10:10.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:10:10.868 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:10:10.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:10:10.877 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:10:10.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:10:10.890 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:10:10.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:10:10.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:10:10.891 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:10:10.891 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:10:10.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:10:10.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:10:10.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:10:11.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:10:11.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:10:11.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:10:11.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:10:11.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:10:11.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:10:11.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:10:11.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:10:11.173 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:10:11.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:09:49
2026-05-29T10:10:11.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71562, datetime.datetime(2026, 5, 29, 10, 9, 49), datetime.datetime(2026, 5, 29, 10, 9, 48), 'salt', 9.85, 69.6, None, 15.17, 75.49, 5.29, 833.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:10:11.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:10:11.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:10:11.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:09:48, diff=23.239424s, valid=True
2026-05-29T10:10:11.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:10:11.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:10:11.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:10:12, diff=-0.757587s, valid=True
2026-05-29T10:10:11.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:10:11.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:10:11.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:09:42, diff=29.250204s, valid=True
2026-05-29T10:10:11.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:10:11.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:10:11.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:10:11.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:10:11.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:10:11.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:10:11.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:10:12, diff=-0.746571s, valid=True
2026-05-29T10:10:11.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:10:11.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:10:11.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:10:11.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974853.254098s, valid=True
2026-05-29T10:10:11.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:10:11.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:10:11.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:10:11.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:10:11.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:10:11.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:10:11.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:10:11.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:10:11.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:10:11.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:10:11.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:10:11.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:10:11.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:10:11.606 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:10:11.831 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:10:12.193 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:10:12.301 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:10:12.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:10:12.301 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:10:12.301 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:10:12.556 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:10:12.556 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:10:42.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:10:42.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:10:42.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:10:43.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:10:43.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:10:43.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:10:43.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-05-29T10:10:43.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:10:43.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-05-29T10:10:43.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:10:43.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:10:43.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:10:43.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-05-29T10:10:45.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-05-29T10:10:45.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:10:45.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:10:45.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:10:45.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:10:45.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:10:45.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:10:45.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:10:45.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:10:45.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:10:45.587 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:10:45.587 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:10:45.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:10:45.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:10:45.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:10:45.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:10:45.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:10:45.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:10:45.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:10:45.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:10:45.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:10:45.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:10:45.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:10:45.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:10:45.985 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:10:19
2026-05-29T10:10:45.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71563, datetime.datetime(2026, 5, 29, 10, 10, 19), datetime.datetime(2026, 5, 29, 10, 10, 19), 'salt', 9.95, 69.43, None, 14.5, 64.17, 5.33, 833.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:10:45.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:10:45.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:10:45.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:10:19, diff=26.991267s, valid=True
2026-05-29T10:10:45.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:10:45.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:10:45.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:10:12, diff=33.9941s, valid=True
2026-05-29T10:10:45.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:10:45.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:10:46.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:10:13, diff=33.000778s, valid=True
2026-05-29T10:10:46.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:10:46.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:10:46.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:10:46.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:10:46.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:10:46.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:10:46.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:10:12, diff=34.003827s, valid=True
2026-05-29T10:10:46.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:10:46.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:10:46.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:10:46.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974888.004466s, valid=True
2026-05-29T10:10:46.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:10:46.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:10:46.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:10:46.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:10:46.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:10:46.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:10:46.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:10:46.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:10:46.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:10:46.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:10:46.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:10:46.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:10:46.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:10:46.319 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:10:46.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:10:46.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:10:46.968 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:10:46.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:10:46.968 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:10:46.968 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:10:47.215 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:10:47.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:11:17.225 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:11:17.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:11:17.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:11:17.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:11:17.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:11:17.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:11:17.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-05-29T10:11:17.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:11:17.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-05-29T10:11:17.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:11:17.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:11:17.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:11:17.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-05-29T10:11:20.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T10:11:20.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:11:20.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:11:20.379 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:11:20.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:11:20.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:11:20.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:11:20.400 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:11:20.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:11:20.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:11:20.401 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:11:20.401 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:11:20.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:11:20.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:11:20.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:11:20.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:11:20.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:11:20.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:11:20.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:11:20.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:11:20.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:11:20.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:11:20.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:11:20.718 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:11:20.780 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:11:19
2026-05-29T10:11:20.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71565, datetime.datetime(2026, 5, 29, 10, 11, 19), datetime.datetime(2026, 5, 29, 10, 11, 19), 'salt', 10.18, 70.13, None, 14.79, 61.26, 5.19, 833.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:11:20.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:11:20.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:11:20.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:11:19, diff=1.787282s, valid=True
2026-05-29T10:11:20.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:11:20.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:11:20.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:11:12, diff=8.790328s, valid=True
2026-05-29T10:11:20.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:11:20.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:11:20.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:11:16, diff=4.797315s, valid=True
2026-05-29T10:11:20.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:11:20.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:11:20.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:11:20.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:11:20.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:11:20.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:11:20.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:11:12, diff=8.800598s, valid=True
2026-05-29T10:11:20.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:11:20.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:11:20.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:11:20.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974922.801288s, valid=True
2026-05-29T10:11:20.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:11:20.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:11:20.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:11:20.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:11:20.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:11:20.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:11:20.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:11:20.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:11:20.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:11:20.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:11:21.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:11:21.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:11:21.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:11:21.144 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:11:21.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:11:21.736 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:11:21.836 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:11:21.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:11:21.836 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:11:21.836 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:11:22.085 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:11:22.086 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:11:52.105 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:11:52.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:11:52.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:11:52.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:11:52.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:11:52.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:11:52.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-05-29T10:11:52.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:11:52.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-05-29T10:11:52.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:11:52.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:11:52.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:11:52.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-05-29T10:11:55.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-05-29T10:11:55.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:11:55.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:11:55.498 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:11:55.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:11:55.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:11:55.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:11:55.519 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:11:55.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:11:55.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:11:55.520 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:11:55.520 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:11:55.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:11:55.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:11:55.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:11:55.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:11:55.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:11:55.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:11:55.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:11:55.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:11:55.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:11:55.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:11:55.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:11:55.788 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:11:55.846 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:11:50
2026-05-29T10:11:55.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71566, datetime.datetime(2026, 5, 29, 10, 11, 50), datetime.datetime(2026, 5, 29, 10, 11, 49), 'salt', 10.01, 68.9, None, 14.79, 61.76, 5.43, 833.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:11:55.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:11:55.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:11:55.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:11:49, diff=6.852267s, valid=True
2026-05-29T10:11:55.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:11:55.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:11:55.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:12:12, diff=-16.144854s, valid=True
2026-05-29T10:11:55.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:11:55.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:11:55.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:11:48, diff=7.861811s, valid=True
2026-05-29T10:11:55.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:11:55.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:11:55.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:11:55.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:11:55.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:11:55.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:11:55.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:12:12, diff=-16.135142s, valid=True
2026-05-29T10:11:55.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:11:55.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:11:55.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:11:55.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974957.865524s, valid=True
2026-05-29T10:11:55.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:11:55.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:11:55.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:11:55.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:11:55.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:11:55.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:11:55.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:11:55.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:11:55.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:11:55.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:11:56.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:11:56.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:11:56.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:11:56.183 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:11:56.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:11:56.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:11:56.833 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:11:56.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:11:56.833 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:11:56.834 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:11:57.098 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:11:57.098 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:12:27.128 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:12:27.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:12:27.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:12:27.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:12:27.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:12:27.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:12:27.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-05-29T10:12:27.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:12:27.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-05-29T10:12:27.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:12:27.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:12:27.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:12:27.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-05-29T10:12:30.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-05-29T10:12:30.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:12:30.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:12:30.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:12:30.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:12:30.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:12:30.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:12:30.113 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:12:30.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:12:30.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:12:30.114 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:12:30.114 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:12:30.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:12:30.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:12:30.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:12:30.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:12:30.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:12:30.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:12:30.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:12:30.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:12:30.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:12:30.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:12:30.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:12:30.381 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:12:30.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:12:20
2026-05-29T10:12:30.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71567, datetime.datetime(2026, 5, 29, 10, 12, 20), datetime.datetime(2026, 5, 29, 10, 12, 20), 'salt', 10.05, 69.1, None, 12.32, 67.67, 5.4, 833.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:12:30.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:12:30.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:12:30.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:12:20, diff=10.451892s, valid=True
2026-05-29T10:12:30.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:12:30.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:12:30.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:12:12, diff=18.454796s, valid=True
2026-05-29T10:12:30.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:12:30.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:12:30.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:12:19, diff=11.461656s, valid=True
2026-05-29T10:12:30.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:12:30.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:12:30.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:12:30.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:12:30.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:12:30.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:12:30.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:12:12, diff=18.464718s, valid=True
2026-05-29T10:12:30.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:12:30.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:12:30.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:12:30.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=974992.465382s, valid=True
2026-05-29T10:12:30.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:12:30.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:12:30.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:12:30.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:12:30.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:12:30.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:12:30.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:12:30.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:12:30.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:12:30.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:12:30.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:12:30.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:12:30.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:12:30.791 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:12:31.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:12:31.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:12:31.551 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:12:31.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:12:31.551 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:12:31.551 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:12:31.712 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:12:31.712 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:13:01.742 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:13:01.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:13:01.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:13:01.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:13:01.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:13:02.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:13:02.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-05-29T10:13:02.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:13:02.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-05-29T10:13:02.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:13:02.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:13:02.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:13:02.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-05-29T10:13:04.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-05-29T10:13:04.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:13:04.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:13:04.470 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:13:04.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:13:04.478 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:13:04.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:13:04.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:13:04.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:13:04.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:13:04.490 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:13:04.490 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:13:04.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:13:04.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:13:04.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:13:04.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:13:04.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:13:04.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:13:04.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:13:04.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:13:04.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:13:04.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:13:04.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:13:04.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:13:04.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:12:50
2026-05-29T10:13:04.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71568, datetime.datetime(2026, 5, 29, 10, 12, 50), datetime.datetime(2026, 5, 29, 10, 12, 50), 'salt', 9.91, 69.07, None, 12.74, 63.66, 5.39, 833.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:13:04.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:13:04.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:13:04.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:12:50, diff=14.800002s, valid=True
2026-05-29T10:13:04.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:13:04.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:13:04.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:13:12, diff=-7.197222s, valid=True
2026-05-29T10:13:04.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:13:04.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:13:04.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:12:42, diff=22.809213s, valid=True
2026-05-29T10:13:04.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:13:04.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:13:04.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:13:04.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:13:04.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:13:04.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:13:04.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:13:12, diff=-7.187887s, valid=True
2026-05-29T10:13:04.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:13:04.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:13:04.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:13:04.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975026.812747s, valid=True
2026-05-29T10:13:04.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:13:04.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:13:04.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:13:04.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:13:04.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:13:04.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:13:04.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:13:04.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:13:04.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:13:04.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:13:04.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:13:05.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:13:05.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:13:05.115 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:13:05.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:13:05.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:13:05.733 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:13:05.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:13:05.733 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:13:05.733 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:13:05.904 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:13:05.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:13:35.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:13:35.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:13:35.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:13:36.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:13:36.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:13:36.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:13:36.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-05-29T10:13:36.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:13:36.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-05-29T10:13:36.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:13:36.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:13:36.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:13:36.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-05-29T10:13:39.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-05-29T10:13:39.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:13:39.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:13:39.529 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:13:39.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:13:39.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:13:39.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:13:39.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:13:39.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:13:39.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:13:39.549 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:13:39.549 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:13:39.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:13:39.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:13:39.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:13:39.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:13:39.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:13:39.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:13:39.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:13:39.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:13:39.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:13:39.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:13:39.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:13:39.806 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:13:39.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:13:20
2026-05-29T10:13:39.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71569, datetime.datetime(2026, 5, 29, 10, 13, 20), datetime.datetime(2026, 5, 29, 10, 13, 20), 'salt', 10.08, 69.43, None, 13.69, 63.73, 5.33, 833.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:13:39.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:13:39.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:13:39.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:13:20, diff=19.871222s, valid=True
2026-05-29T10:13:39.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:13:39.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:13:39.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:13:12, diff=27.874226s, valid=True
2026-05-29T10:13:39.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:13:39.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:13:39.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:13:12, diff=27.881165s, valid=True
2026-05-29T10:13:39.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:13:39.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:13:39.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:13:39.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:13:39.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:13:39.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:13:39.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:13:12, diff=27.884373s, valid=True
2026-05-29T10:13:39.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:13:39.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:13:39.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:13:39.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975061.885332s, valid=True
2026-05-29T10:13:39.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:13:39.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:13:39.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:13:39.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:13:39.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:13:39.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:13:39.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:13:39.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:13:39.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:13:40.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:13:40.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:13:40.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:13:40.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:13:40.233 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:13:40.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:13:40.868 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:13:40.970 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:13:40.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:13:40.971 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:13:40.971 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:13:41.136 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:13:41.136 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:14:11.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:14:11.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:14:11.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:14:11.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:14:11.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:14:11.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:14:11.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-05-29T10:14:11.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:14:11.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-05-29T10:14:11.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:14:11.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:14:11.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:14:11.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-05-29T10:14: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-05-29T10:14:14.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:14:14.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:14:14.025 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:14:14.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:14:14.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:14:14.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:14:14.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:14:14.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:14:14.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:14:14.049 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:14:14.049 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:14:14.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:14:14.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:14:14.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:14:14.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:14:14.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:14:14.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:14:14.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:14:14.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:14:14.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:14:14.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:14:14.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:14:14.307 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:14:14.365 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:13:51
2026-05-29T10:14:14.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71570, datetime.datetime(2026, 5, 29, 10, 13, 51), datetime.datetime(2026, 5, 29, 10, 13, 50), 'salt', 9.98, 69.96, None, 12.46, 71.1, 5.22, 833.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:14:14.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:14:14.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:14:14.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:13:50, diff=24.371538s, valid=True
2026-05-29T10:14:14.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:14:14.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:14:14.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:14:12, diff=2.374319s, valid=True
2026-05-29T10:14:14.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:14:14.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:14:14.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:13:43, diff=31.380953s, valid=True
2026-05-29T10:14:14.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:14:14.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:14:14.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:14:14.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:14:14.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:14:14.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:14:14.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:14:12, diff=2.383956s, valid=True
2026-05-29T10:14:14.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:14:14.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:14:14.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:14:14.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975096.384635s, valid=True
2026-05-29T10:14:14.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:14:14.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:14:14.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:14:14.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:14:14.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:14:14.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:14:14.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:14:14.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:14:14.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:14:14.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:14:14.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:14:14.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:14:14.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:14:14.705 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:14:14.914 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:14:15.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:14:15.356 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:14:15.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:14:15.357 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:14:15.357 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:14:15.528 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:14:15.528 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:14:45.558 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:14:45.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:14:45.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:14:46.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:14:46.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:14:46.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:14:46.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-05-29T10:14:46.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:14:46.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-05-29T10:14:46.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:14:46.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:14:46.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:14:46.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-05-29T10:14:48.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-05-29T10:14:48.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:14:48.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:14:48.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:14:48.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:14:48.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:14:48.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:14:48.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:14:48.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:14:48.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:14:48.761 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:14:48.761 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:14:48.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:14:48.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:14:48.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:14:48.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:14:48.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:14:49.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:14:49.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:14:49.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:14:49.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:14:49.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:14:49.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:14:49.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:14:49.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:14:21
2026-05-29T10:14:49.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71571, datetime.datetime(2026, 5, 29, 10, 14, 21), datetime.datetime(2026, 5, 29, 10, 14, 21), 'salt', 10.01, 70.13, None, 13.27, 70.25, 5.18, 833.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:14:49.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:14:49.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:14:49.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:14:21, diff=28.131324s, valid=True
2026-05-29T10:14:49.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:14:49.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:14:49.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:14:12, diff=37.140947s, valid=True
2026-05-29T10:14:49.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:14:49.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:14:49.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:14:15, diff=34.159705s, valid=True
2026-05-29T10:14:49.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:14:49.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:14:49.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:14:49.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:14:49.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:14:49.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:14:49.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:14:12, diff=37.167864s, valid=True
2026-05-29T10:14:49.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:14:49.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:14:49.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:14:49.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975131.169335s, valid=True
2026-05-29T10:14:49.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:14:49.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:14:49.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:14:49.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:14:49.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:14:49.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:14:49.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:14:49.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:14:49.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:14:49.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:14:49.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:14:49.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:14:49.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:14:49.605 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:14:49.821 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:14:50.251 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:14:50.351 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:14:50.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:14:50.351 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:14:50.351 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:14:50.512 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:14:50.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:15:20.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:15:20.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:15:20.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:15:20.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:15:20.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:15:21.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:15:21.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-05-29T10:15:21.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:15:21.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-05-29T10:15:21.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:15:21.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:15:21.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:15:21.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-05-29T10:15:23.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-05-29T10:15:23.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:15:23.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:15:23.697 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:15:23.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:15:23.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:15:23.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:15:23.720 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:15:23.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:15:23.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:15:23.720 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:15:23.720 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:15:23.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:15:23.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:15:23.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:15:23.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:15:23.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:15:23.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:15:23.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:15:23.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:15:23.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:15:23.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:15:23.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:15:23.978 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:15:24.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:15:22
2026-05-29T10:15:24.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71573, datetime.datetime(2026, 5, 29, 10, 15, 22), datetime.datetime(2026, 5, 29, 10, 15, 21), 'salt', 9.94, 69.43, None, 14.15, 60.72, 5.32, 833.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:15:24.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:15:24.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:15:24.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:15:21, diff=3.042762s, valid=True
2026-05-29T10:15:24.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:15:24.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:15:24.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:15:12, diff=12.0456s, valid=True
2026-05-29T10:15:24.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:15:24.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:15:24.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:15:17, diff=7.052206s, valid=True
2026-05-29T10:15:24.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:15:24.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:15:24.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:15:24.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:15:24.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:15:24.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:15:24.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:15:12, diff=12.055189s, valid=True
2026-05-29T10:15:24.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:15:24.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:15:24.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:15:24.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975166.055844s, valid=True
2026-05-29T10:15:24.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:15:24.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:15:24.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:15:24.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:15:24.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:15:24.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:15:24.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:15:24.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:15:24.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:15:24.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:15:24.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:15:24.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:15:24.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:15:24.388 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:15:24.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:15:24.970 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:15:25.074 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:15:25.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:15: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-05-29T10:15: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-05-29T10:15:25.238 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:15:25.238 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:15:55.268 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:15:55.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:15:55.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:15:55.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:15:55.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:15:55.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:15:55.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-05-29T10:15:55.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:15:55.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-05-29T10:15:55.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:15:55.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:15:55.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:15:55.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-05-29T10:15:58.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-05-29T10:15:58.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:15:58.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:15:58.477 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:15:58.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:15:58.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:15:58.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:15:58.562 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:15:58.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:15:58.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:15:58.563 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:15:58.563 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:15:58.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:15:58.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:15:58.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:15:58.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:15:58.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:15:58.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:15:58.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:15:58.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:15:58.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:15:58.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:15:58.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:15:58.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:15:58.875 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:15:52
2026-05-29T10:15:58.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71574, datetime.datetime(2026, 5, 29, 10, 15, 52), datetime.datetime(2026, 5, 29, 10, 15, 51), 'salt', 9.94, 70.76, None, 14.19, 60.32, 5.05, 833.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:15:58.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:15:58.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:15:58.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:15:51, diff=7.881575s, valid=True
2026-05-29T10:15:58.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:15:58.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:15:58.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:16:12, diff=-13.115554s, valid=True
2026-05-29T10:15:58.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:15:58.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:15:58.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:15:49, diff=9.891135s, valid=True
2026-05-29T10:15:58.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:15:58.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:15:58.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:15:58.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:15:58.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:15:58.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:15:58.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:16:12, diff=-13.105795s, valid=True
2026-05-29T10:15:58.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:15:58.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:15:58.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:15:58.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975200.894872s, valid=True
2026-05-29T10:15:58.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:15:58.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:15:58.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:15:58.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:15:58.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:15:58.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:15:58.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:15:58.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:15:58.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:15:59.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:15:59.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:15:59.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:15:59.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:15:59.280 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:15:59.487 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:15:59.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:15:59.943 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:15:59.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:15:59.943 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:15:59.943 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:16:00.194 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:16:00.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:16:30.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:16:30.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:16:30.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:16:30.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:16:30.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:16:30.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:16: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-05-29T10:16:30.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:16:30.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-05-29T10:16:30.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:16:30.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:16:30.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:16:30.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-05-29T10:16: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-05-29T10:16:33.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:16:33.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:16:33.403 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:16:33.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:16:33.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:16:33.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:16:33.423 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:16:33.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:16:33.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:16:33.424 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:16:33.424 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:16:33.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:16:33.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:16:33.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:16:33.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:16:33.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:16:33.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:16:33.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:16:33.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:16:33.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:16:33.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:16:33.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:16:33.678 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:16:33.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:16:22
2026-05-29T10:16:33.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71575, datetime.datetime(2026, 5, 29, 10, 16, 22), datetime.datetime(2026, 5, 29, 10, 16, 22), 'salt', 9.81, 71.36, None, 13.55, 59.55, 4.93, 833.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:16:33.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:16:33.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:16:33.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:16:22, diff=11.744083s, valid=True
2026-05-29T10:16:33.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:16:33.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:16:33.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:16:12, diff=21.746959s, valid=True
2026-05-29T10:16:33.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:16:33.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:16:33.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:16:20, diff=13.753521s, valid=True
2026-05-29T10:16:33.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:16:33.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:16:33.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:16:33.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:16:33.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:16:33.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:16:33.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:16:12, diff=21.756551s, valid=True
2026-05-29T10:16:33.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:16:33.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:16:33.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:16:33.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975235.757211s, valid=True
2026-05-29T10:16:33.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:16:33.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:16:33.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:16:33.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:16:33.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:16:33.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:16:33.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:16:33.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:16:33.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:16:33.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:16:33.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:16:33.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:16:34.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:16:34.074 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:16:34.298 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:16:34.642 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:16:34.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:16:34.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:16:34.743 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:16:34.743 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:16:34.993 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:16:34.993 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:17:05.020 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:17:05.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:17:05.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:17:05.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:17:05.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:17:05.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:17:05.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-05-29T10:17:05.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:17:05.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-05-29T10:17:05.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:17:05.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:17:05.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:17:05.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-05-29T10:17:08.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-05-29T10:17:08.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:17:08.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:17:08.093 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:17:08.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:17:08.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:17:08.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:17:08.114 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:17:08.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:17:08.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:17:08.115 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:17:08.115 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:17:08.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:17:08.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:17:08.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:17:08.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:17:08.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:17:08.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:17:08.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:17:08.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:17:08.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:17:08.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:17:08.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:17:08.371 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:17:08.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:16:52
2026-05-29T10:17:08.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71576, datetime.datetime(2026, 5, 29, 10, 16, 52), datetime.datetime(2026, 5, 29, 10, 16, 52), 'salt', 10.01, 72.88, None, 10.45, 81.51, 4.63, 833.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:17:08.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:17:08.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:17:08.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:16:52, diff=16.438172s, valid=True
2026-05-29T10:17:08.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:17:08.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:17:08.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:17:12, diff=-3.559016s, valid=True
2026-05-29T10:17:08.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:17:08.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:17:08.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:16:52, diff=16.447664s, valid=True
2026-05-29T10:17:08.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:17:08.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:17:08.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:17:08.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:17:08.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:17:08.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:17:08.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:17:12, diff=-3.549309s, valid=True
2026-05-29T10:17:08.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:17:08.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:17:08.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:17:08.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975270.451344s, valid=True
2026-05-29T10:17:08.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:17:08.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:17:08.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:17:08.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:17:08.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:17:08.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:17:08.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:17:08.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:17:08.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:17:08.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:17:08.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:17:08.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:17:08.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:17:08.836 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:17:09.044 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:17:09.386 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:17:09.488 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:17:09.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:17:09.488 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:17:09.488 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:17:09.647 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:17:09.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:17:39.664 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:17:39.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:17:39.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:17:40.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:17:40.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:17:40.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:17:40.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-05-29T10:17:40.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:17:40.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-05-29T10:17:40.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:17:40.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:17:40.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:17:40.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-05-29T10:17:43.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-05-29T10:17:43.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:17:43.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:17:43.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:17:43.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:17:43.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:17:43.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:17:43.053 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:17:43.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:17:43.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:17:43.053 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:17:43.053 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:17:43.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:17:43.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:17:43.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:17:43.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:17:43.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:17:43.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:17:43.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:17:43.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T10:17:43.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:17:43.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:17:43.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:17:43.314 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:17:43.373 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:17:23
2026-05-29T10:17:43.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71577, datetime.datetime(2026, 5, 29, 10, 17, 23), datetime.datetime(2026, 5, 29, 10, 17, 22), 'salt', 9.91, 71.62, None, 13.2, 67.08, 4.88, 833.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:17:43.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:17:43.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:17:43.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:17:22, diff=21.379197s, valid=True
2026-05-29T10:17:43.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:17:43.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:17:43.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:17:12, diff=31.38204s, valid=True
2026-05-29T10:17:43.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:17:43.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:17:43.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:17:14, diff=29.388694s, valid=True
2026-05-29T10:17:43.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:17:43.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:17:43.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:17:43.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:17:43.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:17:43.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T10:17:43.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:17:12, diff=31.391741s, valid=True
2026-05-29T10:17:43.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:17:43.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:17:43.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:17:43.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975305.392394s, valid=True
2026-05-29T10:17:43.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:17:43.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:17:43.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:17:43.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:17:43.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:17:43.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:17:43.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:17:43.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:17:43.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:17:43.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:17:43.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:17:43.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:17:43.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:17:43.711 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:17:43.916 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:17:44.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:17:44.353 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:17:44.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:17:44.353 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:17:44.353 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:17:44.650 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:17:44.650 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:18:14.680 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:18:14.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:18:14.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:18:15.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:18:15.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:18:15.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:18:15.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-05-29T10:18:15.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:18:15.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T10:18:15.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:18:15.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:18:15.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:18:15.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-05-29T10:18:18.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-05-29T10:18:18.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:18:18.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:18:18.038 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:18:18.038 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:18:18.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:18:18.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:18:18.059 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:18:18.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:18:18.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:18:18.059 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:18:18.059 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:18:18.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:18:18.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:18:18.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:18:18.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:18:18.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:18:18.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:18:18.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:18:18.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:18:18.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:18:18.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:18:18.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:18:18.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:18:18.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:17:53
2026-05-29T10:18:18.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71578, datetime.datetime(2026, 5, 29, 10, 17, 53), datetime.datetime(2026, 5, 29, 10, 17, 52), 'salt', 9.81, 71.95, None, 14.01, 62.18, 4.81, 833.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:18:18.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:18:18.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:18:18.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:17:52, diff=26.376543s, valid=True
2026-05-29T10:18:18.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:18:18.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:18:18.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:18:12, diff=6.37935s, valid=True
2026-05-29T10:18:18.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:18:18.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:18:18.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:17:44, diff=34.38597s, valid=True
2026-05-29T10:18:18.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:18:18.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:18:18.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:18:18.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:18:18.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:18:18.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:18:18.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:18:12, diff=6.388982s, valid=True
2026-05-29T10:18:18.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:18:18.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:18:18.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:18:18.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975340.38966s, valid=True
2026-05-29T10:18:18.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:18:18.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:18:18.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:18:18.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:18:18.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:18:18.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:18:18.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:18:18.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:18:18.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:18:18.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:18:18.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:18:18.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:18:18.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:18:18.704 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:18:18.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:18:19.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:18:19.354 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:18:19.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:18:19.355 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:18:19.355 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:18:19.515 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:18:19.515 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:18:49.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:18:49.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:18:49.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:18:49.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:18:49.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:18:50.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:18:50.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-05-29T10:18:50.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:18:50.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-05-29T10:18:50.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:18:50.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:18:50.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:18:50.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-05-29T10:18:52.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-05-29T10:18:52.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:18:52.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:18:52.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:18:52.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:18:52.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:18:52.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:18:52.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:18:52.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:18:52.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:18:52.744 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:18:52.744 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:18:52.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:18:52.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:18:52.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:18:52.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:18:52.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:18:52.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:18:52.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:18:52.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T10:18:52.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:18:52.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:18:52.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:18:52.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:18:53.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:18:23
2026-05-29T10:18:53.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71579, datetime.datetime(2026, 5, 29, 10, 18, 23), datetime.datetime(2026, 5, 29, 10, 18, 23), 'salt', 9.78, 71.59, None, 11.93, 63.4, 4.88, 833.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:18:53.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:18:53.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:18:53.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:18:23, diff=30.058393s, valid=True
2026-05-29T10:18:53.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:18:53.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:18:53.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:18:12, diff=41.061196s, valid=True
2026-05-29T10:18:53.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:18:53.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:18:53.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:18:15, diff=38.067843s, valid=True
2026-05-29T10:18:53.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:18:53.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:18:53.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:18:53.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:18:53.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:18:53.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T10:18:53.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:18:12, diff=41.070871s, valid=True
2026-05-29T10:18:53.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:18:53.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:18:53.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:18:53.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975375.071523s, valid=True
2026-05-29T10:18:53.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:18:53.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:18:53.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:18:53.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:18:53.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:18:53.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:18:53.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:18:53.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:18:53.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:18:53.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:18:53.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:18:53.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:18:53.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:18:53.393 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:18:53.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:18:53.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:18:54.103 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:18:54.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:18:54.103 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:18:54.103 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:18:54.266 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:18:54.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:19:24.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:19:24.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:19:24.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:19:24.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:19:24.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:19:24.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:19:24.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-05-29T10:19:24.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:19:24.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-05-29T10:19:24.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:19:24.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:19:24.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:19:24.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-05-29T10:19:27.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-05-29T10:19:27.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:19:27.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:19:27.562 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:19:27.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:19:27.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:19:27.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:19:27.582 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:19:27.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:19:27.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:19:27.582 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:19:27.582 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:19:27.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:19:27.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:19:27.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:19:27.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:19:27.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:19:27.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T10:19:27.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:19:27.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T10:19:27.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:19:27.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:19:27.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:19:27.852 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:19:27.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:19:23
2026-05-29T10:19:27.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71581, datetime.datetime(2026, 5, 29, 10, 19, 23), datetime.datetime(2026, 5, 29, 10, 19, 23), 'salt', 9.84, 71.59, None, 13.66, 69.1, 4.88, 833.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:19:27.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:19:27.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:19:27.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:19:23, diff=4.922838s, valid=True
2026-05-29T10:19:27.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:19:27.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T10:19:27.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:19:12, diff=15.9257s, valid=True
2026-05-29T10:19:27.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:19:27.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:19:27.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:19:18, diff=9.932438s, valid=True
2026-05-29T10:19:27.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:19:27.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:19:27.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:19:27.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:19:27.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:19:27.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T10:19:27.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:19:12, diff=15.935434s, valid=True
2026-05-29T10:19:27.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:19:27.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:19:27.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:19:27.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975409.936095s, valid=True
2026-05-29T10:19:27.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:19:27.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:19:27.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:19:27.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:19:27.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:19:27.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:19:27.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:19:27.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:19:28.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:19:28.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:19:28.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:19:28.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:19:28.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:19:28.253 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:19:28.459 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:19:28.797 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:19:28.896 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:19:28.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:19:28.897 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:19:28.897 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:19:29.058 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:19:29.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:19:59.087 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:19:59.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:19:59.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:19:59.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:19:59.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:19:59.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:19:59.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-05-29T10:19:59.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:19:59.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-05-29T10:19:59.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:19:59.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:19:59.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:19:59.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T10:20:02.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-05-29T10:20:02.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:20:02.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:20:02.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:20:02.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:20:02.150 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:20:02.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:20:02.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:20:02.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:20:02.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:20:02.162 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:20:02.162 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:20:02.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:20:02.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:20:02.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:20:02.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:20:02.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:20:02.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T10:20:02.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:20:02.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T10:20:02.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:20:02.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:20:02.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:20:02.418 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:20:02.477 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:19:54
2026-05-29T10:20:02.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71582, datetime.datetime(2026, 5, 29, 10, 19, 54), datetime.datetime(2026, 5, 29, 10, 19, 53), 'salt', 9.74, 70.96, None, 13.37, 75.18, 5.0, 833.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:20:02.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:20:02.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:20:02.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:19:53, diff=9.483787s, valid=True
2026-05-29T10:20:02.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:20:02.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T10:20:02.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:20:12, diff=-9.513298s, valid=True
2026-05-29T10:20:02.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:20:02.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:20:02.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:19:49, diff=13.493268s, valid=True
2026-05-29T10:20:02.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:20:02.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:20:02.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:20:02.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:20:02.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:20:02.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T10:20:02.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:20:12, diff=-9.503648s, valid=True
2026-05-29T10:20:02.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:20:02.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:20:02.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:20:02.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975444.497012s, valid=True
2026-05-29T10:20:02.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:20:02.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:20:02.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:20:02.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:20:02.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:20:02.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:20:02.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:20:02.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:20:02.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:20:02.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:20:02.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:20:02.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:20:02.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:20:02.811 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:20:03.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:20:03.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:20:03.558 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:20:03.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:20:03.558 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:20:03.559 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:20:03.805 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:20:03.805 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:20:33.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:20:33.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:20:33.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:20:34.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:20:34.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:20:34.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:20:34.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-05-29T10:20:34.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:20:34.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-05-29T10:20:34.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:20:34.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:20:34.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:20:34.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-05-29T10:20:37.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-05-29T10:20:37.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:20:37.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:20:37.243 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:20:37.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:20:37.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:20:37.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:20:37.265 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:20:37.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:20:37.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:20:37.265 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:20:37.265 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:20:37.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:20:37.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:20:37.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:20:37.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:20:37.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:20:37.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T10:20:37.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:20:37.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T10:20:37.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:20:37.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:20:37.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:20:37.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:20:37.582 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:20:24
2026-05-29T10:20:37.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71583, datetime.datetime(2026, 5, 29, 10, 20, 24), datetime.datetime(2026, 5, 29, 10, 20, 24), 'salt', 9.78, 71.22, None, 11.75, 74.47, 4.96, 833.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:20:37.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:20:37.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:20:37.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:20:24, diff=13.588285s, valid=True
2026-05-29T10:20:37.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:20:37.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T10:20:37.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:20:12, diff=25.591169s, valid=True
2026-05-29T10:20:37.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:20:37.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:20:37.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:20:21, diff=16.597837s, valid=True
2026-05-29T10:20:37.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:20:37.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:20:37.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:20:37.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:20:37.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:20:37.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T10:20:37.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:20:12, diff=25.600894s, valid=True
2026-05-29T10:20:37.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:20:37.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:20:37.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:20:37.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975479.601553s, valid=True
2026-05-29T10:20:37.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:20:37.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:20:37.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:20:37.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:20:37.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:20:37.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:20:37.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:20:37.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:20:37.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:20:37.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:20:37.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:20:37.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:20:37.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:20:37.920 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:20:38.133 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:20:38.478 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:20:38.579 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:20:38.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:20:38.579 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:20:38.579 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:20:38.742 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:20:38.742 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:21:08.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:21:08.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:21:08.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:21:08.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:21:08.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:21:09.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:21:09.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-05-29T10:21:09.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:21:09.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-05-29T10:21:09.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:21:09.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:21:09.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:21:09.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-05-29T10:21:11.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-05-29T10:21:11.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:21:11.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:21:11.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:21:11.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:21:11.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:21:11.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:21:11.956 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:21:11.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:21:11.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:21:11.956 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:21:11.956 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:21:11.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:21:12.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:21:12.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:21:12.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:21:12.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:21:12.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:21:12.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:21:12.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:21:12.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:21:12.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:21:12.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:21:12.213 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:21:12.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:20:55
2026-05-29T10:21:12.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71584, datetime.datetime(2026, 5, 29, 10, 20, 55), datetime.datetime(2026, 5, 29, 10, 20, 54), 'salt', 9.88, 70.69, None, 12.39, 67.1, 5.07, 833.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:21:12.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:21:12.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:21:12.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:20:54, diff=18.282695s, valid=True
2026-05-29T10:21:12.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:21:12.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:21:12.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:21:12, diff=0.285543s, valid=True
2026-05-29T10:21:12.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:21:12.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:21:12.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:20:52, diff=20.292285s, valid=True
2026-05-29T10:21:12.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:21:12.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:21:12.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:21:12.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:21:12.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:21:12.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:21:12.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:21:12, diff=0.295312s, valid=True
2026-05-29T10:21:12.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:21:12.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:21:12.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:21:12.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975514.295977s, valid=True
2026-05-29T10:21:12.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:21:12.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:21:12.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:21:12.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:21:12.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:21:12.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:21:12.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:21:12.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:21:12.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:21:12.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:21:12.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:21:12.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:21:12.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:21:12.688 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:21:12.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:21:13.237 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:21:13.338 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:21:13.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:21:13.338 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:21:13.338 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:21:13.501 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:21:13.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:21:43.516 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:21:43.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:21:43.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:21:43.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:21:43.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:21:44.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:21: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-05-29T10:21:44.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:21:44.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-05-29T10:21:44.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:21:44.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:21:44.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:21:44.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-05-29T10:21:47.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-05-29T10:21:47.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:21:47.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:21:47.250 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:21:47.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:21:47.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:21:47.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:21:47.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:21:47.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:21:47.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:21:47.276 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:21:47.276 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:21:47.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:21:47.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:21:47.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:21:47.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:21:47.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:21:47.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:21:47.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:21:47.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:21:47.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:21:47.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:21:47.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:21:47.546 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:21:47.609 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:21:26
2026-05-29T10:21:47.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71585, datetime.datetime(2026, 5, 29, 10, 21, 26), datetime.datetime(2026, 5, 29, 10, 21, 26), 'salt', 9.74, 70.56, None, 12.63, 63.72, 5.08, 833.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:21:47.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:21:47.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:21:47.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:21:26, diff=21.615276s, valid=True
2026-05-29T10:21:47.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:21:47.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:21:47.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:21:12, diff=35.618131s, valid=True
2026-05-29T10:21:47.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:21:47.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:21:47.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:21:26, diff=21.624873s, valid=True
2026-05-29T10:21:47.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:21:47.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:21:47.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:21:47.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:21:47.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:21:47.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:21:47.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:21:12, diff=35.627889s, valid=True
2026-05-29T10:21:47.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:21:47.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:21:47.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:21:47.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975549.628533s, valid=True
2026-05-29T10:21:47.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:21:47.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:21:47.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:21:47.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:21:47.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:21:47.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:21:47.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:21:47.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:21:47.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:21:47.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:21:47.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:21:47.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:21:47.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:21:47.954 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:21:48.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:21:48.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:21:48.635 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:21:48.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:21:48.635 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:21:48.635 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:21:49.205 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:21:49.205 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:22:19.235 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:22:19.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:22:19.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:22:19.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:22:19.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:22:19.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:22:19.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-05-29T10:22:19.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:22:19.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-05-29T10:22:19.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:22:19.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:22:19.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:22:19.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-05-29T10:22:22.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-05-29T10:22:22.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:22:22.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:22:22.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:22:22.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:22:22.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:22:22.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:22:22.502 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:22:22.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:22:22.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:22:22.503 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:22:22.503 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:22:22.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:22:22.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:22:22.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:22:22.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:22:22.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:22:22.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:22:22.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:22:22.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:22:22.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:22:22.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:22:22.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:22:22.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:22:22.825 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:21:57
2026-05-29T10:22:22.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71586, datetime.datetime(2026, 5, 29, 10, 21, 57), datetime.datetime(2026, 5, 29, 10, 21, 56), 'salt', 9.71, 70.72, None, 12.42, 77.97, 5.05, 833.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:22:22.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:22:22.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:22:22.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:21:56, diff=26.831856s, valid=True
2026-05-29T10:22:22.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:22:22.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:22:22.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:22:12, diff=10.834723s, valid=True
2026-05-29T10:22:22.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:22:22.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:22:22.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:21:56, diff=26.841286s, valid=True
2026-05-29T10:22:22.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:22:22.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:22:22.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:22:22.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:22:22.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:22:22.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:22:22.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:22:12, diff=10.844346s, valid=True
2026-05-29T10:22:22.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:22:22.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:22:22.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:22:22.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975584.845018s, valid=True
2026-05-29T10:22:22.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:22:22.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:22:22.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:22:22.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:22:22.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:22:22.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:22:22.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:22:22.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:22:22.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:22:22.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:22:23.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:22:23.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:22:23.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:22:23.229 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:22:23.434 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:22:23.772 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:22:23.872 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:22:23.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:22:23.873 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:22:23.873 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:22:24.126 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:22:24.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:22:54.127 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:22:54.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:22:54.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:22:54.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:22:54.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:22:54.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:22:54.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T10:22:54.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:22:54.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-05-29T10:22:54.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:22:54.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:22:54.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:22:54.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-05-29T10:22:57.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-05-29T10:22:57.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:22:57.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:22:57.687 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:22:57.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:22:57.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:22:57.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:22:57.707 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:22:57.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:22:57.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:22:57.707 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:22:57.707 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:22:57.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:22:57.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:22:57.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:22:57.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:22:57.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:22:57.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:22:57.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:22:57.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:22:57.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:22:57.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:22:57.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:22:57.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:22:58.018 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:22:58
2026-05-29T10:22:58.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71588, datetime.datetime(2026, 5, 29, 10, 22, 58), datetime.datetime(2026, 5, 29, 10, 22, 57), 'salt', 10.11, 71.62, None, 17.01, 70.41, 4.89, 833.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:22:58.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:22:58.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:22:58.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:22:57, diff=1.024644s, valid=True
2026-05-29T10:22:58.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:22:58.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:22:58.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:23:12, diff=-13.97243s, valid=True
2026-05-29T10:22:58.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:22:58.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:22:58.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:22:56, diff=2.034193s, valid=True
2026-05-29T10:22:58.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:22:58.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:22:58.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:22:58.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:22:58.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:22:58.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:22:58.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:23:12, diff=-13.962752s, valid=True
2026-05-29T10:22:58.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:22:58.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:22:58.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:22:58.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975620.037945s, valid=True
2026-05-29T10:22:58.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:22:58.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:22:58.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:22:58.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:22:58.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:22:58.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:22:58.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:22:58.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:22:58.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:22:58.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:22:58.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:22:58.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:22:58.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:22:58.356 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:22:58.561 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:22:58.898 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:22:58.999 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:22:58.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:22:58.999 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:22:58.999 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:22:59.165 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:22:59.165 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:23:29.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:23:29.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:23:29.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:23:29.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:23:29.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:23:29.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:23:29.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-05-29T10:23:29.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:23:29.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-05-29T10:23:29.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:23:29.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:23:29.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:23:29.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T10:23:32.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-05-29T10:23:32.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:23:32.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:23:32.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:23:32.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:23:32.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:23:32.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:23:32.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:23:32.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:23:32.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:23:32.350 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:23:32.350 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:23:32.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:23:32.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:23:32.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:23:32.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:23:32.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:23:32.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:23:32.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:23:32.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:23:32.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:23:32.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:23:32.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:23:32.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:23:32.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:23:28
2026-05-29T10:23:32.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71589, datetime.datetime(2026, 5, 29, 10, 23, 28), datetime.datetime(2026, 5, 29, 10, 23, 27), 'salt', 10.17, 69.89, None, 11.75, 64.78, 5.23, 833.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:23:32.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:23:32.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:23:32.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:23:27, diff=5.68577s, valid=True
2026-05-29T10:23:32.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:23:32.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:23:32.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:23:12, diff=20.688639s, valid=True
2026-05-29T10:23:32.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:23:32.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:23:32.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:23:27, diff=5.695358s, valid=True
2026-05-29T10:23:32.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:23:32.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:23:32.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:23:32.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:23:32.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:23:32.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:23:32.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:23:12, diff=20.698356s, valid=True
2026-05-29T10:23:32.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:23:32.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:23:32.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:23:32.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975654.699019s, valid=True
2026-05-29T10:23:32.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:23:32.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:23:32.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:23:32.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:23:32.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:23:32.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:23:32.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:23:32.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:23:32.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:23:32.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:23:32.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:23:32.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:23:33.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:23:33.099 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:23:33.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:23:33.872 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:23:33.997 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:23:33.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:23:33.997 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:23:33.997 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:23:34.164 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:23:34.164 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:24:04.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:24:04.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:24:04.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:24:04.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:24:04.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:24:04.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:24:04.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-05-29T10:24:04.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:24:04.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-05-29T10:24:04.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:24:04.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:24:04.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:24:04.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-05-29T10:24:07.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-05-29T10:24:07.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:24:07.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:24:07.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:24:07.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:24:07.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:24:07.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:24:07.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:24:07.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:24:07.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:24:07.398 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:24:07.398 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:24:07.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:24:07.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:24:07.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:24:07.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:24:07.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:24:07.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:24:07.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:24:07.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:24:07.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:24:07.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:24:07.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:24:07.652 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:24:07.710 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:23:58
2026-05-29T10:24:07.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71590, datetime.datetime(2026, 5, 29, 10, 23, 58), datetime.datetime(2026, 5, 29, 10, 23, 58), 'salt', 10.17, 69.73, None, 13.97, 64.24, 5.27, 833.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:24:07.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:24:07.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:24:07.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:23:58, diff=9.716962s, valid=True
2026-05-29T10:24:07.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:24:07.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:24:07.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:24:12, diff=-4.280231s, valid=True
2026-05-29T10:24:07.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:24:07.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:24:07.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:23:57, diff=10.726278s, valid=True
2026-05-29T10:24:07.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:24:07.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:24:07.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:24:07.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:24:07.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:24:07.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:24:07.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:24:12, diff=-4.270708s, valid=True
2026-05-29T10:24:07.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:24:07.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:24:07.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:24:07.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975689.729953s, valid=True
2026-05-29T10:24:07.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:24:07.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:24:07.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:24:07.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:24:07.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:24:07.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:24:07.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:24:07.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:24:07.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:24:07.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:24:07.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:24:07.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:24:08.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:24:08.045 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:24:08.272 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:24:08.615 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:24:08.715 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:24:08.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:24:08.716 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:24:08.716 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:24:08.894 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:24:08.895 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:24:38.925 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:24:38.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:24:38.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:24:39.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:24:39.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:24:39.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:24:39.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T10:24:39.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:24:39.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-05-29T10:24:39.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:24:39.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:24:39.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:24:39.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-05-29T10:24:42.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-05-29T10:24:42.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:24:42.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:24:42.269 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:24:42.269 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:24:42.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:24:42.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:24:42.288 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:24:42.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:24:42.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:24:42.289 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:24:42.289 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:24:42.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:24:42.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:24:42.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:24:42.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:24:42.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:24:42.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:24:42.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:24:42.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:24:42.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:24:42.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:24:42.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:24:42.605 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:24:42.663 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:24:28
2026-05-29T10:24:42.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71591, datetime.datetime(2026, 5, 29, 10, 24, 28), datetime.datetime(2026, 5, 29, 10, 24, 28), 'salt', 9.74, 70.19, None, 12.77, 63.98, 5.16, 833.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:24:42.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:24:42.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:24:42.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:24:28, diff=14.669159s, valid=True
2026-05-29T10:24:42.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:24:42.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:24:42.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:24:12, diff=30.671996s, valid=True
2026-05-29T10:24:42.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:24:42.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:24:42.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:24:27, diff=15.678563s, valid=True
2026-05-29T10:24:42.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:24:42.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:24:42.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:24:42.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:24:42.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:24:42.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:24:42.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:24:12, diff=30.681542s, valid=True
2026-05-29T10:24:42.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:24:42.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:24:42.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:24:42.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975724.682198s, valid=True
2026-05-29T10:24:42.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:24:42.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:24:42.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:24:42.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:24:42.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:24:42.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:24:42.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:24:42.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:24:42.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:24:42.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:24:42.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:24:42.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:24:42.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:24:42.999 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:24:43.208 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:24:43.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:24:43.650 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:24:43.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:24:43.650 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:24:43.650 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:24:43.896 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:24:43.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:25:13.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:25:13.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:25:13.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:25:14.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:25:14.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:25:14.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:25:14.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-05-29T10:25:14.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:25:14.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-05-29T10:25:14.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:25:14.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:25:14.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:25:14.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-05-29T10:25:17.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-05-29T10:25:17.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:25:17.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:25:17.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:25:17.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:25:17.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:25:17.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:25:17.382 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:25:17.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:25:17.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:25:17.383 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:25:17.383 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:25:17.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:25:17.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:25:17.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:25:17.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:25:17.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:25:17.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:25:17.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:25:17.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:25:17.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:25:17.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:25:17.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:25:17.630 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:25:17.689 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:24:59
2026-05-29T10:25:17.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71592, datetime.datetime(2026, 5, 29, 10, 24, 59), datetime.datetime(2026, 5, 29, 10, 24, 58), 'salt', 9.74, 70.69, None, 10.34, 63.68, 5.06, 833.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:25:17.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:25:17.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:25:17.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:24:58, diff=19.695532s, valid=True
2026-05-29T10:25:17.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:25:17.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:25:17.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:25:12, diff=5.698347s, valid=True
2026-05-29T10:25:17.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:25:17.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:25:17.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:24:57, diff=20.704928s, valid=True
2026-05-29T10:25:17.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:25:17.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:25:17.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:25:17.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:25:17.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:25:17.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:25:17.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:25:12, diff=5.707944s, valid=True
2026-05-29T10:25:17.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:25:17.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:25:17.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:25:17.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975759.708606s, valid=True
2026-05-29T10:25:17.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:25:17.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:25:17.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:25:17.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:25:17.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:25:17.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:25:17.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:25:17.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:25:17.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:25:17.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:25:17.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:25:17.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:25:17.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:25:18.024 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:25:18.230 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:25:18.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:25:18.723 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:25:18.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:25:18.723 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:25:18.723 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:25:18.888 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:25:18.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:25:48.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:25:48.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:25:48.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:25:49.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:25:49.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:25:49.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:25:49.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-05-29T10:25:49.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:25:49.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-05-29T10:25:49.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:25:49.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:25:49.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:25:49.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-05-29T10:25:52.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T10:25:52.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:25:52.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:25:52.178 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:25:52.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:25:52.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:25:52.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:25:52.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:25:52.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:25:52.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:25:52.200 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:25:52.200 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:25:52.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:25:52.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:25:52.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:25:52.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:25:52.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:25:52.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:25:52.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:25:52.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:25:52.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:25:52.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:25:52.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:25:52.459 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:25:52.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:25:29
2026-05-29T10:25:52.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71593, datetime.datetime(2026, 5, 29, 10, 25, 29), datetime.datetime(2026, 5, 29, 10, 25, 28), 'salt', 9.94, 72.22, None, 12.42, 60.16, 4.76, 833.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:25:52.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:25:52.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:25:52.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:25:28, diff=24.525034s, valid=True
2026-05-29T10:25:52.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:25:52.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:25:52.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:25:12, diff=40.527918s, valid=True
2026-05-29T10:25:52.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:25:52.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:25:52.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:25:28, diff=24.534514s, valid=True
2026-05-29T10:25:52.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:25:52.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:25:52.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:25:52.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:25:52.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:25:52.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:25:52.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:25:12, diff=40.537496s, valid=True
2026-05-29T10:25:52.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:25:52.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:25:52.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:25:52.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975794.538154s, valid=True
2026-05-29T10:25:52.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:25:52.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:25:52.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:25:52.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:25:52.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:25:52.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:25:52.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:25:52.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:25:52.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:25:52.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:25:52.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:25:52.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:25:52.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:25:52.858 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:25:53.066 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:25:53.409 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:25:53.509 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:25:53.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:25:53.509 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:25:53.510 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:25:53.764 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:25:53.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:26:23.774 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:26:23.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:26:23.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:26:24.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:26:24.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:26:24.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:26:24.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-05-29T10:26:24.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:26:24.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T10:26:24.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:26:24.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:26:24.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:26:24.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-05-29T10:26:27.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-05-29T10:26:27.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:26:27.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:26:27.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:26:27.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:26:27.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:26:27.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:26:27.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:26:27.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:26:27.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:26:27.034 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:26:27.034 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:26:27.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:26:27.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:26:27.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:26:27.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:26:27.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:26:27.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:26:27.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:26:27.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:26:27.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:26:27.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:26:27.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:26:27.308 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:26:27.367 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:25:59
2026-05-29T10:26:27.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71594, datetime.datetime(2026, 5, 29, 10, 25, 59), datetime.datetime(2026, 5, 29, 10, 25, 59), 'salt', 10.04, 71.78, None, 12.63, 67.36, 4.85, 833.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:26:27.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:26:27.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:26:27.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:25:59, diff=28.373243s, valid=True
2026-05-29T10:26:27.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:26:27.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:26:27.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:26:12, diff=15.376149s, valid=True
2026-05-29T10:26:27.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:26:27.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:26:27.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:25:58, diff=29.382716s, valid=True
2026-05-29T10:26:27.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:26:27.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:26:27.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:26:27.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:26:27.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:26:27.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:26:27.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:26:12, diff=15.385714s, valid=True
2026-05-29T10:26:27.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:26:27.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:26:27.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:26:27.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975829.386359s, valid=True
2026-05-29T10:26:27.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:26:27.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:26:27.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:26:27.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:26:27.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:26:27.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:26:27.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:26:27.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:26:27.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:26:27.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:26:27.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:26:27.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:26:27.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:26:27.703 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:26:27.925 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:26:28.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:26:28.436 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:26:28.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:26: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-05-29T10:26: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-05-29T10:26:28.605 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:26:28.605 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:26:58.635 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:26:58.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:26:58.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:26:59.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:26:59.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:26:59.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:26:59.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-05-29T10:26:59.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:26:59.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-05-29T10:26:59.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:26:59.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:26:59.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:26:59.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-05-29T10:27:01.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-05-29T10:27:01.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:27:01.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:27:01.940 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:27:01.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:27:01.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:27:01.961 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:27:01.962 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:27:01.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:27:01.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:27:01.962 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:27:01.962 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:27:01.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:27:02.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:27:02.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:27:02.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:27:02.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:27:02.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:27:02.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:27:02.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:27:02.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:27:02.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:27:02.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:27:02.213 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:27:02.271 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:26:59
2026-05-29T10:27:02.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71596, datetime.datetime(2026, 5, 29, 10, 26, 59), datetime.datetime(2026, 5, 29, 10, 26, 59), 'salt', 10.04, 71.02, None, 13.02, 33.38, 5.0, 833.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:27:02.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:27:02.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:27:02.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:26:59, diff=3.27767s, valid=True
2026-05-29T10:27:02.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:27:02.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:27:02.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:27:12, diff=-9.719492s, valid=True
2026-05-29T10:27:02.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:27:02.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:27:02.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:26:59, diff=3.287141s, valid=True
2026-05-29T10:27:02.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:27:02.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:27:02.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:27:02.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:27:02.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:27:02.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:27:02.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:27:12, diff=-9.709818s, valid=True
2026-05-29T10:27:02.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:27:02.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:27:02.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:27:02.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975864.290836s, valid=True
2026-05-29T10:27:02.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:27:02.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:27:02.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:27:02.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:27:02.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:27:02.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:27:02.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:27:02.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:27:02.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:27:02.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:27:02.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:27:02.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:27:02.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:27:02.606 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:27:02.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:27:03.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:27:03.262 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:27:03.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:27:03.263 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:27:03.263 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:27:03.418 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:27:03.418 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:27:33.448 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:27:33.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:27:33.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:27:33.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:27:33.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:27:34.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:27:34.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-05-29T10:27:34.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:27:34.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-05-29T10:27:34.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:27:34.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:27:34.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:27:34.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-05-29T10:27:36.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-05-29T10:27:36.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:27:36.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:27:36.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:27:36.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:27:36.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:27:36.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:27:36.854 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:27:36.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:27:36.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:27:36.855 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:27:36.855 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:27:36.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:27:36.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:27:36.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:27:37.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:27:37.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:27:37.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:27:37.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:27:37.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:27:37.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:27:37.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:27:37.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:27:37.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:27:37.174 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:27:30
2026-05-29T10:27:37.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71597, datetime.datetime(2026, 5, 29, 10, 27, 30), datetime.datetime(2026, 5, 29, 10, 27, 29), 'salt', 10.31, 69.96, None, 11.22, 57.74, 5.23, 833.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:27:37.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:27:37.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:27:37.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:27:29, diff=8.180469s, valid=True
2026-05-29T10:27:37.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:27:37.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:27:37.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:27:12, diff=25.183349s, valid=True
2026-05-29T10:27:37.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:27:37.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:27:37.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:27:29, diff=8.189946s, valid=True
2026-05-29T10:27:37.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:27:37.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:27:37.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:27:37.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:27:37.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:27:37.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:27:37.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:27:12, diff=25.193001s, valid=True
2026-05-29T10:27:37.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:27:37.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:27:37.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:27:37.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975899.193672s, valid=True
2026-05-29T10:27:37.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:27:37.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:27:37.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:27:37.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:27:37.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:27:37.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:27:37.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:27:37.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:27:37.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:27:37.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:27:37.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:27:37.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:27:37.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:27:37.511 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:27:37.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:27:38.134 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:27:38.235 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:27:38.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:27: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-05-29T10:27: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-05-29T10:27:38.459 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:27:38.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:28:08.489 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:28:08.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:28:08.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:28:08.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:28:08.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:28:08.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:28:08.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-05-29T10:28:08.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:28:08.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-05-29T10:28:08.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:28:08.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:28:08.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:28:08.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-05-29T10:28:11.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-05-29T10:28:11.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:28:11.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:28:11.491 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:28:11.491 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:28:11.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:28:11.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:28:11.513 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:28:11.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:28:11.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:28:11.513 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:28:11.513 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:28:11.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:28:11.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:28:11.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:28:11.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:28:11.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:28:11.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:28:11.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:28:11.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:28:11.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:28:11.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:28:11.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:28:11.790 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:28:11.849 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:28:01
2026-05-29T10:28:11.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71598, datetime.datetime(2026, 5, 29, 10, 28, 1), datetime.datetime(2026, 5, 29, 10, 28), 'salt', 10.24, 70.16, None, 14.57, 60.88, 5.19, 833.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:28:11.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:28:11.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:28:11.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:28:00, diff=11.855881s, valid=True
2026-05-29T10:28:11.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:28:11.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:28:11.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:28:12, diff=-0.141232s, valid=True
2026-05-29T10:28:11.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:28:11.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:28:11.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:27:59, diff=12.865397s, valid=True
2026-05-29T10:28:11.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:28:11.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:28:11.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:28:11.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:28:11.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:28:11.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:28:11.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:28:12, diff=-0.13155s, valid=True
2026-05-29T10:28:11.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:28:11.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:28:11.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:28:11.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975933.869111s, valid=True
2026-05-29T10:28:11.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:28:11.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:28:11.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:28:11.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:28:11.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:28:11.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:28:11.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:28:11.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:28:11.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:28:12.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:28:12.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:28:12.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:28:12.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:28:12.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:28:12.394 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:28:12.738 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:28:12.839 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:28:12.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:28:12.840 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:28:12.840 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:28:13.002 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:28:13.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:28:43.032 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:28:43.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:28:43.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:28:43.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:28:43.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:28:43.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:28:43.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-05-29T10:28:43.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:28:43.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-05-29T10:28:43.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:28:43.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:28:43.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:28:43.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-05-29T10:28:46.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-05-29T10:28:46.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:28:46.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:28:46.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:28:46.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:28:46.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:28:46.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:28:46.465 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:28:46.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:28:46.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:28:46.465 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:28:46.465 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:28:46.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:28:46.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:28:46.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:28:46.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:28:46.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:28:46.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:28:46.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:28:46.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:28:46.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:28:46.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:28:46.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:28:46.727 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:28:46.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:28:31
2026-05-29T10:28:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71599, datetime.datetime(2026, 5, 29, 10, 28, 31), datetime.datetime(2026, 5, 29, 10, 28, 31), 'salt', 10.14, 71.42, None, 14.12, 61.73, 4.93, 833.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:28:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:28:46.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:28:46.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:28:31, diff=15.792645s, valid=True
2026-05-29T10:28:46.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:28:46.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:28:46.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:28:12, diff=34.795529s, valid=True
2026-05-29T10:28:46.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:28:46.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:28:46.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:28:29, diff=17.802152s, valid=True
2026-05-29T10:28:46.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:28:46.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:28:46.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:28:46.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:28:46.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:28:46.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:28:46.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:28:12, diff=34.80522s, valid=True
2026-05-29T10:28:46.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:28:46.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:28:46.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:28:46.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=975968.805889s, valid=True
2026-05-29T10:28:46.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:28:46.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:28:46.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:28:46.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:28:46.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:28:46.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:28:46.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:28:46.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:28:46.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:28:46.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:28:47.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:28:47.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:28:47.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:28:47.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:28:47.411 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:28:47.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:28:47.866 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:28:47.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:28:47.866 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:28:47.866 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:28:48.028 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:28:48.028 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:29:18.059 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:29:18.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:29:18.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:29:18.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:29:18.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:29:18.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:29:18.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-05-29T10:29:18.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:29:18.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-05-29T10:29:18.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:29:18.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:29:18.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:29:18.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-05-29T10:29:20.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T10:29:20.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:29:20.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:29:20.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:29:20.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:29:20.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:29:21.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:29:21.000 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:29:21.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:29:21.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:29:21.000 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:29:21.000 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:29:21.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:29:21.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:29:21.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:29:21.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:29:21.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:29:21.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:29:21.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:29:21.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:29:21.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:29:21.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:29:21.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:29:21.265 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:29:21.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:29:01
2026-05-29T10:29:21.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71600, datetime.datetime(2026, 5, 29, 10, 29, 1), datetime.datetime(2026, 5, 29, 10, 29, 1), 'salt', 10.11, 71.65, None, 13.59, 57.83, 4.88, 833.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:29:21.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:29:21.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:29:21.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:29:01, diff=20.328733s, valid=True
2026-05-29T10:29:21.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:29:21.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:29:21.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:29:12, diff=9.331608s, valid=True
2026-05-29T10:29:21.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:29:21.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:29:21.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:29:00, diff=21.338193s, valid=True
2026-05-29T10:29:21.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:29:21.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:29:21.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:29:21.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:29:21.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:29:21.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:29:21.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:29:12, diff=9.341226s, valid=True
2026-05-29T10:29:21.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:29:21.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:29:21.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:29:21.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976003.341892s, valid=True
2026-05-29T10:29:21.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:29:21.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:29:21.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:29:21.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:29:21.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:29:21.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:29:21.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:29:21.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:29:21.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:29:21.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:29:21.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:29:21.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:29:21.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:29:21.662 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:29:21.905 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:29:22.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:29:22.371 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:29:22.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:29:22.371 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:29:22.371 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:29:22.628 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:29:22.628 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:29:52.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:29:52.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:29:52.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:29:52.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:29:52.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:29:53.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:29:53.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-05-29T10:29:53.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:29:53.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-05-29T10:29:53.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:29:53.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:29:53.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:29:53.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-05-29T10:29:55.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-05-29T10:29:55.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:29:55.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:29:55.830 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:29:55.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:29:55.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:29:55.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:29:55.851 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:29:55.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:29:55.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:29:55.851 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:29:55.852 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:29:55.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:29:55.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:29:55.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:29:56.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:29:56.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:29:56.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:29:56.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:29:56.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:29:56.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:29:56.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:29:56.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:29:56.149 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:29:56.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:29:31
2026-05-29T10:29:56.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71601, datetime.datetime(2026, 5, 29, 10, 29, 31), datetime.datetime(2026, 5, 29, 10, 29, 31), 'salt', 9.94, 71.82, None, 13.37, 60.67, 4.84, 833.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:29:56.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:29:56.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:29:56.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:29:31, diff=25.214294s, valid=True
2026-05-29T10:29:56.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:29:56.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:29:56.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:29:12, diff=44.217534s, valid=True
2026-05-29T10:29:56.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:29:56.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:29:56.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:29:30, diff=26.225163s, valid=True
2026-05-29T10:29:56.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:29:56.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:29:56.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:29:56.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:29:56.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:29:56.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:29:56.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:29:12, diff=44.228642s, valid=True
2026-05-29T10:29:56.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:29:56.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:29:56.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:29:56.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976038.229392s, valid=True
2026-05-29T10:29:56.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:29:56.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:29:56.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:29:56.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:29:56.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:29:56.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:29:56.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:29:56.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:29:56.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:29:56.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:29:56.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:29:56.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:29:56.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:29:56.663 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:29:56.888 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:29:57.231 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:29:57.332 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:29:57.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:29: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-05-29T10:29: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-05-29T10:29:57.574 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:29:57.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:30:27.604 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:30:27.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:30:27.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:30:27.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:30:27.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:30:28.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:30:28.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-05-29T10:30:28.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:30:28.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-05-29T10:30:28.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:30:28.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:30:28.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:30:28.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-05-29T10:30:30.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-05-29T10:30:30.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:30:30.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:30:30.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:30:30.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:30:30.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:30:30.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:30:30.781 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:30:30.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:30:30.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:30:30.781 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:30:30.781 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:30:30.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:30:30.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:30:30.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:30:30.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:30:30.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:30:31.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:30:31.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:30:31.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:30:31.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:30:31.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:30:31.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:30:31.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:30:31.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:30:04
2026-05-29T10:30:31.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71602, datetime.datetime(2026, 5, 29, 10, 30, 4), datetime.datetime(2026, 5, 29, 10, 30, 1), 'salt', 10.11, 71.52, None, 12.85, 59.76, 4.91, 833.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:30:31.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:30:31.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:30:31.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:30:01, diff=30.110232s, valid=True
2026-05-29T10:30:31.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:30:31.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:30:31.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:29:12, diff=79.113372s, valid=True
2026-05-29T10:30:31.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:30:31.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:30:31.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:30:00, diff=31.122291s, valid=True
2026-05-29T10:30:31.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:30:31.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:30:31.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:30:31.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:30:31.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:30:31.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:30:31.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:29:12, diff=79.138835s, valid=True
2026-05-29T10:30:31.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:30:31.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:30:31.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:30:31.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976073.140362s, valid=True
2026-05-29T10:30:31.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:30:31.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:30:31.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:30:31.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:30:31.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:30:31.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:30:31.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:30:31.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:30:31.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:30:31.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:30:31.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:30:31.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:30:31.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:30:31.494 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:30:31.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:30:32.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:30:32.190 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:30:32.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:30:32.191 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:30:32.191 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:30:32.408 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:30:32.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:31:02.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:31:02.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:31:02.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:31:02.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:31:02.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:31:02.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:31:02.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-05-29T10:31:02.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:31:02.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-05-29T10:31:02.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:31:02.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:31:02.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:31:02.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-05-29T10:31: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-05-29T10:31:05.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:31:05.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:31:05.483 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:31:05.483 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:31:05.492 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:31:05.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:31:05.504 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:31:05.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:31:05.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:31:05.504 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:31:05.504 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:31:05.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:31:05.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:31:05.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:31:05.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:31:05.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:31:05.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:31:05.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:31:05.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:31:05.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:31:05.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:31:05.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:31:05.760 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:31:05.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:31:04
2026-05-29T10:31:05.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71604, datetime.datetime(2026, 5, 29, 10, 31, 4), datetime.datetime(2026, 5, 29, 10, 31, 3), 'salt', 10.21, 70.09, None, 12.07, 56.49, 5.2, 833.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:31:05.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:31:05.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:31:05.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:31:03, diff=2.824004s, valid=True
2026-05-29T10:31:05.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:31:05.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:31:05.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:31:12, diff=-6.173109s, valid=True
2026-05-29T10:31:05.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:31:05.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:31:05.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:31:01, diff=4.833484s, valid=True
2026-05-29T10:31:05.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:31:05.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:31:05.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:31:05.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:31:05.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:31:05.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:31:05.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:31:12, diff=-6.163471s, valid=True
2026-05-29T10:31:05.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:31:05.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:31:05.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:31:05.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976107.837187s, valid=True
2026-05-29T10:31:05.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:31:05.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:31:05.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:31:05.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:31:05.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:31:05.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:31:05.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:31:05.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:31:05.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:31:06.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:31:06.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:31:06.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:31:06.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:31:06.234 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:31:06.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:31:06.794 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:31:06.894 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:31:06.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:31:06.894 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:31:06.894 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:31:06.962 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:31:06.962 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:31:36.977 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:31:36.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:31:36.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:31:37.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:31:37.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:31:37.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:31:37.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-05-29T10:31:37.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:31:37.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-05-29T10:31:37.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:31:37.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:31:37.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:31:37.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-05-29T10:31:40.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-05-29T10:31:40.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:31:40.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:31:40.028 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:31:40.028 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:31:40.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:31:40.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:31:40.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:31:40.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:31:40.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:31:40.049 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:31:40.049 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:31:40.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:31:40.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:31:40.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:31:40.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:31:40.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:31:40.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:31:40.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:31:40.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:31:40.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:31:40.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:31:40.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:31:40.306 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:31:40.367 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:31:34
2026-05-29T10:31:40.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71605, datetime.datetime(2026, 5, 29, 10, 31, 34), datetime.datetime(2026, 5, 29, 10, 31, 34), 'salt', 10.11, 70.36, None, 11.75, 43.52, 5.15, 833.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:31:40.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:31:40.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:31:40.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:31:34, diff=6.373316s, valid=True
2026-05-29T10:31:40.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:31:40.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:31:40.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:32:12, diff=-31.623844s, valid=True
2026-05-29T10:31:40.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:31:40.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:31:40.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:31:32, diff=8.382859s, valid=True
2026-05-29T10:31:40.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:31:40.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:31:40.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:31:40.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:31:40.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:31:40.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:31:40.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:32:12, diff=-31.614103s, valid=True
2026-05-29T10:31:40.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:31:40.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:31:40.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:31:40.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976142.386548s, valid=True
2026-05-29T10:31:40.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:31:40.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:31:40.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:31:40.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:31:40.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:31:40.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:31:40.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:31:40.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:31:40.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:31:40.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:31:40.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:31:40.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:31:40.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:31:40.715 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:31:40.927 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:31:41.283 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:31:41.388 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:31:41.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:31:41.388 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:31:41.388 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:31:41.569 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:31:41.570 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:32:11.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:32:11.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:32:11.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:32:11.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:32:11.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:32:11.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:32:11.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-05-29T10:32:11.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:32:11.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-05-29T10:32:11.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:32:11.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:32:11.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:32:11.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-05-29T10:32:14.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-05-29T10:32:14.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:32:14.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:32:14.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:32:14.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:32:14.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:32:14.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:32:14.624 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:32:14.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:32:14.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:32:14.624 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:32:14.625 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:32:14.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:32:14.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:32:14.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:32:14.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:32:14.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:32:14.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:32:14.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:32:14.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:32:14.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:32:14.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:32:14.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:32:14.952 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:32:15.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:32:05
2026-05-29T10:32:15.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71606, datetime.datetime(2026, 5, 29, 10, 32, 5), datetime.datetime(2026, 5, 29, 10, 32, 4), 'salt', 10.07, 70.42, None, 15.17, 48.05, 5.12, 833.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:32:15.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:32:15.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:32:15.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:32:04, diff=11.020617s, valid=True
2026-05-29T10:32:15.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:32:15.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:32:15.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:32:12, diff=3.023523s, valid=True
2026-05-29T10:32:15.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:32:15.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:32:15.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:32:04, diff=11.033727s, valid=True
2026-05-29T10:32:15.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:32:15.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:32:15.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:32:15.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:32:15.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:32:15.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:32:15.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:32:12, diff=3.038155s, valid=True
2026-05-29T10:32:15.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:32:15.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:32:15.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:32:15.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976177.039142s, valid=True
2026-05-29T10:32:15.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:32:15.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:32:15.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:32:15.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:32:15.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:32:15.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:32:15.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:32:15.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:32:15.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:32:15.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:32:15.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:32:15.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:32:15.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:32:15.360 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:32:15.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:32:15.920 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:32:16.026 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:32:16.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:32:16.026 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:32:16.026 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:32:16.193 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:32:16.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:32:46.220 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:32:46.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:32:46.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:32:46.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:32:46.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:32:46.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:32:46.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-05-29T10:32:46.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:32:46.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-05-29T10:32:46.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:32:46.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:32:46.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:32:46.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T10:32:49.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-05-29T10:32:49.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:32:49.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:32:49.170 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:32:49.171 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:32:49.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:32:49.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:32:49.189 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:32:49.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:32:49.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:32:49.189 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:32:49.189 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:32:49.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:32:49.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:32:49.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:32:49.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:32:49.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:32:49.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:32:49.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:32:49.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:32:49.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:32:49.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:32:49.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:32:49.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:32:49.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:32:35
2026-05-29T10:32:49.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71607, datetime.datetime(2026, 5, 29, 10, 32, 35), datetime.datetime(2026, 5, 29, 10, 32, 35), 'salt', 9.87, 70.85, None, 10.02, 53.18, 5.03, 834.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:32:49.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:32:49.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:32:49.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:32:35, diff=14.510374s, valid=True
2026-05-29T10:32:49.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:32:49.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:32:49.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:33:12, diff=-22.486754s, valid=True
2026-05-29T10:32:49.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:32:49.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:32:49.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:32:31, diff=18.519964s, valid=True
2026-05-29T10:32:49.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:32:49.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:32:49.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:32:49.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:32:49.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:32:49.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:32:49.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:33:12, diff=-22.476985s, valid=True
2026-05-29T10:32:49.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:32:49.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:32:49.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:32:49.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976211.523681s, valid=True
2026-05-29T10:32:49.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:32:49.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:32:49.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:32:49.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:32:49.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:32:49.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:32:49.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:32:49.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:32:49.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:32:49.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:32:49.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:32:49.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:32:49.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:32:49.842 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:32:50.062 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:32:50.403 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:32:50.559 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:32:50.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:32:50.560 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:32:50.560 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:32:50.719 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:32:50.719 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:33:20.748 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:33:20.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:33:20.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:33:21.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:33:21.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:33:21.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:33:21.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-05-29T10:33:21.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:33:21.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-05-29T10:33:21.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:33:21.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:33:21.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:33: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-05-29T10:33:24.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-05-29T10:33:24.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:33:24.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:33:24.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:33:24.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:33:24.059 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:33:24.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:33:24.071 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:33:24.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:33:24.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:33:24.071 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:33:24.071 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:33:24.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:33:24.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:33:24.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:33:24.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:33:24.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:33:24.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:33:24.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:33:24.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:33:24.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:33:24.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:33:24.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:33:24.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:33:24.382 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:33:05
2026-05-29T10:33:24.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71608, datetime.datetime(2026, 5, 29, 10, 33, 5), datetime.datetime(2026, 5, 29, 10, 33, 5), 'salt', 10.04, 72.08, None, 14.47, 49.08, 4.79, 834.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:33:24.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:33:24.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:33:24.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:33:05, diff=19.388198s, valid=True
2026-05-29T10:33:24.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:33:24.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:33:24.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:33:12, diff=12.390997s, valid=True
2026-05-29T10:33:24.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:33:24.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:33:24.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:33:01, diff=23.397514s, valid=True
2026-05-29T10:33:24.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:33:24.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:33:24.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:33:24.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:33:24.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:33:24.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:33:24.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:33:12, diff=12.400542s, valid=True
2026-05-29T10:33:24.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:33:24.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:33:24.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:33:24.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976246.401205s, valid=True
2026-05-29T10:33:24.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:33:24.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:33:24.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:33:24.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:33:24.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:33:24.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:33:24.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:33:24.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:33:24.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:33:24.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:33:24.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:33:24.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:33:24.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:33:24.718 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:33:24.926 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:33:25.271 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:33:25.371 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:33:25.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:33:25.372 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:33:25.372 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:33:25.440 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:33:25.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:33:55.469 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:33:55.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:33:55.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:33:55.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:33:55.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:33:55.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:33:55.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-05-29T10:33:55.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:33:55.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-05-29T10:33:55.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:33:55.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:33:55.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:33:55.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T10:33:58.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-05-29T10:33:58.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:33:58.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:33:58.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:33:58.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:33:58.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:33:58.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:33:58.544 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:33:58.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:33:58.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:33:58.544 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:33:58.544 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:33:58.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:33:58.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:33:58.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:33:58.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:33:58.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:33:58.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:33:58.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:33:58.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:33:58.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:33:58.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:33:58.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:33:58.856 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:33:58.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:33:35
2026-05-29T10:33:58.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71609, datetime.datetime(2026, 5, 29, 10, 33, 35), datetime.datetime(2026, 5, 29, 10, 33, 35), 'salt', 10.2, 71.12, None, 15.95, 34.81, 4.98, 834.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:33:58.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:33:58.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:33:58.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:33:35, diff=23.92424s, valid=True
2026-05-29T10:33:58.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:33:58.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:33:58.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:34:12, diff=-13.071721s, valid=True
2026-05-29T10:33:58.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:33:58.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:33:58.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:33:32, diff=26.936994s, valid=True
2026-05-29T10:33:58.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:33:58.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:33:58.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:33:58.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:33:58.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:33:58.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:33:58.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:34:12, diff=-13.05869s, valid=True
2026-05-29T10:33:58.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:33:58.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:33:58.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:33:58.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976280.942251s, valid=True
2026-05-29T10:33:58.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:33:58.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:33:58.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:33:58.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:33:58.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:33:59.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:33:59.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:33:59.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:33:59.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:33:59.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:33:59.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:33:59.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:33:59.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:33:59.322 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:33:59.543 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:34:00.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:34:00.276 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:34:00.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:34:00.276 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:34:00.276 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:34:00.489 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:34:00.489 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:34:30.520 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:34:30.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:34:30.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:34:30.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:34:30.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:34:31.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:34:31.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-05-29T10:34:31.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:34: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-05-29T10:34:31.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:34:31.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:34:31.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:34:31.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-05-29T10:34:33.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-05-29T10:34:33.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:34:33.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:34:33.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:34:33.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:34:33.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:34:33.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:34:33.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:34:33.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:34:33.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:34:33.774 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:34:33.774 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:34:33.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:34:33.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:34:33.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:34:33.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:34:33.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:34:33.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:34:33.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:34:34.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:34:34.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:34:34.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:34:34.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:34:34.039 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:34:34.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:34:06
2026-05-29T10:34:34.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71610, datetime.datetime(2026, 5, 29, 10, 34, 6), datetime.datetime(2026, 5, 29, 10, 34, 5), 'salt', 10.3, 70.95, None, 16.59, 42.98, 5.02, 833.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:34:34.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:34:34.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:34:34.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:34:05, diff=29.108639s, valid=True
2026-05-29T10:34:34.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:34:34.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:34:34.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:34:12, diff=22.111538s, valid=True
2026-05-29T10:34:34.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:34:34.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:34:34.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:34:02, diff=32.118294s, valid=True
2026-05-29T10:34:34.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:34:34.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:34:34.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:34:34.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:34:34.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:34:34.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:34:34.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:34:12, diff=22.12135s, valid=True
2026-05-29T10:34:34.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:34:34.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:34:34.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:34:34.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976316.12201s, valid=True
2026-05-29T10:34:34.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:34:34.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:34:34.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:34:34.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:34:34.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:34:34.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:34:34.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:34:34.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:34:34.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:34:34.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:34:34.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:34:34.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:34:34.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:34:34.450 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:34:34.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:34:35.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:34:35.129 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:34:35.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:34:35.129 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:34:35.129 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:34:35.196 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:34:35.196 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:35:05.216 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:35:05.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:35:05.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:35:05.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:35:05.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:35:05.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:35:05.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-05-29T10:35:05.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:35:05.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-05-29T10:35:05.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:35:05.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:35:05.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:35:05.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-05-29T10:35:08.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-05-29T10:35:08.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:35:08.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:35:08.286 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:35:08.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:35:08.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:35:08.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:35:08.308 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:35:08.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:35:08.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:35:08.308 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:35:08.309 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:35:08.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:35:08.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:35:08.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:35:08.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:35:08.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:35:08.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:35:08.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:35:08.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:35:08.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:35:08.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:35:08.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:35:08.574 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:35:08.637 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:35:07
2026-05-29T10:35:08.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71612, datetime.datetime(2026, 5, 29, 10, 35, 7), datetime.datetime(2026, 5, 29, 10, 35, 6), 'salt', 10.57, 68.56, None, 12.99, 68.3, 5.53, 833.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:35:08.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:35:08.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:35:08.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:35:06, diff=2.643605s, valid=True
2026-05-29T10:35:08.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:35:08.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:35:08.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:35:12, diff=-3.353558s, valid=True
2026-05-29T10:35:08.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:35:08.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:35:08.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:35:02, diff=6.653054s, valid=True
2026-05-29T10:35:08.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:35:08.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:35:08.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:35:08.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:35:08.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:35:08.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:35:08.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:35:12, diff=-3.343956s, valid=True
2026-05-29T10:35:08.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:35:08.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:35:08.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:35:08.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976350.656695s, valid=True
2026-05-29T10:35:08.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:35:08.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:35:08.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:35:08.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:35:08.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:35:08.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:35:08.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:35:08.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:35:08.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:35:08.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:35:08.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:35:08.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:35:08.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:35:08.983 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:35:09.323 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:35:09.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:35:09.808 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:35:09.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:35:09.808 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:35:09.808 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:35:09.877 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:35:09.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:35:39.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:35:39.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:35:39.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:35:40.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:35:40.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:35:40.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:35:40.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-05-29T10:35:40.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:35:40.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-05-29T10:35:40.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:35:40.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:35:40.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:35:40.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-05-29T10:35:43.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-05-29T10:35:43.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:35:43.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:35:43.050 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:35:43.050 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:35:43.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:35:43.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:35:43.071 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:35:43.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:35:43.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:35:43.071 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:35:43.071 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:35:43.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:35:43.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:35:43.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:35:43.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:35:43.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:35:43.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:35:43.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:35:43.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:35:43.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:35:43.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:35:43.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:35:43.354 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:35:43.416 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:35:37
2026-05-29T10:35:43.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71613, datetime.datetime(2026, 5, 29, 10, 35, 37), datetime.datetime(2026, 5, 29, 10, 35, 36), 'salt', 10.57, 68.0, None, 12.42, 60.79, 5.65, 833.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:35:43.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:35:43.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:35:43.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:35:36, diff=7.42267s, valid=True
2026-05-29T10:35:43.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:35:43.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:35:43.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:36:12, diff=-28.574451s, valid=True
2026-05-29T10:35:43.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:35:43.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:35:43.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:35:33, diff=10.432282s, valid=True
2026-05-29T10:35:43.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:35:43.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:35:43.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:35:43.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:35:43.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:35:43.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:35:43.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:36:12, diff=-28.56467s, valid=True
2026-05-29T10:35:43.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:35:43.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:35:43.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:35:43.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976385.436008s, valid=True
2026-05-29T10:35:43.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:35:43.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:35:43.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:35:43.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:35:43.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:35:43.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:35:43.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:35:43.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:35:43.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:35:43.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:35:43.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:35:43.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:35:43.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:35:43.773 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:35:43.981 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:35:44.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:35:44.441 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:35:44.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:35:44.441 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:35:44.441 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:35:44.594 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:35:44.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:36:14.624 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:36:14.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:36:14.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:36:14.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:36:14.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:36:15.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:36:15.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-05-29T10:36:15.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:36:15.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-05-29T10:36:15.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:36:15.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:36:15.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:36:15.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-05-29T10:36:17.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-05-29T10:36:17.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:36:17.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:36:17.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:36:17.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:36:17.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:36:17.848 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:36:17.848 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:36:17.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:36:17.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:36:17.849 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:36:17.849 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:36:17.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:36:17.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:36:17.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:36:18.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:36:18.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:36:18.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:36:18.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:36:18.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:36:18.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:36:18.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:36:18.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:36:18.121 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:36:18.190 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:36:07
2026-05-29T10:36:18.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71614, datetime.datetime(2026, 5, 29, 10, 36, 7), datetime.datetime(2026, 5, 29, 10, 36, 7), 'salt', 10.3, 67.37, None, 15.07, 46.26, 5.77, 833.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:36:18.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:36:18.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:36:18.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:36:07, diff=11.196697s, valid=True
2026-05-29T10:36:18.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:36:18.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:36:18.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:36:12, diff=6.199563s, valid=True
2026-05-29T10:36:18.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:36:18.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:36:18.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:36:05, diff=13.206288s, valid=True
2026-05-29T10:36:18.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:36:18.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:36:18.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:36:18.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:36:18.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:36:18.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:36:18.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:36:12, diff=6.209343s, valid=True
2026-05-29T10:36:18.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:36:18.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:36:18.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:36:18.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976420.209998s, valid=True
2026-05-29T10:36:18.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:36:18.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:36:18.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:36:18.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:36:18.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:36:18.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:36:18.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:36:18.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:36:18.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:36:18.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:36:18.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:36:18.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:36:18.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:36:18.594 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:36:18.799 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:36:19.139 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:36:19.239 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:36:19.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:36:19.239 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:36:19.239 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:36:19.509 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:36:19.509 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:36:49.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:36:49.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:36:49.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:36:49.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:36:49.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:36:49.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:36:49.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-05-29T10:36:49.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:36:49.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-05-29T10:36:49.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:36:49.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:36:49.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:36:49.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-05-29T10:36:52.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T10:36:52.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:36:52.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:36:52.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:36:52.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:36:52.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:36:52.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:36:52.627 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:36:52.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:36:52.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:36:52.627 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:36:52.627 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:36:52.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:36:52.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:36:52.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:36:52.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:36:52.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:36:52.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:36:52.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:36:52.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:36:52.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:36:52.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:36:52.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:36:52.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:36:52.942 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:36:37
2026-05-29T10:36:52.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71615, datetime.datetime(2026, 5, 29, 10, 36, 37), datetime.datetime(2026, 5, 29, 10, 36, 37), 'salt', 10.17, 67.47, None, 11.86, 53.75, 5.74, 833.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:36:52.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:36:52.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:36:52.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:36:37, diff=15.949012s, valid=True
2026-05-29T10:36:52.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:36:52.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:36:52.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:37:12, diff=-19.046658s, valid=True
2026-05-29T10:36:52.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:36:52.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:36:52.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:36:36, diff=16.959937s, valid=True
2026-05-29T10:36:52.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:36:52.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:36:52.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:36:52.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:36:52.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:36:52.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:36:52.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:37:12, diff=-19.036974s, valid=True
2026-05-29T10:36:52.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:36:52.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:36:52.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:36:52.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976454.964048s, valid=True
2026-05-29T10:36:52.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:36:52.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:36:52.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:36:52.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:36:52.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:36:53.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:36:53.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:36:53.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:36:53.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:36:53.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:36:53.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:36:53.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:36:53.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:36:53.296 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:36:53.509 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:36:53.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:36:53.963 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:36:53.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:36:53.963 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:36:53.963 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:36:54.030 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:36:54.030 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:37:24.060 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:37:24.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:37:24.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:37:24.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:37:24.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:37:24.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:37:24.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-05-29T10:37:24.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:37:24.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-05-29T10:37:24.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:37:24.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:37:24.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:37:24.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-05-29T10:37:27.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-05-29T10:37:27.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:37:27.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:37:27.323 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:37:27.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:37:27.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:37:27.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:37:27.342 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:37:27.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:37:27.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:37:27.343 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:37:27.343 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:37:27.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:37:27.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:37:27.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:37:27.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:37:27.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:37:27.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:37:27.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:37:27.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:37:27.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:37:27.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:37:27.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:37:27.607 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:37:27.667 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:37:07
2026-05-29T10:37:27.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71616, datetime.datetime(2026, 5, 29, 10, 37, 7), datetime.datetime(2026, 5, 29, 10, 37, 7), 'salt', 10.14, 70.62, None, 13.23, 64.87, 5.09, 833.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:37:27.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:37:27.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:37:27.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:37:07, diff=20.673232s, valid=True
2026-05-29T10:37:27.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:37:27.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:37:27.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:37:12, diff=15.676099s, valid=True
2026-05-29T10:37:27.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:37:27.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:37:27.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:37:03, diff=24.682793s, valid=True
2026-05-29T10:37:27.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:37:27.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:37:27.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:37:27.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:37:27.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:37:27.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:37:27.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:37:12, diff=15.685868s, valid=True
2026-05-29T10:37:27.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:37:27.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:37:27.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:37:27.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976489.686516s, valid=True
2026-05-29T10:37:27.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:37:27.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:37:27.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:37:27.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:37:27.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:37:27.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:37:27.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:37:27.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:37:27.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:37:27.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:37:27.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:37:27.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:37:28.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:37:28.074 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:37:28.276 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:37:28.615 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:37:28.718 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:37:28.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:37:28.718 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:37:28.718 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:37:28.979 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:37:28.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:37:59.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:37:59.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:37:59.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:37:59.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:37:59.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:37:59.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:37:59.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T10:37:59.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:37:59.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-05-29T10:37:59.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:37:59.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:37:59.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:37:59.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T10:38:02.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-05-29T10:38:02.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:38:02.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:38:02.474 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:38:02.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:38:02.483 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:38:02.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:38:02.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:38:02.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:38:02.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:38:02.495 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:38:02.495 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:38:02.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:38:02.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:38:02.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:38:02.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:38:02.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:38:02.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:38:02.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:38:02.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:38:02.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:38:02.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:38:02.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:38:02.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:38:02.802 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:37:38
2026-05-29T10:38:02.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71617, datetime.datetime(2026, 5, 29, 10, 37, 38), datetime.datetime(2026, 5, 29, 10, 37, 37), 'salt', 10.24, 72.01, None, 13.27, 68.67, 4.82, 833.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:38:02.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:38:02.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:38:02.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:37:37, diff=25.808226s, valid=True
2026-05-29T10:38:02.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:38:02.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:38:02.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:38:12, diff=-9.18894s, valid=True
2026-05-29T10:38:02.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:38:02.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:38:02.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:37:34, diff=28.817657s, valid=True
2026-05-29T10:38:02.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:38:02.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:38:02.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:38:02.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:38:02.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:38:02.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:38:02.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:38:12, diff=-9.17929s, valid=True
2026-05-29T10:38:02.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:38:02.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:38:02.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:38:02.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976524.821354s, valid=True
2026-05-29T10:38:02.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:38:02.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:38:02.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:38:02.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:38:02.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:38:02.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:38:02.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:38:02.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:38:02.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:38:02.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:38:03.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:38:03.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:38:03.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:38:03.140 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:38:03.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:38:03.669 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:38:03.766 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:38:03.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:38:03.767 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:38:03.767 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:38:03.921 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:38:03.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:38:33.951 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:38:33.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:38:33.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:38:34.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:38:34.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:38:34.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:38:34.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T10:38:34.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:38:34.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-05-29T10:38:34.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:38:34.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:38:34.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:38:34.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-05-29T10:38:37.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-05-29T10:38:37.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:38:37.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:38:37.408 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:38:37.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:38:37.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:38:37.427 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:38:37.427 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:38:37.428 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:38:37.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:38:37.428 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:38:37.428 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:38:37.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:38:37.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:38:37.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:38:37.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:38:37.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:38:37.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:38:37.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:38:37.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:38:37.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:38:37.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:38:37.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:38:37.747 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:38:37.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:38:08
2026-05-29T10:38:37.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71618, datetime.datetime(2026, 5, 29, 10, 38, 8), datetime.datetime(2026, 5, 29, 10, 38, 8), 'salt', 9.97, 71.18, None, 11.65, 56.56, 4.97, 833.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:38:37.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:38:37.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:38:37.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:38:08, diff=29.811576s, valid=True
2026-05-29T10:38:37.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:38:37.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:38:37.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:38:12, diff=25.814363s, valid=True
2026-05-29T10:38:37.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:38:37.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:38:37.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:38:04, diff=33.82084s, valid=True
2026-05-29T10:38:37.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:38:37.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:38:37.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:38:37.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:38:37.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:38:37.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:38:37.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:38:12, diff=25.82383s, valid=True
2026-05-29T10:38:37.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:38:37.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:38:37.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:38:37.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976559.824474s, valid=True
2026-05-29T10:38:37.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:38:37.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:38:37.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:38:37.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:38:37.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:38:37.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:38:37.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:38:37.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:38:37.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:38:37.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:38:38.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:38:38.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:38:38.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:38:38.140 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:38:38.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:38:38.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:38:38.764 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:38:38.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:38:38.764 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:38:38.764 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:38:38.949 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:38:38.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:39:08.968 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:39:08.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:39:08.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:39:09.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:39:09.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:39:09.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:39:09.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-05-29T10:39:09.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:39:09.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-05-29T10:39:09.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:39:09.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:39:09.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:39:09.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-05-29T10:39:12.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-05-29T10:39:12.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:39:12.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:39:12.406 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:39:12.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:39:12.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:39:12.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:39:12.427 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:39:12.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:39:12.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:39:12.427 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:39:12.427 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:39:12.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:39:12.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:39:12.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:39:12.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:39:12.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:39:12.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:39:12.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:39:12.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:39:12.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:39:12.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:39:12.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:39:12.689 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:39:12.752 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:39:08
2026-05-29T10:39:12.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71620, datetime.datetime(2026, 5, 29, 10, 39, 8), datetime.datetime(2026, 5, 29, 10, 39, 8), 'salt', 10.24, 72.24, None, 14.15, 64.4, 4.77, 833.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:39:12.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:39:12.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:39:12.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:39:08, diff=4.75826s, valid=True
2026-05-29T10:39:12.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:39:12.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:39:12.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:39:12, diff=0.761103s, valid=True
2026-05-29T10:39:12.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:39:12.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:39:12.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:39:04, diff=8.767727s, valid=True
2026-05-29T10:39:12.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:39:12.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:39:12.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:39:12.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:39:12.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:39:12.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:39:12.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:39:12, diff=0.770781s, valid=True
2026-05-29T10:39:12.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:39:12.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:39:12.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:39:12.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976594.771437s, valid=True
2026-05-29T10:39:12.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:39:12.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:39:12.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:39:12.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:39:12.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:39:12.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:39:12.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:39:12.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:39:12.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:39:12.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:39:12.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:39:13.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:39:13.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:39:13.092 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:39:13.289 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:39:13.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:39:13.725 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:39:13.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:39:13.725 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:39:13.725 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:39:13.982 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:39:13.982 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:39:43.999 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:39:43.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:39:44.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:39:44.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:39:44.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:39:45.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:39:45.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-05-29T10:39:45.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:39:45.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-05-29T10:39:45.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:39:45.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:39:45.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:39:45.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-05-29T10:39:47.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-05-29T10:39:47.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:39:47.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:39:47.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:39:47.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:39:47.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:39:47.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:39:47.793 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:39:47.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:39:47.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:39:47.794 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:39:47.794 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:39:47.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:39:47.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:39:47.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:39:47.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:39:47.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:39:48.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:39:48.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:39:48.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:39:48.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:39:48.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:39:48.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:39:48.046 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:39:48.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:39:39
2026-05-29T10:39:48.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71621, datetime.datetime(2026, 5, 29, 10, 39, 39), datetime.datetime(2026, 5, 29, 10, 39, 38), 'salt', 10.24, 71.88, None, 13.02, 60.32, 4.84, 833.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:39:48.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:39:48.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:39:48.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:39:38, diff=10.111151s, valid=True
2026-05-29T10:39:48.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:39:48.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:39:48.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:40:12, diff=-23.886038s, valid=True
2026-05-29T10:39:48.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:39:48.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:39:48.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:39:35, diff=13.120484s, valid=True
2026-05-29T10:39:48.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:39:48.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:39:48.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:39:48.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:39:48.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:39:48.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:39:48.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:40:12, diff=-23.876462s, valid=True
2026-05-29T10:39:48.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:39:48.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:39:48.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:39:48.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976630.124204s, valid=True
2026-05-29T10:39:48.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:39:48.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:39:48.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:39:48.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:39:48.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:39:48.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:39:48.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:39:48.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:39:48.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:39:48.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:39:48.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:39:48.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:39:48.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:39:48.440 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:39:48.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:39:48.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:39:49.066 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:39:49.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:39:49.066 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:39:49.066 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:39:49.766 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:39:49.766 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:40:19.796 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:40:19.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:40:19.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:40:20.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:40:20.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:40:20.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:40:20.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-05-29T10:40:20.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:40:20.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-05-29T10:40:20.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:40:20.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:40:20.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:40:20.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-05-29T10:40:23.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-05-29T10:40:23.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:40:23.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:40:23.053 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:40:23.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:40:23.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:40:23.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:40:23.088 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:40:23.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:40:23.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:40:23.088 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:40:23.088 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:40:23.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:40:23.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:40:23.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:40:23.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:40:23.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:40:23.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:40:23.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:40:23.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:40:23.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:40:23.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:40:23.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:40:23.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:40:23.407 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:40:09
2026-05-29T10:40:23.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71622, datetime.datetime(2026, 5, 29, 10, 40, 9), datetime.datetime(2026, 5, 29, 10, 40, 8), 'salt', 10.14, 70.39, None, 14.33, 57.52, 5.14, 833.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:40:23.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:40:23.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:40:23.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:40:08, diff=15.413164s, valid=True
2026-05-29T10:40:23.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:40:23.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:40:23.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:40:12, diff=11.416019s, valid=True
2026-05-29T10:40:23.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:40:23.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:40:23.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:40:06, diff=17.422564s, valid=True
2026-05-29T10:40:23.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:40:23.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:40:23.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:40:23.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:40:23.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:40:23.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:40:23.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:40:12, diff=11.425644s, valid=True
2026-05-29T10:40:23.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:40:23.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:40:23.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:40:23.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976665.426302s, valid=True
2026-05-29T10:40:23.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:40:23.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:40:23.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:40:23.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:40:23.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:40:23.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:40:23.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:40:23.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:40:23.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:40:23.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:40:23.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:40:23.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:40:23.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:40:23.744 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:40:23.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:40:24.342 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:40:24.443 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:40:24.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:40:24.443 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:40:24.443 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:40:24.510 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:40:24.510 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:40:54.540 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:40:54.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:40:54.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:40:54.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:40:54.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:40:54.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:40:54.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-05-29T10:40:54.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:40:54.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-05-29T10:40:54.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:40:54.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:40:54.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:40:54.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-05-29T10:40:57.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-05-29T10:40:57.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:40:57.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:40:57.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:40:57.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:40:57.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:40:57.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:40:57.391 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:40:57.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:40:57.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:40:57.391 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:40:57.391 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:40:57.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:40:57.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:40:57.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:40:57.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:40:57.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:40:57.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:40:57.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:40:57.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:40:57.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:40:57.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:40:57.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:40:57.642 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:40:57.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:40:39
2026-05-29T10:40:57.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71623, datetime.datetime(2026, 5, 29, 10, 40, 39), datetime.datetime(2026, 5, 29, 10, 40, 39), 'salt', 10.2, 69.09, None, 13.94, 46.03, 5.4, 833.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:40:57.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:40:57.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:40:57.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:40:39, diff=18.706439s, valid=True
2026-05-29T10:40:57.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:40:57.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:40:57.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:41:12, diff=-14.290671s, valid=True
2026-05-29T10:40:57.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:40:57.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:40:57.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:40:37, diff=20.716019s, valid=True
2026-05-29T10:40:57.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:40:57.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:40:57.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:40:57.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:40:57.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:40:57.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:40:57.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:41:12, diff=-14.280957s, valid=True
2026-05-29T10:40:57.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:40:57.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:40:57.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:40:57.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976699.719715s, valid=True
2026-05-29T10:40:57.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:40:57.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:40:57.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:40:57.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:40:57.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:40:57.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:40:57.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:40:57.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:40:57.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:40:57.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:40:57.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:40:57.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:40:57.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:40:58.040 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:40:58.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:40:58.578 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:40:58.678 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:40:58.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:40:58.678 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:40:58.678 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:40:58.745 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:40:58.745 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:41:28.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:41:28.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:41:28.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:41:29.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:41:29.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:41:29.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:41: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-05-29T10:41:29.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:41:29.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-05-29T10:41:29.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:41:29.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:41:29.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:41:29.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-05-29T10:41:32.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-05-29T10:41:32.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:41:32.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:41:32.406 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:41:32.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:41:32.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:41:32.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:41:32.427 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:41:32.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:41:32.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:41:32.427 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:41:32.427 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:41:32.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:41:32.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:41:32.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:41:32.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:41:32.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:41:32.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:41:32.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:41:32.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:41:32.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:41:32.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:41:32.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:41:32.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:41:32.743 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:41:09
2026-05-29T10:41:32.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71624, datetime.datetime(2026, 5, 29, 10, 41, 9), datetime.datetime(2026, 5, 29, 10, 41, 9), 'salt', 10.3, 65.61, None, 11.4, 51.94, 6.15, 833.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:41:32.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:41:32.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:41:32.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:41:09, diff=23.749724s, valid=True
2026-05-29T10:41:32.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:41:32.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:41:32.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:41:12, diff=20.752703s, valid=True
2026-05-29T10:41:32.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:41:32.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:41:32.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:41:08, diff=24.759361s, valid=True
2026-05-29T10:41:32.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:41:32.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:41:32.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:41:32.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:41:32.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:41:32.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:41:32.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:41:12, diff=20.762513s, valid=True
2026-05-29T10:41:32.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:41:32.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:41:32.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:41:32.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976734.763194s, valid=True
2026-05-29T10:41:32.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:41:32.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:41:32.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:41:32.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:41:32.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:41:32.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:41:32.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:41:32.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:41:32.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:41:32.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:41:32.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:41:33.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:41:33.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:41:33.161 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:41:33.458 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:41:33.800 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:41:33.913 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:41:33.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:41:33.914 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:41:33.914 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:41:34.436 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:41:34.436 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:42:04.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:42:04.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:42:04.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:42:04.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:42:04.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:42:05.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:42:05.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-05-29T10:42:05.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:42:05.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-05-29T10:42:05.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:42:05.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:42:05.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:42:05.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-05-29T10:42:07.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-05-29T10:42:07.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:42:07.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:42:07.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:42:07.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:42:07.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:42:07.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:42:07.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:42:07.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:42:07.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:42:07.749 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:42:07.749 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:42:07.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:42:07.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:42:07.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:42:07.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:42:07.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:42:07.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:42:07.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:42:08.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:42:08.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:42:08.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:42:08.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:42:08.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:42:08.090 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:41:40
2026-05-29T10:42:08.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71625, datetime.datetime(2026, 5, 29, 10, 41, 40), datetime.datetime(2026, 5, 29, 10, 41, 39), 'salt', 10.5, 65.84, None, 11.86, 49.24, 6.11, 833.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:42:08.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:42:08.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:42:08.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:41:39, diff=29.096545s, valid=True
2026-05-29T10:42:08.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:42:08.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:42:08.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:42:12, diff=-3.900635s, valid=True
2026-05-29T10:42:08.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:42:08.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:42:08.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:41:35, diff=33.106121s, valid=True
2026-05-29T10:42:08.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:42:08.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:42:08.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:42:08.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:42:08.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:42:08.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:42:08.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:42:12, diff=-3.890713s, valid=True
2026-05-29T10:42:08.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:42:08.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:42:08.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:42:08.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976770.109965s, valid=True
2026-05-29T10:42:08.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:42:08.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:42:08.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:42:08.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:42:08.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:42:08.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:42:08.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:42:08.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:42:08.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:42:08.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:42:08.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:42:08.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:42:08.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:42:08.441 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:42:08.645 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:42:08.999 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:42:09.098 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:42:09.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:42:09.098 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:42:09.098 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:42:09.168 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:42:09.168 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:42:39.198 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:42:39.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:42:39.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:42:39.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:42:39.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:42:39.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:42:39.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T10:42:39.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:42:39.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-05-29T10:42:39.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:42:39.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:42:39.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:42:39.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-05-29T10:42:42.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-05-29T10:42:42.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:42:42.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:42:42.597 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:42:42.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:42:42.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:42:42.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:42:42.618 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:42:42.618 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:42:42.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:42:42.619 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:42:42.619 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:42:42.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:42:42.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:42:42.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:42:42.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:42:42.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:42:42.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:42:42.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:42:42.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:42:42.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:42:42.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:42:42.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:42:42.874 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:42:42.933 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:42:40
2026-05-29T10:42:42.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71627, datetime.datetime(2026, 5, 29, 10, 42, 40), datetime.datetime(2026, 5, 29, 10, 42, 40), 'salt', 10.6, 65.97, None, 11.75, 44.57, 6.08, 833.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:42:42.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:42:42.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:42:42.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:42:40, diff=2.939257s, valid=True
2026-05-29T10:42:42.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:42:42.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:42:42.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:43:12, diff=-29.05788s, valid=True
2026-05-29T10:42:42.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:42:42.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:42:42.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:42:36, diff=6.948821s, valid=True
2026-05-29T10:42:42.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:42:42.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:42:42.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:42:42.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:42:42.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:42:42.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:42:42.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:43:12, diff=-29.048118s, valid=True
2026-05-29T10:42:42.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:42:42.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:42:42.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:42:42.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976804.952542s, valid=True
2026-05-29T10:42:42.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:42:42.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:42:42.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:42:42.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:42:42.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:42:43.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:42:43.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:42:43.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:42:43.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:42:43.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:42:43.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:42:43.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:42:43.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:42:43.345 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:42:43.558 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:42:43.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:42:43.993 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:42:43.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:42:43.993 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:42:43.993 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:42:44.222 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:42:44.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:43:14.255 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:43:14.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:43:14.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:43:14.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:43:14.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:43:14.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:43:14.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-05-29T10:43:14.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:43:14.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-05-29T10:43:14.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:43:14.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:43:14.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:43:14.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-05-29T10:43:17.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T10:43:17.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:43:17.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:43:17.279 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:43:17.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:43:17.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:43:17.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:43:17.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:43:17.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:43:17.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:43:17.300 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:43:17.301 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:43:17.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:43:17.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:43:17.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:43:17.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:43:17.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:43:17.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:43:17.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:43:17.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:43:17.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:43:17.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:43:17.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:43:17.548 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:43:17.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:43:10
2026-05-29T10:43:17.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71628, datetime.datetime(2026, 5, 29, 10, 43, 10), datetime.datetime(2026, 5, 29, 10, 43, 10), 'salt', 10.53, 66.21, None, 12.56, 59.1, 6.03, 833.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:43:17.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:43:17.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:43:17.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:43:10, diff=7.614898s, valid=True
2026-05-29T10:43:17.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:43:17.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:43:17.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:43:12, diff=5.617791s, valid=True
2026-05-29T10:43:17.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:43:17.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:43:17.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:43:06, diff=11.624428s, valid=True
2026-05-29T10:43:17.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:43:17.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:43:17.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:43:17.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:43:17.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:43:17.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:43:17.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:43:12, diff=5.627419s, valid=True
2026-05-29T10:43:17.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:43:17.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:43:17.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:43:17.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976839.62809s, valid=True
2026-05-29T10:43:17.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:43:17.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:43:17.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:43:17.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:43:17.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:43:17.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:43:17.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:43:17.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:43:17.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:43:17.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:43:17.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:43:17.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:43:17.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:43:17.943 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:43:18.140 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:43:18.473 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:43:18.573 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:43:18.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:43:18.573 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:43:18.573 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:43:18.747 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:43:18.747 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:43:48.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:43:48.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:43:48.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:43:49.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:43:49.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:43:50.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:43:50.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-05-29T10:43:50.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:43:50.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-05-29T10:43:50.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:43:50.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:43:50.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:43:50.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-05-29T10:43:52.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-05-29T10:43:52.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:43:52.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:43:52.501 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:43:52.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:43:52.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:43:52.522 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:43:52.522 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:43:52.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:43:52.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:43:52.523 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:43:52.523 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:43:52.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:43:52.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:43:52.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:43:52.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:43:52.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:43:52.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:43:52.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:43:52.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:43:52.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:43:52.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:43:52.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:43:52.776 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:43:52.833 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:43:40
2026-05-29T10:43:52.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71629, datetime.datetime(2026, 5, 29, 10, 43, 40), datetime.datetime(2026, 5, 29, 10, 43, 40), 'salt', 10.6, 68.23, None, 16.13, 40.42, 5.6, 833.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:43:52.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:43:52.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:43:52.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:43:40, diff=12.839883s, valid=True
2026-05-29T10:43:52.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:43:52.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:43:52.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:44:12, diff=-19.157191s, valid=True
2026-05-29T10:43:52.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:43:52.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:43:52.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:43:36, diff=16.849551s, valid=True
2026-05-29T10:43:52.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:43:52.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:43:52.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:43:52.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:43:52.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:43:52.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:43:52.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:44:12, diff=-19.147344s, valid=True
2026-05-29T10:43:52.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:43:52.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:43:52.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:43:52.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976874.853318s, valid=True
2026-05-29T10:43:52.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:43:52.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:43:52.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:43:52.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:43:52.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:43:52.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:43:52.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:43:52.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:43:52.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:43:53.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:43:53.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:43:53.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:43:53.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:43:53.239 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:43:53.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:43:53.775 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:43:53.877 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:43:53.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:43:53.878 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:43:53.878 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:43:53.945 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:43:53.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:44:23.975 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:44:23.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:44:23.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:44:24.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:44:24.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:44:24.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:44:24.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-05-29T10:44:24.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:44:24.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-05-29T10:44:24.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:44:24.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:44:24.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:44:24.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-05-29T10:44:27.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-05-29T10:44:27.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:44:27.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:44:27.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:44:27.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:44:27.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:44:27.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:44:27.567 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:44:27.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:44:27.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:44:27.568 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:44:27.568 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:44:27.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:44:27.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:44:27.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:44:27.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:44:27.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:44:27.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:44:27.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:44:27.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:44:27.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:44:27.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:44:27.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:44:27.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:44:27.880 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:44:11
2026-05-29T10:44:27.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71630, datetime.datetime(2026, 5, 29, 10, 44, 11), datetime.datetime(2026, 5, 29, 10, 44, 10), 'salt', 10.7, 67.66, None, 12.07, 57.95, 5.73, 833.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:44:27.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:44:27.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:44:27.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:44:10, diff=17.88693s, valid=True
2026-05-29T10:44:27.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:44:27.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:44:27.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:44:12, diff=15.889796s, valid=True
2026-05-29T10:44:27.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:44:27.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:44:27.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:44:07, diff=20.896542s, valid=True
2026-05-29T10:44:27.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:44:27.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:44:27.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:44:27.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:44:27.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:44:27.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:44:27.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:44:12, diff=15.899588s, valid=True
2026-05-29T10:44:27.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:44:27.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:44:27.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:44:27.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976909.90026s, valid=True
2026-05-29T10:44:27.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:44:27.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:44:27.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:44:27.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:44:27.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:44:27.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:44:27.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:44:27.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:44:27.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:44:28.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:44:28.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:44:28.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:44:28.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:44:28.218 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:44:28.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:44:28.746 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:44:28.846 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:44:28.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:44:28.847 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:44:28.847 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:44:28.913 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:44:28.914 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:44:58.944 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:44:58.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:44:58.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:44:59.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:44:59.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:44:59.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:44:59.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T10:44:59.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:44:59.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-05-29T10:44:59.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:44:59.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:44:59.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:44:59.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-05-29T10:45:02.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-05-29T10:45:02.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:45:02.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:45:02.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:45:02.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:45:02.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:45:02.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:45:02.178 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:45:02.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:45:02.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:45:02.178 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:45:02.178 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:45:02.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:45:02.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:45:02.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:45:02.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:45:02.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:45:02.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:45:02.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:45:02.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:45:02.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:45:02.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:45:02.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:45:02.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:45:02.567 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:44:41
2026-05-29T10:45:02.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71631, datetime.datetime(2026, 5, 29, 10, 44, 41), datetime.datetime(2026, 5, 29, 10, 44, 40), 'salt', 10.73, 66.84, None, 11.36, 43.8, 5.9, 833.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:45:02.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:45:02.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:45:02.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:44:40, diff=22.573357s, valid=True
2026-05-29T10:45:02.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:45:02.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:45:02.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:45:12, diff=-9.423811s, valid=True
2026-05-29T10:45:02.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:45:02.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:45:02.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:44:38, diff=24.582803s, valid=True
2026-05-29T10:45:02.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:45:02.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:45:02.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:45:02.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:45:02.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:45:02.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:45:02.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:45:12, diff=-9.414204s, valid=True
2026-05-29T10:45:02.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:45:02.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:45:02.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:45:02.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976944.586444s, valid=True
2026-05-29T10:45:02.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:45:02.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:45:02.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:45:02.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:45:02.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:45:02.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:45:02.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:45:02.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:45:02.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:45:02.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:45:02.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:45:02.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:45:02.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:45:02.912 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:45:03.133 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:45:03.501 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:45:03.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:45:03.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:45:03.611 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:45:03.611 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:45:03.771 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:45:03.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:45:33.801 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:45:33.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:45:33.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:45:34.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:45:34.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:45:34.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:45:34.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-05-29T10:45:34.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:45:34.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-05-29T10:45:34.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:45:34.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:45:34.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:45:34.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-05-29T10:45: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-05-29T10:45:36.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:45:36.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:45:36.703 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:45:36.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:45:36.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:45:36.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:45:36.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:45:36.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:45:36.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:45:36.725 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:45:36.725 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:45:36.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:45:36.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:45:36.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:45:36.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:45:36.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:45:36.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:45:36.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:45:36.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:45:36.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:45:36.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:45:36.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:45:36.982 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:45:37.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:45:11
2026-05-29T10:45:37.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71632, datetime.datetime(2026, 5, 29, 10, 45, 11), datetime.datetime(2026, 5, 29, 10, 45, 11), 'salt', 10.53, 65.21, None, 13.41, 41.07, 6.24, 833.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:45:37.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:45:37.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:45:37.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:45:11, diff=26.046747s, valid=True
2026-05-29T10:45:37.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:45:37.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:45:37.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:45:12, diff=25.04958s, valid=True
2026-05-29T10:45:37.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:45:37.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:45:37.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:45:10, diff=27.056225s, valid=True
2026-05-29T10:45:37.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:45:37.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:45:37.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:45:37.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:45:37.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:45:37.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:45:37.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:45:12, diff=25.059275s, valid=True
2026-05-29T10:45:37.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:45:37.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:45:37.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:45:37.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=976979.059969s, valid=True
2026-05-29T10:45:37.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:45:37.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:45:37.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:45:37.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:45:37.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:45:37.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:45:37.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:45:37.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:45:37.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:45:37.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:45:37.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:45:37.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:45:37.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:45:37.378 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:45:37.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:45:37.913 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:45:38.014 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:45:38.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:45:38.014 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:45:38.014 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:45:38.169 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:45:38.169 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:46:08.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:46:08.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:46:08.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:46:08.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:46:08.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:46:08.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:46: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-05-29T10:46:08.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:46: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-05-29T10:46:08.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:46:08.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:46:08.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:46:08.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-05-29T10:46:11.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-05-29T10:46:11.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:46:11.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:46:11.141 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:46:11.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:46:11.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:46:11.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:46:11.165 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:46:11.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:46:11.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:46:11.166 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:46:11.166 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:46:11.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:46:11.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:46:11.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:46:11.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:46:11.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:46:11.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:46:11.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:46:11.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:46:11.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:46:11.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:46:11.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:46:11.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:46:11.473 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:45:41
2026-05-29T10:46:11.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71633, datetime.datetime(2026, 5, 29, 10, 45, 41), datetime.datetime(2026, 5, 29, 10, 45, 41), 'salt', 10.67, 65.31, None, 12.18, 48.61, 6.23, 833.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:46:11.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:46:11.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:46:11.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:45:41, diff=30.479703s, valid=True
2026-05-29T10:46:11.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:46:11.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:46:11.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:46:12, diff=-0.517444s, valid=True
2026-05-29T10:46:11.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:46:11.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:46:11.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:45:41, diff=30.489221s, valid=True
2026-05-29T10:46:11.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:46:11.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:46:11.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:46:11.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:46:11.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:46:11.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:46:11.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:46:12, diff=-0.507698s, valid=True
2026-05-29T10:46:11.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:46:11.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:46:11.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:46:11.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977013.492968s, valid=True
2026-05-29T10:46:11.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:46:11.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:46:11.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:46:11.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:46:11.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:46:11.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:46:11.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:46:11.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:46:11.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:46:11.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:46:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:46:11.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:46:11.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:46:11.815 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:46:12.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:46:12.348 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:46:12.448 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:46:12.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:46:12.448 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:46:12.448 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:46:13.305 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:46:13.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:46:43.335 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:46:43.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:46:43.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:46:43.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:46:43.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:46:43.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:46:43.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-05-29T10:46:43.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:46:43.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-05-29T10:46:43.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:46:43.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:46:43.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:46:43.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-05-29T10:46:46.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-05-29T10:46:46.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:46:46.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:46:46.083 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:46:46.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:46:46.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:46:46.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:46:46.103 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:46:46.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:46:46.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:46:46.103 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:46:46.103 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:46:46.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:46:46.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:46:46.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:46:46.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:46:46.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:46:46.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:46:46.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:46:46.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:46:46.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:46:46.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:46:46.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:46:46.357 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:46:46.416 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:46:42
2026-05-29T10:46:46.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71635, datetime.datetime(2026, 5, 29, 10, 46, 42), datetime.datetime(2026, 5, 29, 10, 46, 41), 'salt', 11.06, 67.73, None, 11.93, 65.15, 5.72, 833.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:46:46.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:46:46.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:46:46.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:46:41, diff=5.423286s, valid=True
2026-05-29T10:46:46.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:46:46.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:46:46.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:47:12, diff=-25.573403s, valid=True
2026-05-29T10:46:46.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:46:46.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:46:46.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:46:38, diff=8.433311s, valid=True
2026-05-29T10:46:46.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:46:46.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:46:46.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:46:46.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:46:46.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:46:46.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:46:46.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:47:12, diff=-25.563639s, valid=True
2026-05-29T10:46:46.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:46:46.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:46:46.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:46:46.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977048.437028s, valid=True
2026-05-29T10:46:46.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:46:46.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:46:46.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:46:46.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:46:46.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:46:46.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:46:46.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:46:46.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:46:46.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:46:46.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:46:46.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:46:46.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:46:46.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:46:46.754 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:46:46.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:46:47.347 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:46:47.447 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:46:47.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:46:47.447 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:46:47.447 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:46:47.774 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:46:47.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:47:17.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:47:17.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:47:17.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:47:18.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:47:18.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:47:18.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:47:18.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T10:47:18.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:47:18.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-05-29T10:47:18.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:47:18.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:47:18.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:47:18.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-05-29T10:47:20.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-05-29T10:47:20.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:47:20.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:47:20.801 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:47:20.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:47:20.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:47:20.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:47:20.822 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:47:20.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:47:20.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:47:20.822 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:47:20.822 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:47:20.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:47:20.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:47:20.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:47:20.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:47:20.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:47:21.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:47:21.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:47:21.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:47:21.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:47:21.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:47:21.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:47:21.080 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:47:21.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:47:12
2026-05-29T10:47:21.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71636, datetime.datetime(2026, 5, 29, 10, 47, 12), datetime.datetime(2026, 5, 29, 10, 47, 11), 'salt', 11.3, 67.6, None, 11.89, 60.1, 5.77, 833.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:47:21.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:47:21.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:47:21.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:47:11, diff=10.145548s, valid=True
2026-05-29T10:47:21.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:47:21.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:47:21.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:47:12, diff=9.148418s, valid=True
2026-05-29T10:47:21.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:47:21.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:47:21.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:47:08, diff=13.15506s, valid=True
2026-05-29T10:47:21.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:47:21.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:47:21.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:47:21.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:47:21.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:47:21.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:47:21.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:47:12, diff=9.158173s, valid=True
2026-05-29T10:47:21.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:47:21.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:47:21.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:47:21.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977083.158832s, valid=True
2026-05-29T10:47:21.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:47:21.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:47:21.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:47:21.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:47:21.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:47:21.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:47:21.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:47:21.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:47:21.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:47:21.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:47:21.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:47:21.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:47:21.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:47:21.487 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:47:21.718 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:47:22.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:47:22.162 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:47:22.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:47:22.162 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:47:22.162 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:47:22.229 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:47:22.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:47:52.260 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:47:52.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:47:52.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:47:52.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:47:52.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:47:52.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:47:52.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-05-29T10:47:52.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:47:52.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-05-29T10:47:52.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:47:52.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:47:52.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:47:52.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-05-29T10:47:54.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-05-29T10:47:54.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:47:54.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:47:54.977 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:47:54.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:47:54.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:47:55.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:47:55.000 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:47:55.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:47:55.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:47:55.001 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:47:55.001 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:47:55.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:47:55.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:47:55.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:47:55.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:47:55.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:47:55.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:47:55.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:47:55.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:47:55.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:47:55.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:47:55.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:47:55.252 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:47:55.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:47:42
2026-05-29T10:47:55.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71637, datetime.datetime(2026, 5, 29, 10, 47, 42), datetime.datetime(2026, 5, 29, 10, 47, 42), 'salt', 11.43, 68.46, None, 13.94, 63.53, 5.59, 833.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:47:55.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:47:55.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:47:55.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:47:42, diff=13.31898s, valid=True
2026-05-29T10:47:55.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:47:55.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:47:55.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:48:12, diff=-16.678127s, valid=True
2026-05-29T10:47:55.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:47:55.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:47:55.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:47:38, diff=17.328487s, valid=True
2026-05-29T10:47:55.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:47:55.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:47:55.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:47:55.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:47:55.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:47:55.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:47:55.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:48:12, diff=-16.668486s, valid=True
2026-05-29T10:47:55.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:47:55.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:47:55.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:47:55.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977117.332186s, valid=True
2026-05-29T10:47:55.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:47:55.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:47:55.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:47:55.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:47:55.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:47:55.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:47:55.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:47:55.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:47:55.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:47:55.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:47:55.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:47:55.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:47:55.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:47:55.653 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:47:55.924 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:47:56.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:47:56.358 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:47:56.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:47:56.358 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:47:56.358 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:47:56.425 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:47:56.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:48:26.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:48:26.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:48:26.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:48:27.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:48:27.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:48:27.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:48:27.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-05-29T10:48:27.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:48:27.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-05-29T10:48:27.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:48:27.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:48:27.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:48: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-05-29T10:48:29.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-05-29T10:48:29.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:48:29.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:48:29.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:48:29.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:48:29.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:48:29.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:48:29.732 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:48:29.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:48:29.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:48:29.732 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:48:29.732 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:48:29.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:48:29.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:48:29.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:48:29.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:48:29.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:48:29.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:48:29.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:48:29.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:48:29.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:48:29.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:48:29.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:48:29.997 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:48:30.056 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:48:12
2026-05-29T10:48:30.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71638, datetime.datetime(2026, 5, 29, 10, 48, 12), datetime.datetime(2026, 5, 29, 10, 48, 12), 'salt', 11.23, 67.53, None, 12.39, 67.59, 5.78, 833.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:48:30.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:48:30.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:48:30.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:48:12, diff=18.062387s, valid=True
2026-05-29T10:48:30.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:48:30.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:48:30.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:48:12, diff=18.066615s, valid=True
2026-05-29T10:48:30.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:48:30.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:48:30.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:48:08, diff=22.073569s, valid=True
2026-05-29T10:48:30.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:48:30.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:48:30.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:48:30.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:48:30.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:48:30.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:48:30.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:48:12, diff=18.076666s, valid=True
2026-05-29T10:48:30.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:48:30.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:48:30.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:48:30.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977152.077328s, valid=True
2026-05-29T10:48:30.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:48:30.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:48:30.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:48:30.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:48:30.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:48:30.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:48:30.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:48:30.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:48:30.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:48:30.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:48:30.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:48:30.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:48:30.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:48:30.408 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:48:30.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:48:30.956 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:48:31.063 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:48:31.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:48:31.063 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:48:31.063 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:48:31.131 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:48:31.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:49:01.161 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:49:01.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:49:01.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:49:01.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:49:01.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:49:01.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:49:01.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-05-29T10:49:01.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:49:01.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-05-29T10:49:01.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:49:01.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:49:01.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:49:01.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-05-29T10:49:04.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-05-29T10:49:04.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:49:04.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:49:04.067 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:49:04.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:49:04.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:49:04.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:49:04.087 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:49:04.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:49:04.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:49:04.087 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:49:04.087 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:49:04.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:49:04.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:49:04.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:49:04.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:49:04.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:49:04.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:49:04.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:49:04.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:49:04.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:49:04.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:49:04.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:49:04.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:49:04.412 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:48:42
2026-05-29T10:49:04.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71639, datetime.datetime(2026, 5, 29, 10, 48, 42), datetime.datetime(2026, 5, 29, 10, 48, 42), 'salt', 11.23, 68.0, None, 12.49, 71.58, 5.68, 833.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:49:04.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:49:04.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:49:04.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:48:42, diff=22.419025s, valid=True
2026-05-29T10:49:04.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:49:04.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:49:04.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:49:12, diff=-7.57803s, valid=True
2026-05-29T10:49:04.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:49:04.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:49:04.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:48:39, diff=25.428817s, valid=True
2026-05-29T10:49:04.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:49:04.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:49:04.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:49:04.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:49:04.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:49:04.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:49:04.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:49:12, diff=-7.568098s, valid=True
2026-05-29T10:49:04.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:49:04.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:49:04.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:49:04.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977186.432558s, valid=True
2026-05-29T10:49:04.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:49:04.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:49:04.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:49:04.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:49:04.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:49:04.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:49:04.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:49:04.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:49:04.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:49:04.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:49:04.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:49:04.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:49:04.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:49:04.817 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:49:05.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:49:05.350 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:49:05.450 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:49:05.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:49:05.450 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:49:05.450 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:49:05.773 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:49:05.773 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:49:35.780 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:49:35.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:49:35.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:49:36.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:49:36.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:49:36.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:49:36.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-05-29T10:49:36.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:49:36.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-05-29T10:49:36.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:49:36.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:49:36.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:49:36.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-05-29T10:49:39.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-05-29T10:49:39.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:49:39.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:49:39.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:49:39.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:49:39.018 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:49:39.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:49:39.030 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:49:39.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:49:39.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:49:39.030 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:49:39.030 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:49:39.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:49:39.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:49:39.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:49:39.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:49:39.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:49:39.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:49:39.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:49:39.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:49:39.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:49:39.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:49:39.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:49:39.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:49:39.356 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:49:13
2026-05-29T10:49:39.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71640, datetime.datetime(2026, 5, 29, 10, 49, 13), datetime.datetime(2026, 5, 29, 10, 49, 12), 'salt', 11.0, 66.14, None, 12.25, 52.01, 6.07, 833.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:49:39.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:49:39.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:49:39.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:49:12, diff=27.362962s, valid=True
2026-05-29T10:49:39.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:49:39.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:49:39.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:49:12, diff=27.365833s, valid=True
2026-05-29T10:49:39.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:49:39.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:49:39.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:49:11, diff=28.372453s, valid=True
2026-05-29T10:49:39.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:49:39.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:49:39.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:49:39.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:49:39.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:49:39.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:49:39.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:49:12, diff=27.375543s, valid=True
2026-05-29T10:49:39.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:49:39.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:49:39.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:49:39.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977221.376199s, valid=True
2026-05-29T10:49:39.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:49:39.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:49:39.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:49:39.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:49:39.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:49:39.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:49:39.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:49:39.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:49:39.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:49:39.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:49:39.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:49:39.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:49:39.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:49:39.700 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:49:39.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:49:40.286 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:49:40.390 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:49:40.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:49:40.390 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:49:40.390 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:49:40.457 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:49:40.458 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:50:10.487 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:50:10.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:50:10.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:50:10.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:50:10.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:50:10.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:50:10.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-05-29T10:50:10.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:50:10.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-05-29T10:50:10.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:50:10.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:50:10.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:50:10.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T10:50:13.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-05-29T10:50:13.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:50:13.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:50:13.684 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:50:13.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:50:13.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:50:13.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:50:13.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:50:13.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:50:13.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:50:13.706 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:50:13.706 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:50:13.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:50:13.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:50:13.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:50:13.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:50:13.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:50:13.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:50:13.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:50:13.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:50:13.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:50:13.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:50:13.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:50:13.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:50:14.017 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:50:13
2026-05-29T10:50:14.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71642, datetime.datetime(2026, 5, 29, 10, 50, 13), datetime.datetime(2026, 5, 29, 10, 50, 13), 'salt', 11.23, 65.28, None, 14.57, 46.23, 6.27, 833.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:50:14.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:50:14.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:50:14.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:50:13, diff=1.023396s, valid=True
2026-05-29T10:50:14.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:50:14.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:50:14.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:50:12, diff=2.026296s, valid=True
2026-05-29T10:50:14.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:50:14.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:50:14.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:50:09, diff=5.032954s, valid=True
2026-05-29T10:50:14.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:50:14.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:50:14.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:50:14.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:50:14.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:50:14.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:50:14.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:50:12, diff=2.036016s, valid=True
2026-05-29T10:50:14.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:50:14.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:50:14.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:50:14.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977256.036696s, valid=True
2026-05-29T10:50:14.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:50:14.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:50:14.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:50:14.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:50:14.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:50:14.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:50:14.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:50:14.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:50:14.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:50:14.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:50:14.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:50:14.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:50:14.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:50:14.429 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:50:14.654 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:50:14.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:50:15.093 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:50:15.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:50:15.093 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:50:15.093 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:50:15.330 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:50:15.330 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:50:45.360 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:50:45.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:50:45.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:50:45.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:50:45.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:50:45.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:50:45.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-05-29T10:50:45.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:50:45.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-05-29T10:50:45.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:50:45.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:50:45.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:50:45.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-05-29T10:50:48.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T10:50:48.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:50:48.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:50:48.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:50:48.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:50:48.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:50:48.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:50:48.733 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:50:48.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:50:48.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:50:48.733 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:50:48.734 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:50:48.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:50:48.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:50:48.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:50:48.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:50:48.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:50:48.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:50:48.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:50:48.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:50:48.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:50:49.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:50:49.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:50:49.000 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:50:49.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:50:43
2026-05-29T10:50:49.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71643, datetime.datetime(2026, 5, 29, 10, 50, 43), datetime.datetime(2026, 5, 29, 10, 50, 43), 'salt', 11.16, 65.14, None, 13.55, 52.34, 6.29, 833.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:50:49.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:50:49.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:50:49.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:50:43, diff=6.06573s, valid=True
2026-05-29T10:50:49.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:50:49.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:50:49.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:51:12, diff=-22.931434s, valid=True
2026-05-29T10:50:49.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:50:49.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:50:49.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:50:40, diff=9.075082s, valid=True
2026-05-29T10:50:49.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:50:49.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:50:49.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:50:49.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:50:49.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:50:49.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:50:49.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:51:12, diff=-22.921834s, valid=True
2026-05-29T10:50:49.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:50:49.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:50:49.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:50:49.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977291.078841s, valid=True
2026-05-29T10:50:49.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:50:49.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:50:49.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:50:49.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:50:49.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:50:49.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:50:49.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:50:49.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:50:49.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:50:49.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:50:49.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:50:49.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:50:49.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:50:49.405 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:50:49.624 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:50:49.979 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:50:50.095 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:50:50.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:50:50.096 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:50:50.096 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:50:50.250 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:50:50.250 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:51:20.280 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:51:20.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:51:20.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:51:20.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:51:20.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:51:21.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:51:21.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-05-29T10:51:21.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:51:21.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-05-29T10:51:21.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:51:21.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:51:21.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:51:21.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-05-29T10:51:23.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-05-29T10:51:23.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:51:23.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:51:23.542 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:51:23.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:51:23.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:51:23.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:51:23.563 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:51:23.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:51:23.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:51:23.563 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:51:23.564 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:51:23.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:51:23.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:51:23.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:51:23.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:51:23.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:51:23.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:51:23.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:51:23.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:51:23.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:51:23.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:51:23.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:51:23.878 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:51:23.945 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:51:14
2026-05-29T10:51:23.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71644, datetime.datetime(2026, 5, 29, 10, 51, 14), datetime.datetime(2026, 5, 29, 10, 51, 13), 'salt', 11.33, 66.14, None, 12.1, 38.09, 6.08, 833.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:51:23.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:51:23.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:51:23.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:51:13, diff=10.951308s, valid=True
2026-05-29T10:51:23.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:51:23.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:51:23.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:51:12, diff=11.954126s, valid=True
2026-05-29T10:51:23.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:51:23.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:51:23.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:51:10, diff=13.960747s, valid=True
2026-05-29T10:51:23.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:51:23.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:51:23.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:51:23.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:51:23.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:51:23.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:51:23.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:51:12, diff=11.963749s, valid=True
2026-05-29T10:51:23.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:51:23.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:51:23.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:51:23.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977325.964398s, valid=True
2026-05-29T10:51:23.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:51:23.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:51:23.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:51:23.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:51:23.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:51:24.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:51:24.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:51:24.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:51:24.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:51:24.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:51:24.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:51:24.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:51:24.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:51:24.279 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:51:24.490 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:51:24.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:51:24.930 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:51:24.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:51:24.930 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:51:24.930 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:51:25.118 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:51:25.118 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:51:55.148 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:51:55.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:51:55.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:51:55.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:51:55.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:51:55.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:51:55.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-05-29T10:51:55.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:51:55.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-05-29T10:51:55.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:51:55.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:51:55.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:51:55.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-05-29T10:51:58.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-05-29T10:51:58.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:51:58.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:51:58.170 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:51:58.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:51:58.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:51:58.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:51:58.190 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:51:58.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:51:58.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:51:58.190 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:51:58.190 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:51:58.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:51:58.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:51:58.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:51:58.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:51:58.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:51:58.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:51:58.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:51:58.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:51:58.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:51:58.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:51:58.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:51:58.449 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:51:58.507 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:51:44
2026-05-29T10:51:58.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71645, datetime.datetime(2026, 5, 29, 10, 51, 44), datetime.datetime(2026, 5, 29, 10, 51, 43), 'salt', 11.26, 65.47, None, 14.5, 41.85, 6.22, 833.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:51:58.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:51:58.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:51:58.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:51:43, diff=15.513174s, valid=True
2026-05-29T10:51:58.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:51:58.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:51:58.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:52:12, diff=-13.48399s, valid=True
2026-05-29T10:51:58.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:51:58.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:51:58.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:51:40, diff=18.522595s, valid=True
2026-05-29T10:51:58.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:51:58.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:51:58.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:51:58.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:51:58.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:51:58.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:51:58.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:52:12, diff=-13.474361s, valid=True
2026-05-29T10:51:58.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:51:58.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:51:58.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:51:58.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977360.526286s, valid=True
2026-05-29T10:51:58.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:51:58.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:51:58.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:51:58.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:51:58.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:51:58.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:51:58.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:51:58.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:51:58.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:51:58.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:51:58.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:51:58.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:51:58.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:51:58.862 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:51:59.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:51:59.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:51:59.525 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:51:59.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:51:59.525 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:51:59.526 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:51:59.682 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:51:59.682 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:52:29.712 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:52:29.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:52:29.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:52:30.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:52:30.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:52:30.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:52:30.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-05-29T10:52:30.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:52:30.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-05-29T10:52:30.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:52:30.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:52:30.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:52:30.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-05-29T10:52:33.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-05-29T10:52:33.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:52:33.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:52:33.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:52:33.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:52:33.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:52:33.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:52:33.126 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:52:33.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:52:33.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:52:33.126 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:52:33.126 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:52:33.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:52:33.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:52:33.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:52:33.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:52:33.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:52:33.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:52:33.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:52:33.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:52:33.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:52:33.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:52:33.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:52:33.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:52:33.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:52:14
2026-05-29T10:52:33.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71646, datetime.datetime(2026, 5, 29, 10, 52, 14), datetime.datetime(2026, 5, 29, 10, 52, 14), 'salt', 11.39, 61.59, None, 15.74, 49.8, 7.1, 833.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:52:33.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:52:33.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:52:33.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:52:14, diff=19.442288s, valid=True
2026-05-29T10:52:33.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:52:33.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:52:33.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:52:12, diff=21.445159s, valid=True
2026-05-29T10:52:33.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:52:33.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:52:33.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:52:10, diff=23.451716s, valid=True
2026-05-29T10:52:33.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:52:33.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:52:33.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:52:33.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:52:33.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:52:33.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:52:33.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:52:12, diff=21.454721s, valid=True
2026-05-29T10:52:33.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:52:33.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:52:33.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:52:33.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977395.455386s, valid=True
2026-05-29T10:52:33.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:52:33.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:52:33.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:52:33.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:52:33.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:52:33.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:52:33.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:52:33.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:52:33.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:52:33.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:52:33.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:52:33.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:52:33.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:52:33.772 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:52:34.003 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:52:34.357 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:52:34.458 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:52:34.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:52:34.459 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:52:34.459 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:52:34.526 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:52:34.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:53:04.556 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:53:04.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:53:04.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:53:04.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:53:04.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:53:05.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:53:05.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-05-29T10:53:05.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:53:05.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-05-29T10:53:05.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:53:05.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:53:05.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:53:05.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-05-29T10:53:07.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-05-29T10:53:07.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:53:07.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:53:07.438 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:53:07.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:53:07.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:53:07.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:53:07.458 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:53:07.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:53:07.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:53:07.458 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:53:07.458 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:53:07.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:53:07.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:53:07.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:53:07.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:53:07.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:53:07.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:53:07.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:53:07.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:53:07.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:53:07.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:53:07.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:53:07.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:53:07.783 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:52:44
2026-05-29T10:53:07.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71647, datetime.datetime(2026, 5, 29, 10, 52, 44), datetime.datetime(2026, 5, 29, 10, 52, 44), 'salt', 11.33, 62.49, None, 14.01, 56.77, 6.9, 833.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:53:07.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:53:07.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:53:07.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:52:44, diff=23.790511s, valid=True
2026-05-29T10:53:07.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:53:07.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:53:07.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:53:12, diff=-4.206591s, valid=True
2026-05-29T10:53:07.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:53:07.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:53:07.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:52:40, diff=27.800696s, valid=True
2026-05-29T10:53:07.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:53:07.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:53:07.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:53:07.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:53:07.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:53:07.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:53:07.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:53:12, diff=-4.196268s, valid=True
2026-05-29T10:53:07.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:53:07.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:53:07.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:53:07.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977429.804387s, valid=True
2026-05-29T10:53:07.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:53:07.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:53:07.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:53:07.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:53:07.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:53:07.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:53:07.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:53:07.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:53:07.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:53:07.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:53:08.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:53:08.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:53:08.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:53:08.142 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:53:08.358 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:53:08.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:53:08.876 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:53:08.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:53:08.876 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:53:08.876 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:53:09.151 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:53:09.151 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:53:39.180 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:53:39.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:53:39.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:53:39.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:53:39.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:53:39.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:53:39.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-05-29T10:53:39.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:53:39.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-05-29T10:53:39.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:53:39.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:53:39.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:53:39.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-05-29T10:53:42.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-05-29T10:53:42.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:53:42.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:53:42.169 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:53:42.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:53:42.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:53:42.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:53:42.190 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:53:42.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:53:42.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:53:42.190 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:53:42.190 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:53:42.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:53:42.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:53:42.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:53:42.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:53:42.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:53:42.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:53:42.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:53:42.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:53:42.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:53:42.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:53:42.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:53:42.455 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:53:42.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:53:14
2026-05-29T10:53:42.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71648, datetime.datetime(2026, 5, 29, 10, 53, 14), datetime.datetime(2026, 5, 29, 10, 53, 14), 'salt', 11.19, 61.83, None, 13.41, 41.07, 7.04, 833.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:53:42.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:53:42.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:53:42.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:53:14, diff=28.526834s, valid=True
2026-05-29T10:53:42.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:53:42.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:53:42.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:53:12, diff=30.529792s, valid=True
2026-05-29T10:53:42.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:53:42.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:53:42.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:53:12, diff=30.536519s, valid=True
2026-05-29T10:53:42.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:53:42.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:53:42.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:53:42.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:53:42.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:53:42.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:53:42.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:53:12, diff=30.539574s, valid=True
2026-05-29T10:53:42.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:53:42.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:53:42.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:53:42.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977464.540239s, valid=True
2026-05-29T10:53:42.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:53:42.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:53:42.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:53:42.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:53:42.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:53:42.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:53:42.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:53:42.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:53:42.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:53:42.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:53:42.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:53:42.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:53:42.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:53:42.869 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:53:43.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:53:43.431 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:53:43.539 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:53:43.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:53:43.539 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:53:43.539 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:53:43.769 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:53:43.770 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:54:13.790 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:54:13.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:54:13.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:54:13.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:54:13.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:54:14.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:54:14.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-05-29T10:54:14.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:54:14.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-05-29T10:54:14.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:54:14.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:54:14.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:54:14.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-05-29T10:54:16.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-05-29T10:54:16.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:54:16.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:54:16.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:54:16.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:54:16.514 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:54:16.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:54:16.525 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:54:16.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:54:16.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:54:16.526 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:54:16.526 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:54:16.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:54:16.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:54:16.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:54:16.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:54:16.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:54:16.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:54:16.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:54:16.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:54:16.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:54:16.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:54:16.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:54:16.791 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:54:16.850 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:54:15
2026-05-29T10:54:16.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71650, datetime.datetime(2026, 5, 29, 10, 54, 15), datetime.datetime(2026, 5, 29, 10, 54, 15), 'salt', 11.16, 63.28, None, 11.5, 51.0, 6.7, 833.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:54:16.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:54:16.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:54:16.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:54:15, diff=1.856678s, valid=True
2026-05-29T10:54:16.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:54:16.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:54:16.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:54:12, diff=4.859542s, valid=True
2026-05-29T10:54:16.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:54:16.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:54:16.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:54:11, diff=5.866113s, valid=True
2026-05-29T10:54:16.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:54:16.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:54:16.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:54:16.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:54:16.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:54:16.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:54:16.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:54:12, diff=4.86915s, valid=True
2026-05-29T10:54:16.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:54:16.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:54:16.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:54:16.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977498.869821s, valid=True
2026-05-29T10:54:16.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:54:16.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:54:16.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:54:16.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:54:16.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:54:16.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:54:16.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:54:16.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:54:16.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:54:17.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:54:17.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:54:17.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:54:17.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:54:17.272 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:54:17.480 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:54:17.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:54:17.934 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:54:17.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:54:17.934 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:54:17.934 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:54:18.001 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:54:18.001 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:54:48.032 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:54:48.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:54:48.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:54:48.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:54:48.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:54:48.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:54:48.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-05-29T10:54:48.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:54:48.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-05-29T10:54:48.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:54:48.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:54:48.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:54:48.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-05-29T10:54:51.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-05-29T10:54:51.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:54:51.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:54:51.036 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:54:51.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:54:51.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:54:51.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:54:51.057 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:54:51.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:54:51.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:54:51.057 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:54:51.057 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:54:51.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:54:51.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:54:51.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:54:51.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:54:51.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:54:51.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:54:51.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:54:51.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:54:51.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:54:51.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:54:51.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:54:51.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:54:51.400 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:54:45
2026-05-29T10:54:51.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71651, datetime.datetime(2026, 5, 29, 10, 54, 45), datetime.datetime(2026, 5, 29, 10, 54, 45), 'salt', 11.19, 64.28, None, 12.99, 48.6, 6.48, 833.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:54:51.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:54:51.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:54:51.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:54:45, diff=6.408143s, valid=True
2026-05-29T10:54:51.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:54:51.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:54:51.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:55:12, diff=-20.588065s, valid=True
2026-05-29T10:54:51.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:54:51.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:54:51.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:54:41, diff=10.420427s, valid=True
2026-05-29T10:54:51.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:54:51.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:54:51.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:54:51.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:54:51.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:54:51.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:54:51.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:55:12, diff=-20.575637s, valid=True
2026-05-29T10:54:51.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:54:51.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:54:51.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:54:51.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977533.425223s, valid=True
2026-05-29T10:54:51.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:54:51.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:54:51.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:54:51.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:54:51.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:54:51.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:54:51.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:54:51.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:54:51.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:54:51.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:54:51.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:54:51.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:54:51.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:54:51.817 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:54:52.060 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:54:52.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:54:52.554 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:54:52.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:54:52.554 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:54:52.554 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:54:52.703 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:54:52.703 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:55:22.708 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:55:22.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:55:22.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:55:22.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:55:23.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:55:23.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:55:23.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-05-29T10:55:23.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:55:23.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-05-29T10:55:23.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:55:23.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:55:23.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:55:23.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-05-29T10:55:26.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-05-29T10:55:26.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:55:26.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:55:26.219 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:55:26.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:55:26.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:55:26.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:55:26.240 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:55:26.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:55:26.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:55:26.241 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:55:26.241 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:55:26.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:55:26.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:55:26.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:55:26.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:55:26.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:55:26.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:55:26.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:55:26.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:55:26.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:55:26.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:55:26.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:55:26.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:55:26.563 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:55:15
2026-05-29T10:55:26.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71652, datetime.datetime(2026, 5, 29, 10, 55, 15), datetime.datetime(2026, 5, 29, 10, 55, 15), 'salt', 11.23, 64.71, None, 14.26, 44.71, 6.39, 833.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:55:26.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:55:26.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:55:26.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:55:15, diff=11.569892s, valid=True
2026-05-29T10:55:26.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:55:26.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:55:26.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:55:12, diff=14.572701s, valid=True
2026-05-29T10:55:26.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:55:26.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:55:26.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:55:11, diff=15.579905s, valid=True
2026-05-29T10:55:26.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:55:26.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:55:26.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:55:26.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:55:26.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:55:26.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:55:26.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:55:12, diff=14.583007s, valid=True
2026-05-29T10:55:26.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:55:26.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:55:26.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:55:26.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977568.583672s, valid=True
2026-05-29T10:55:26.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:55:26.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:55:26.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:55:26.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:55:26.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:55:26.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:55:26.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:55:26.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:55:26.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:55:26.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:55:26.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:55:26.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:55:26.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:55:26.982 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:55:27.199 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:55:27.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:55:27.664 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:55:27.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:55:27.664 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:55:27.664 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:55:27.891 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:55:27.892 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:55:57.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:55:57.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:55:57.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:55:58.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:55:58.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:55:58.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:55:58.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-05-29T10:55:58.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:55:58.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T10:55:58.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:55:58.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:55:58.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:55:58.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-05-29T10:56:00.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-05-29T10:56:00.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:56:00.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:56:00.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:56:00.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:56:00.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:56:00.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:56:00.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:56:00.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:56:00.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:56:00.795 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:56:00.795 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:56:00.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:56:00.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:56:00.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:56:00.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:56:00.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:56:01.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:56:01.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:56:01.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:56:01.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:56:01.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:56:01.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:56:01.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:56:01.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:55:46
2026-05-29T10:56:01.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71653, datetime.datetime(2026, 5, 29, 10, 55, 46), datetime.datetime(2026, 5, 29, 10, 55, 46), 'salt', 11.33, 64.88, None, 13.97, 58.34, 6.36, 833.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:56:01.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:56:01.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:56:01.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:55:46, diff=15.134568s, valid=True
2026-05-29T10:56:01.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:56:01.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:56:01.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:56:12, diff=-10.862519s, valid=True
2026-05-29T10:56:01.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:56:01.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:56:01.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:55:42, diff=19.144371s, valid=True
2026-05-29T10:56:01.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:56:01.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:56:01.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:56:01.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:56:01.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:56:01.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:56:01.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:56:12, diff=-10.852535s, valid=True
2026-05-29T10:56:01.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:56:01.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:56:01.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:56:01.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977603.148141s, valid=True
2026-05-29T10:56:01.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:56:01.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:56:01.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:56:01.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:56:01.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:56:01.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:56:01.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:56:01.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:56:01.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:56:01.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:56:01.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:56:01.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:56:01.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:56:01.467 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:56:01.677 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:56:02.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:56:02.156 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:56:02.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:56:02.156 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:56:02.156 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:56:02.423 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:56:02.423 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:56:32.436 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:56:32.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:56:32.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:56:32.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:56:32.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:56:32.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:56:32.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-05-29T10:56:32.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:56:32.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T10:56:32.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:56:32.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:56:32.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:56:32.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-05-29T10:56:35.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-05-29T10:56:35.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:56:35.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:56:35.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:56:35.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:56:35.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:56:35.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:56:35.216 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:56:35.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:56:35.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:56:35.217 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:56:35.217 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:56:35.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:56:35.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:56:35.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:56:35.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:56:35.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:56:35.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:56:35.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:56:35.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:56:35.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:56:35.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:56:35.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:56:35.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:56:35.548 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:56:16
2026-05-29T10:56:35.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71654, datetime.datetime(2026, 5, 29, 10, 56, 16), datetime.datetime(2026, 5, 29, 10, 56, 16), 'salt', 11.09, 64.41, None, 12.92, 55.5, 6.45, 833.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:56:35.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:56:35.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:56:35.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:56:16, diff=19.55481s, valid=True
2026-05-29T10:56:35.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:56:35.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:56:35.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:56:12, diff=23.557693s, valid=True
2026-05-29T10:56:35.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:56:35.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:56:35.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:56:12, diff=23.564323s, valid=True
2026-05-29T10:56:35.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:56:35.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:56:35.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:56:35.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:56:35.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:56:35.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:56:35.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:56:12, diff=23.567396s, valid=True
2026-05-29T10:56:35.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:56:35.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:56:35.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:56:35.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977637.56809s, valid=True
2026-05-29T10:56:35.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:56:35.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:56:35.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:56:35.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:56:35.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:56:35.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:56:35.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:56:35.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:56:35.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:56:35.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:56:35.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:56:35.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:56:35.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:56:35.959 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:56:36.169 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:56:36.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:56:36.620 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:56:36.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:56:36.620 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:56:36.620 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:56:36.882 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:56:36.882 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:57:06.910 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:57:06.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:57:06.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:57:07.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:57:07.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:57:07.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:57:07.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-05-29T10:57:07.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:57:07.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-05-29T10:57:07.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:57:07.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:57:07.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:57:07.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-05-29T10:57:10.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-05-29T10:57:10.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:57:10.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:57:10.689 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:57:10.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:57:10.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:57:10.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:57:10.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:57:10.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:57:10.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:57:10.710 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:57:10.710 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:57:10.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:57:10.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:57:10.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:57:10.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:57:10.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:57:10.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:57:10.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:57:10.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:57:10.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:57:10.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:57:10.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:57:10.966 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:57:11.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:56:47
2026-05-29T10:57:11.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71655, datetime.datetime(2026, 5, 29, 10, 56, 47), datetime.datetime(2026, 5, 29, 10, 56, 46), 'salt', 10.86, 65.34, None, 10.76, 46.94, 6.23, 833.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:57:11.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:57:11.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:57:11.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:56:46, diff=25.031831s, valid=True
2026-05-29T10:57:11.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:57:11.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:57:11.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:57:12, diff=-0.96528s, valid=True
2026-05-29T10:57:11.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:57:11.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:57:11.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:56:42, diff=29.041331s, valid=True
2026-05-29T10:57:11.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:57:11.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:57:11.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:57:11.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:57:11.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:57:11.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:57:11.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:57:12, diff=-0.95561s, valid=True
2026-05-29T10:57:11.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:57:11.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:57:11.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:57:11.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977673.045051s, valid=True
2026-05-29T10:57:11.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:57:11.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:57:11.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:57:11.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:57:11.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:57:11.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:57:11.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:57:11.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:57:11.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:57:11.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:57:11.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:57:11.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:57:11.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:57:11.360 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:57:11.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:57:11.906 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:57:12.008 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:57:12.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:57: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-05-29T10:57: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-05-29T10:57:12.173 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:57:12.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:57:42.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:57:42.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:57:42.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:57:42.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:57:42.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:57:42.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:57:42.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-05-29T10:57:42.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:57:42.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-05-29T10:57:42.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:57:42.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:57:42.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:57:42.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-05-29T10:57:45.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-05-29T10:57:45.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:57:45.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:57:45.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:57:45.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:57:45.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:57:45.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:57:45.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:57:45.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:57:45.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:57:45.368 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:57:45.368 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:57:45.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:57:45.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T10:57:45.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:57:45.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T10:57:45.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:57:45.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:57:45.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:57:45.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:57:45.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:57:45.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:57:45.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:57:45.713 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:57:45.771 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:57:17
2026-05-29T10:57:45.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71656, datetime.datetime(2026, 5, 29, 10, 57, 17), datetime.datetime(2026, 5, 29, 10, 57, 17), 'salt', 11.03, 65.87, None, 11.26, 54.45, 6.13, 833.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:57:45.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:57:45.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T10:57:45.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:57:17, diff=28.777734s, valid=True
2026-05-29T10:57:45.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:57:45.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:57:45.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:57:12, diff=33.780565s, valid=True
2026-05-29T10:57:45.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:57:45.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T10:57:45.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:57:13, diff=32.787105s, valid=True
2026-05-29T10:57:45.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:57:45.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:57:45.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:57:45.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:57:45.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:57:45.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:57:45.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:57:12, diff=33.790095s, valid=True
2026-05-29T10:57:45.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:57:45.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:57:45.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:57:45.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977707.790808s, valid=True
2026-05-29T10:57:45.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:57:45.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:57:45.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:57:45.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:57:45.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:57:45.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:57:45.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:57:45.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:57:45.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:57:45.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:57:45.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:57:46.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:57:46.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:57:46.108 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:57:46.314 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:57:46.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:57:46.761 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:57:46.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:57:46.762 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:57:46.762 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:57:47.020 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:57:47.020 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:58:17.050 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:58:17.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:58:17.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:58:17.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:58:17.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:58:17.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:58:17.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T10:58:17.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:58:17.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-05-29T10:58:17.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:58:17.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:58:17.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:58:17.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-05-29T10:58:19.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-05-29T10:58:19.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:58:19.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:58:19.984 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:58:19.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:58:19.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:58:20.005 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:58:20.006 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:58:20.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:58:20.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:58:20.006 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:58:20.006 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:58:20.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:58:20.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:58:20.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:58:20.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:58:20.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:58:20.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:58:20.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:58:20.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:58:20.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:58:20.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:58:20.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:58:20.264 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:58:20.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:58:17
2026-05-29T10:58:20.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71658, datetime.datetime(2026, 5, 29, 10, 58, 17), datetime.datetime(2026, 5, 29, 10, 58, 17), 'salt', 11.13, 64.84, None, 13.94, 32.34, 6.36, 833.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:58:20.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:58:20.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:58:20.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:58:17, diff=3.329248s, valid=True
2026-05-29T10:58:20.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:58:20.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:58:20.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:58:12, diff=8.332156s, valid=True
2026-05-29T10:58:20.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:58:20.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:58:20.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:58:16, diff=4.339045s, valid=True
2026-05-29T10:58:20.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:58:20.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:58:20.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:58:20.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:58:20.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:58:20.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:58:20.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:58:12, diff=8.342192s, valid=True
2026-05-29T10:58:20.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:58:20.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:58:20.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:58:20.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977742.342883s, valid=True
2026-05-29T10:58:20.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:58:20.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:58:20.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:58:20.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:58:20.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:58:20.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:58:20.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:58:20.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:58:20.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:58:20.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:58:20.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:58:20.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:58:20.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:58:20.669 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:58:20.875 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:58:21.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:58:21.319 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:58:21.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:58:21.319 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:58:21.319 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:58:21.493 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:58:21.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:58:51.522 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:58:51.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:58:51.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:58:51.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:58:51.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:58:52.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:58:52.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-05-29T10:58:52.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:58:52.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-05-29T10:58:52.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:58:52.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:58:52.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:58: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-05-29T10:58:54.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-05-29T10:58:54.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:58:54.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:58:54.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:58:54.609 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:58:54.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:58:54.630 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:58:54.630 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:58:54.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:58:54.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:58:54.631 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:58:54.631 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:58:54.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:58:54.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:58:54.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:58:54.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:58:54.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:58:54.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:58:54.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:58:54.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T10:58:54.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:58:54.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:58:54.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:58:54.884 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:58:54.942 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:58:48
2026-05-29T10:58:54.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71659, datetime.datetime(2026, 5, 29, 10, 58, 48), datetime.datetime(2026, 5, 29, 10, 58, 47), 'salt', 11.16, 65.74, None, 13.3, 30.54, 6.16, 833.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:58:54.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:58:54.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:58:54.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:58:47, diff=7.948998s, valid=True
2026-05-29T10:58:54.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:58:54.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:58:54.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:59:12, diff=-17.048178s, valid=True
2026-05-29T10:58:54.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:58:54.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:58:54.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:58:47, diff=7.958296s, valid=True
2026-05-29T10:58:54.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:58:54.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:58:54.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:58:54.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:58:54.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:58:54.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T10:58:54.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:59:12, diff=-17.038678s, valid=True
2026-05-29T10:58:54.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:58:54.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:58:54.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:58:54.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977776.961987s, valid=True
2026-05-29T10:58:54.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:58:54.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:58:54.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:58:54.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:58:54.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:58:55.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:58:55.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:58:55.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:58:55.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:58:55.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:58:55.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:58:55.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:58:55.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:58:55.277 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:58:55.504 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:58:55.852 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:58:55.953 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:58:55.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:58:55.953 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:58:55.953 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:58:56.182 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:58:56.182 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T10:59:26.212 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T10:59:26.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T10:59:26.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T10:59:26.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T10:59:26.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T10:59:26.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T10:59:26.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-05-29T10:59:26.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T10:59:26.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-05-29T10:59:26.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T10:59:26.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T10:59:26.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T10:59:26.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-05-29T10:59:29.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-05-29T10:59:29.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T10:59:29.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T10:59:29.154 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T10:59:29.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T10:59:29.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T10:59:29.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T10:59:29.174 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T10:59:29.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T10:59:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T10:59:29.175 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T10:59:29.175 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T10:59:29.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T10:59:29.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T10:59:29.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T10:59:29.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T10:59:29.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:59:29.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:59:29.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T10:59:29.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T10:59:29.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T10:59:29.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T10:59:29.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T10:59:29.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T10:59:29.502 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:59:18
2026-05-29T10:59:29.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71660, datetime.datetime(2026, 5, 29, 10, 59, 18), datetime.datetime(2026, 5, 29, 10, 59, 17), 'salt', 11.29, 66.4, None, 11.15, 38.23, 6.02, 833.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T10:59:29.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T10:59:29.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T10:59:29.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:59:17, diff=12.509119s, valid=True
2026-05-29T10:59:29.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T10:59:29.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:59:29.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:59:12, diff=17.512009s, valid=True
2026-05-29T10:59:29.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T10:59:29.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T10:59:29.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:59:13, diff=16.519806s, valid=True
2026-05-29T10:59:29.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T10:59:29.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:59:29.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T10:59:29.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T10:59:29.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T10:59:29.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T10:59:29.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:59:12, diff=17.522889s, valid=True
2026-05-29T10:59:29.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T10:59:29.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T10:59:29.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T10:59:29.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977811.52355s, valid=True
2026-05-29T10:59:29.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T10:59:29.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T10:59:29.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T10:59:29.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T10:59:29.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T10:59:29.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T10:59:29.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T10:59:29.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T10:59:29.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T10:59:29.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T10:59:29.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T10:59:29.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T10:59:29.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T10:59:29.878 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T10:59:30.150 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:59:30.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T10:59:30.733 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T10:59:30.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T10:59:30.733 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T10:59:30.733 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T10:59:30.923 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T10:59:30.923 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:00:00.953 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:00:00.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:00:00.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:00:01.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:00:01.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:00:01.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:00:01.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-05-29T11:00:01.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:00:01.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T11:00:01.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:00:01.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:00:01.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:00:01.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T11:00:05.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-05-29T11:00:05.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:00:05.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:00:05.072 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:00:05.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:00:05.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:00:05.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:00:05.093 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:00:05.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:00:05.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:00:05.093 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:00:05.093 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:00:05.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:00:05.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:00:05.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:00:05.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:00:05.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:00:05.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:00:05.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:00:05.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:00:05.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:00:05.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:00:05.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:00:05.338 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:00:05.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 10:59:48
2026-05-29T11:00:05.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71661, datetime.datetime(2026, 5, 29, 10, 59, 48), datetime.datetime(2026, 5, 29, 10, 59, 48), 'salt', 11.23, 63.78, None, 12.95, 65.76, 6.6, 833.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:00:05.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:00:05.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:00:05.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:59:48, diff=17.40076s, valid=True
2026-05-29T11:00:05.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:00:05.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:00:05.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:00:12, diff=-6.596539s, valid=True
2026-05-29T11:00:05.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:00:05.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:00:05.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 10:59:43, diff=22.409813s, valid=True
2026-05-29T11:00:05.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:00:05.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:00:05.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:00:05.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:00:05.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:00:05.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:00:05.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:00:12, diff=-6.587345s, valid=True
2026-05-29T11:00:05.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:00:05.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:00:05.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:00:05.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977847.413267s, valid=True
2026-05-29T11:00:05.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:00:05.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:00:05.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:00:05.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:00:05.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:00:05.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:00:05.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:00:05.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:00:05.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:00:05.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:00:05.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:00:05.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:00:05.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:00:05.714 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:00:05.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:00:06.239 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:00:06.334 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:00:06.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:00:06.334 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:00:06.335 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:00:06.547 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:00:06.547 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:00:36.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:00:36.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:00:36.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:00:37.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:00:37.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:00:37.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:00:37.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-05-29T11:00:37.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:00:37.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-05-29T11:00:37.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:00:37.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:00:37.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:00:37.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-05-29T11:00:40.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-05-29T11:00:40.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:00:40.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:00:40.039 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:00:40.039 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:00:40.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:00:40.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:00:40.060 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:00:40.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:00:40.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:00:40.061 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:00:40.061 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:00:40.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:00:40.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:00:40.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:00:40.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:00:40.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:00:40.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:00:40.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:00:40.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:00:40.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:00:40.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:00:40.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:00:40.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:00:40.390 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:00:18
2026-05-29T11:00:40.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71662, datetime.datetime(2026, 5, 29, 11, 0, 18), datetime.datetime(2026, 5, 29, 11, 0, 18), 'salt', 11.39, 65.21, None, 13.27, 48.44, 6.29, 833.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:00:40.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:00:40.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:00:40.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:00:18, diff=22.396399s, valid=True
2026-05-29T11:00:40.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:00:40.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:00:40.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:00:12, diff=28.39921s, valid=True
2026-05-29T11:00:40.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:00:40.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:00:40.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:00:14, diff=26.405819s, valid=True
2026-05-29T11:00:40.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:00:40.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:00:40.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:00:40.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:00:40.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:00:40.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:00:40.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:00:12, diff=28.40883s, valid=True
2026-05-29T11:00:40.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:00:40.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:00:40.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:00:40.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977882.409476s, valid=True
2026-05-29T11:00:40.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:00:40.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:00:40.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:00:40.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:00:40.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:00:40.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:00:40.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:00:40.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:00:40.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:00:40.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:00:40.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:00:40.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:00:40.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:00:40.800 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:00:41.008 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:00:41.352 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:00:41.451 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:00:41.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:00:41.451 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:00:41.451 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:00:41.695 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:00:41.695 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:01:11.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:01:11.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:01:11.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:01:12.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:01:12.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:01:12.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:01:12.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-05-29T11:01:12.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:01:12.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-05-29T11:01:12.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:01:12.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:01:12.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:01:12.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-05-29T11:01:15.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-05-29T11:01:15.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:01:15.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:01:15.233 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:01:15.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:01:15.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:01:15.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:01:15.254 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:01:15.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:01:15.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:01:15.254 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:01:15.254 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:01:15.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:01:15.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:01:15.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:01:15.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:01:15.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:01:15.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:01:15.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:01:15.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:01:15.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:01:15.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:01:15.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:01:15.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:01:15.562 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:00:48
2026-05-29T11:01:15.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71663, datetime.datetime(2026, 5, 29, 11, 0, 48), datetime.datetime(2026, 5, 29, 11, 0, 48), 'salt', 11.39, 65.37, None, 16.51, 34.22, 6.25, 833.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:01:15.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:01:15.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:01:15.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:00:48, diff=27.568504s, valid=True
2026-05-29T11:01:15.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:01:15.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:01:15.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:01:12, diff=3.571366s, valid=True
2026-05-29T11:01:15.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:01:15.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:01:15.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:00:44, diff=31.577943s, valid=True
2026-05-29T11:01:15.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:01:15.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:01:15.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:01:15.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:01:15.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:01:15.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:01:15.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:01:12, diff=3.580996s, valid=True
2026-05-29T11:01:15.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:01:15.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:01:15.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:01:15.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977917.581696s, valid=True
2026-05-29T11:01:15.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:01:15.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:01:15.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:01:15.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:01:15.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:01:15.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:01:15.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:01:15.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:01:15.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:01:15.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:01:15.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:01:15.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:01:15.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:01:15.900 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:01:16.107 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:01:16.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:01:16.551 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:01:16.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:01:16.552 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:01:16.552 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:01:16.712 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:01:16.712 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:01:46.741 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:01:46.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:01:46.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:01:47.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:01:47.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:01:47.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:01: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-05-29T11:01:47.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:01:47.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-05-29T11:01:47.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:01:47.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:01:47.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:01:47.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-05-29T11:01:50.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-05-29T11:01:50.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:01:50.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:01:50.305 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:01:50.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:01:50.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:01:50.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:01:50.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:01:50.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:01:50.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:01:50.350 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:01:50.350 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:01:50.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:01:50.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:01:50.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:01:50.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:01:50.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:01:50.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:01:50.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:01:50.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:01:50.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:01:50.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:01:50.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:01:50.609 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:01:50.667 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:01:49
2026-05-29T11:01:50.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71665, datetime.datetime(2026, 5, 29, 11, 1, 49), datetime.datetime(2026, 5, 29, 11, 1, 48), 'salt', 11.56, 61.76, None, 14.5, 52.66, 7.08, 834.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:01:50.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:01:50.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:01:50.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:01:48, diff=2.673396s, valid=True
2026-05-29T11:01:50.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:01:50.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:01:50.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:02:12, diff=-21.323763s, valid=True
2026-05-29T11:01:50.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:01:50.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:01:50.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:01:44, diff=6.682841s, valid=True
2026-05-29T11:01:50.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:01:50.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:01:50.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:01:50.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:01:50.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:01:50.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:01:50.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:02:12, diff=-21.314099s, valid=True
2026-05-29T11:01:50.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:01:50.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:01:50.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:01:50.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977952.686566s, valid=True
2026-05-29T11:01:50.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:01:50.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:01:50.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:01:50.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:01:50.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:01:50.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:01:50.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:01:50.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:01:50.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:01:50.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:01:50.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:01:50.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:01:51.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:01:51.076 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:01:51.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:01:51.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:01:51.740 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:01:51.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:01: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-05-29T11:01: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-05-29T11:01:51.907 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:01:51.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:02:21.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:02:21.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:02:21.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:02:22.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:02:22.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:02:22.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:02:22.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-05-29T11:02:22.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:02:22.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-05-29T11:02:22.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:02:22.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:02:22.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:02:22.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-05-29T11:02:24.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-05-29T11:02:24.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:02:24.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:02:24.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:02:24.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:02:24.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:02:24.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:02:24.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:02:24.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:02:24.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:02:24.771 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:02:24.772 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:02:24.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:02:24.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:02:24.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:02:24.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:02:24.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:02:24.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:02:24.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:02:25.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:02:25.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:02:25.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:02:25.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:02:25.023 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:02:25.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:02:19
2026-05-29T11:02:25.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71666, datetime.datetime(2026, 5, 29, 11, 2, 19), datetime.datetime(2026, 5, 29, 11, 2, 19), 'salt', 11.42, 61.33, None, 14.22, 43.63, 7.16, 833.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:02:25.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:02:25.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:02:25.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:02:19, diff=6.087335s, valid=True
2026-05-29T11:02:25.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:02:25.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:02:25.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:02:12, diff=13.090171s, valid=True
2026-05-29T11:02:25.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:02:25.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:02:25.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:02:15, diff=10.09687s, valid=True
2026-05-29T11:02:25.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:02:25.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:02:25.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:02:25.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:02:25.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:02:25.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:02:25.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:02:12, diff=13.099831s, valid=True
2026-05-29T11:02:25.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:02:25.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:02:25.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:02:25.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=977987.100482s, valid=True
2026-05-29T11:02:25.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:02:25.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:02:25.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:02:25.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:02:25.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:02:25.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:02:25.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:02:25.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:02:25.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:02:25.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:02:25.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:02:25.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:02:25.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:02:25.422 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:02:25.653 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:02:25.995 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:02:26.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:02:26.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:02:26.097 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:02:26.097 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:02:26.304 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:02:26.304 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:02:56.335 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:02:56.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:02:56.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:02:56.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:02:56.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:02:57.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:02:57.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-05-29T11:02:57.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:02:57.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-05-29T11:02:57.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:02:57.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:02:57.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:02:57.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-05-29T11:02:59.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-05-29T11:02:59.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:02:59.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:02:59.598 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:02:59.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:02:59.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:02:59.619 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:02:59.619 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:02:59.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:02:59.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:02:59.619 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:02:59.619 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:02:59.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:02:59.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:02:59.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:02:59.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:02:59.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:02:59.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:02:59.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:02:59.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:02:59.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:02:59.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:02:59.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:02:59.903 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:02:59.971 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:02:49
2026-05-29T11:02:59.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71667, datetime.datetime(2026, 5, 29, 11, 2, 49), datetime.datetime(2026, 5, 29, 11, 2, 49), 'salt', 11.66, 63.02, None, 10.31, 59.98, 6.79, 834.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:02:59.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:02:59.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:02:59.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:02:49, diff=10.97749s, valid=True
2026-05-29T11:02:59.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:02:59.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:02:59.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:03:12, diff=-12.019354s, valid=True
2026-05-29T11:02:59.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:02:59.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:02:59.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:02:46, diff=13.987717s, valid=True
2026-05-29T11:02:59.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:02:59.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:02:59.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:02:59.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:02:59.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:02:59.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:02:59.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:03:12, diff=-12.009084s, valid=True
2026-05-29T11:02:59.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:02:59.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:02:59.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:02:59.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978021.991576s, valid=True
2026-05-29T11:02:59.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:02:59.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:02:59.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:02:59.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:02:59.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:03:00.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:03:00.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:03:00.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:03:00.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:03:00.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:03:00.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:03:00.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:03:00.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:03:00.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:03:00.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:03:00.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:03:01.057 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:03:01.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:03:01.057 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:03:01.057 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:03:01.245 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:03:01.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:03:31.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:03:31.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:03:31.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:03:31.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:03:31.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:03:31.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:03:31.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-05-29T11:03:31.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:03:31.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-05-29T11:03:31.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:03:31.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:03:31.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:03:31.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-05-29T11:03:34.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-05-29T11:03:34.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:03:34.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:03:34.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:03:34.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:03:34.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:03:34.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:03:34.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:03:34.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:03:34.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:03:34.390 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:03:34.390 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:03:34.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:03:34.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:03:34.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:03:34.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:03:34.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:03:34.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:03:34.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:03:34.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:03:34.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:03:34.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:03:34.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:03:34.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:03:34.704 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:03:20
2026-05-29T11:03:34.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71668, datetime.datetime(2026, 5, 29, 11, 3, 20), datetime.datetime(2026, 5, 29, 11, 3, 19), 'salt', 11.66, 62.98, None, 12.74, 56.32, 6.8, 833.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:03:34.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:03:34.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:03:34.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:03:19, diff=15.710071s, valid=True
2026-05-29T11:03:34.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:03:34.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:03:34.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:03:12, diff=22.712944s, valid=True
2026-05-29T11:03:34.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:03:34.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:03:34.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:03:18, diff=16.719644s, valid=True
2026-05-29T11:03:34.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:03:34.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:03:34.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:03:34.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:03:34.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:03:34.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:03:34.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:03:12, diff=22.722695s, valid=True
2026-05-29T11:03:34.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:03:34.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:03:34.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:03:34.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978056.723343s, valid=True
2026-05-29T11:03:34.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:03:34.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:03:34.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:03:34.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:03:34.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:03:34.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:03:34.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:03:34.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:03:34.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:03:34.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:03:34.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:03:34.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:03:35.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:03:35.044 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:03:35.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:03:35.603 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:03:35.705 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:03:35.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:03:35.705 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:03:35.705 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:03:35.926 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:03:35.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:04:05.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:04:05.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:04:05.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:04:06.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:04:06.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:04:06.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:04:06.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-05-29T11:04:06.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:04:06.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-05-29T11:04:06.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:04:06.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:04:06.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:04:06.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-05-29T11:04:08.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-05-29T11:04:08.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:04:08.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:04:08.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:04:08.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:04:08.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:04:08.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:04:08.955 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:04:08.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:04:08.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:04:08.956 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:04:08.956 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:04:08.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:04:09.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:04:09.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:04:09.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:04:09.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:04:09.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:04:09.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:04:09.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:04:09.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:04:09.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:04:09.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:04:09.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:04:09.339 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:03:50
2026-05-29T11:04:09.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71669, datetime.datetime(2026, 5, 29, 11, 3, 50), datetime.datetime(2026, 5, 29, 11, 3, 49), 'salt', 11.26, 62.88, None, 12.14, 51.18, 6.8, 833.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:04:09.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:04:09.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:04:09.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:03:49, diff=20.345225s, valid=True
2026-05-29T11:04:09.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:04:09.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:04:09.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:04:12, diff=-2.651978s, valid=True
2026-05-29T11:04:09.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:04:09.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:04:09.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:03:49, diff=20.354519s, valid=True
2026-05-29T11:04:09.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:04:09.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:04:09.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:04:09.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:04:09.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:04:09.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:04:09.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:04:12, diff=-2.642514s, valid=True
2026-05-29T11:04:09.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:04:09.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:04:09.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:04:09.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978091.35814s, valid=True
2026-05-29T11:04:09.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:04:09.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:04:09.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:04:09.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:04:09.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:04:09.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:04:09.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:04:09.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:04:09.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:04:09.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:04:09.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:04:09.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:04:09.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:04:09.679 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:04:09.909 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:04:10.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:04:10.366 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:04:10.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:04:10.366 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:04:10.366 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:04:10.533 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:04:10.534 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:04:40.563 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:04:40.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:04:40.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:04:41.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:04:41.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:04:41.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:04:41.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T11:04:41.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:04:41.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-05-29T11:04:41.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:04:41.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:04:41.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:04:41.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-05-29T11:04:43.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-05-29T11:04:43.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:04:43.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:04:43.768 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:04:43.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:04:43.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:04:43.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:04:43.788 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:04:43.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:04:43.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:04:43.788 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:04:43.788 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:04:43.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:04:43.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:04:43.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:04:43.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:04:43.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:04:43.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:04:43.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:04:44.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:04:44.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:04:44.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:04:44.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:04:44.042 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:04:44.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:04:20
2026-05-29T11:04:44.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71670, datetime.datetime(2026, 5, 29, 11, 4, 20), datetime.datetime(2026, 5, 29, 11, 4, 20), 'salt', 11.19, 63.88, None, 10.16, 46.94, 6.57, 833.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:04:44.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:04:44.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:04:44.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:04:20, diff=24.109981s, valid=True
2026-05-29T11:04:44.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:04:44.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:04:44.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:04:12, diff=32.112834s, valid=True
2026-05-29T11:04:44.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:04:44.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:04:44.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:04:15, diff=29.120194s, valid=True
2026-05-29T11:04:44.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:04:44.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:04:44.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:04:44.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:04:44.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:04:44.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:04:44.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:04:12, diff=32.123244s, valid=True
2026-05-29T11:04:44.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:04:44.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:04:44.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:04:44.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978126.123905s, valid=True
2026-05-29T11:04:44.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:04:44.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:04:44.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:04:44.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:04:44.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:04:44.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:04:44.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:04:44.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:04:44.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:04:44.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:04:44.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:04:44.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:04:44.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:04:44.458 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:04:44.677 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:04:45.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:04:45.195 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:04:45.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:04:45.195 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:04:45.195 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:04:45.368 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:04:45.368 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:05:15.398 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:05:15.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:05:15.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:05:15.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:05:15.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:05:15.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:05:15.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-05-29T11:05:15.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:05:15.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T11:05:15.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:05:15.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:05:15.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:05:15.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-05-29T11:05:18.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-05-29T11:05:18.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:05:18.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:05:18.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:05:18.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:05:18.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:05:18.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:05:18.293 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:05:18.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:05:18.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:05:18.294 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:05:18.294 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:05:18.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:05:18.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:05:18.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:05:18.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:05:18.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:05:18.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:05:18.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:05:18.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:05:18.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:05:18.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:05:18.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:05:18.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:05:18.614 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:04:50
2026-05-29T11:05:18.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71671, datetime.datetime(2026, 5, 29, 11, 4, 50), datetime.datetime(2026, 5, 29, 11, 4, 50), 'salt', 11.26, 65.54, None, 11.4, 48.32, 6.21, 834.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:05:18.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:05:18.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:05:18.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:04:50, diff=28.620515s, valid=True
2026-05-29T11:05:18.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:05:18.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:05:18.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:05:12, diff=6.623332s, valid=True
2026-05-29T11:05:18.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:05:18.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:05:18.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:04:46, diff=32.629935s, valid=True
2026-05-29T11:05:18.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:05:18.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:05:18.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:05:18.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:05:18.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:05:18.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:05:18.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:05:12, diff=6.632959s, valid=True
2026-05-29T11:05:18.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:05:18.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:05:18.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:05:18.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978160.633603s, valid=True
2026-05-29T11:05:18.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:05:18.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:05:18.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:05:18.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:05:18.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:05:18.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:05:18.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:05:18.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:05:18.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:05:18.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:05:18.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:05:18.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:05:18.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:05:18.954 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:05:19.172 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:05:19.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:05:19.623 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:05:19.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:05:19.623 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:05:19.623 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:05:19.848 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:05:19.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:05:49.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:05:49.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:05:49.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:05:50.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:05:50.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:05:50.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:05:50.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-05-29T11:05:50.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:05:50.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-05-29T11:05:50.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:05:50.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:05:50.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:05:50.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-05-29T11:05:53.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-05-29T11:05:53.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:05:53.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:05:53.213 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:05:53.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:05:53.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:05:53.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:05:53.233 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:05:53.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:05:53.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:05:53.235 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:05:53.235 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:05:53.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:05:53.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:05:53.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:05:53.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:05:53.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:05:53.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:05:53.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:05:53.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:05:53.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:05:53.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:05:53.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:05:53.505 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:05:53.564 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:05:51
2026-05-29T11:05:53.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71673, datetime.datetime(2026, 5, 29, 11, 5, 51), datetime.datetime(2026, 5, 29, 11, 5, 50), 'salt', 11.03, 65.21, None, 13.2, 67.7, 6.27, 833.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:05:53.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:05:53.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:05:53.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:05:50, diff=3.570174s, valid=True
2026-05-29T11:05:53.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:05:53.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:05:53.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:06:12, diff=-18.426917s, valid=True
2026-05-29T11:05:53.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:05:53.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:05:53.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:05:46, diff=7.57977s, valid=True
2026-05-29T11:05:53.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:05:53.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:05:53.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:05:53.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:05:53.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:05:53.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:05:53.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:06:12, diff=-18.417218s, valid=True
2026-05-29T11:05:53.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:05:53.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:05:53.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:05:53.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978195.583434s, valid=True
2026-05-29T11:05:53.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:05:53.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:05:53.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:05:53.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:05:53.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:05:53.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:05:53.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:05:53.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:05:53.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:05:53.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:05:53.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:05:53.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:05:53.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:05:53.900 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:05:54.184 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:05:54.528 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:05:54.629 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:05:54.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:05:54.629 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:05:54.629 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:05:54.786 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:05:54.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:06:24.817 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:06:24.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:06:24.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:06:24.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:06:24.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:06:25.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:06:25.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-05-29T11:06:25.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:06:25.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-05-29T11:06:25.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:06:25.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:06:25.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:06:25.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-05-29T11:06:27.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-05-29T11:06:27.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:06:27.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:06:27.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:06:27.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:06:27.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:06:27.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:06:27.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:06:27.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:06:27.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:06:27.841 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:06:27.841 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:06:27.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:06:27.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:06:27.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:06:28.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:06:28.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:06:28.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:06:28.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:06:28.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:06:28.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:06:28.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:06:28.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:06:28.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:06:28.167 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:06:21
2026-05-29T11:06:28.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71674, datetime.datetime(2026, 5, 29, 11, 6, 21), datetime.datetime(2026, 5, 29, 11, 6, 21), 'salt', 11.03, 66.17, None, 11.47, 62.35, 6.06, 833.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:06:28.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:06:28.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:06:28.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:06:21, diff=7.175233s, valid=True
2026-05-29T11:06:28.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:06:28.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:06:28.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:06:12, diff=16.178123s, valid=True
2026-05-29T11:06:28.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:06:28.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:06:28.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:06:16, diff=12.184903s, valid=True
2026-05-29T11:06:28.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:06:28.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:06:28.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:06:28.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:06:28.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:06:28.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:06:28.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:06:12, diff=16.187956s, valid=True
2026-05-29T11:06:28.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:06:28.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:06:28.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:06:28.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978230.18861s, valid=True
2026-05-29T11:06:28.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:06:28.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:06:28.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:06:28.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:06:28.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:06:28.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:06:28.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:06:28.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:06:28.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:06:28.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:06:28.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:06:28.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:06:28.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:06:28.515 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:06:28.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:06:29.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:06:29.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:06:29.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:06:29.178 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:06:29.178 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:06:29.361 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:06:29.361 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:06:59.367 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:06:59.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:06:59.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:06:59.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:06:59.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:06:59.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:06:59.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-05-29T11:06:59.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:06:59.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-05-29T11:06:59.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:06:59.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:06:59.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:06:59.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-05-29T11:07:02.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-05-29T11:07:02.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:07:02.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:07:02.258 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:07:02.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:07:02.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:07:02.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:07:02.278 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:07:02.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:07:02.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:07:02.278 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:07:02.278 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:07:02.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:07:02.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:07:02.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:07:02.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:07:02.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:07:02.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:07:02.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:07:02.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:07:02.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:07:02.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:07:02.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:07:02.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:07:02.588 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:06:51
2026-05-29T11:07:02.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71675, datetime.datetime(2026, 5, 29, 11, 6, 51), datetime.datetime(2026, 5, 29, 11, 6, 51), 'salt', 11.06, 66.63, None, 15.67, 60.43, 5.96, 833.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:07:02.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:07:02.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:07:02.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:06:51, diff=11.594558s, valid=True
2026-05-29T11:07:02.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:07:02.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:07:02.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:07:12, diff=-9.401594s, valid=True
2026-05-29T11:07:02.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:07:02.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:07:02.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:06:47, diff=15.605048s, valid=True
2026-05-29T11:07:02.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:07:02.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:07:02.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:07:02.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:07:02.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:07:02.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:07:02.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:07:12, diff=-9.391927s, valid=True
2026-05-29T11:07:02.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:07:02.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:07:02.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:07:02.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978264.608738s, valid=True
2026-05-29T11:07:02.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:07:02.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:07:02.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:07:02.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:07:02.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:07:02.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:07:02.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:07:02.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:07:02.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:07:02.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:07:02.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:07:02.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:07:02.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:07:02.999 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:07:03.211 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:07:03.554 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:07:03.654 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:07:03.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:07:03.654 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:07:03.654 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:07:03.818 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:07:03.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:07:33.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:07:33.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:07:33.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:07:34.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:07:34.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:07:34.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:07:34.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-05-29T11:07:34.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:07:34.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-05-29T11:07:34.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:07:34.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:07:34.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:07:34.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-05-29T11:07:36.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-05-29T11:07:36.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:07:36.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:07:36.904 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:07:36.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:07:36.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:07:36.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:07:36.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:07:36.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:07:36.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:07:36.925 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:07:36.925 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:07:36.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:07:37.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:07:37.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:07:37.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:07:37.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:07:37.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:07:37.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:07:37.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:07:37.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:07:37.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:07:37.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:07:37.181 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:07:37.244 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:07:21
2026-05-29T11:07:37.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71676, datetime.datetime(2026, 5, 29, 11, 7, 21), datetime.datetime(2026, 5, 29, 11, 7, 21), 'salt', 10.89, 65.97, None, 15.74, 65.38, 6.09, 833.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:07:37.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:07:37.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:07:37.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:07:21, diff=16.250224s, valid=True
2026-05-29T11:07:37.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:07:37.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:07:37.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:07:12, diff=25.253137s, valid=True
2026-05-29T11:07:37.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:07:37.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:07:37.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:07:19, diff=18.259896s, valid=True
2026-05-29T11:07:37.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:07:37.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:07:37.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:07:37.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:07:37.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:07:37.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:07:37.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:07:12, diff=25.262922s, valid=True
2026-05-29T11:07:37.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:07:37.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:07:37.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:07:37.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978299.263582s, valid=True
2026-05-29T11:07:37.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:07:37.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:07:37.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:07:37.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:07:37.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:07:37.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:07:37.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:07:37.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:07:37.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:07:37.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:07:37.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:07:37.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:07:37.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:07:37.581 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:07:37.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:07:38.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:07:38.228 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:07:38.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:07:38.228 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:07:38.228 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:07:38.400 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:07:38.400 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:08:08.429 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:08:08.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:08:08.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:08:08.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:08:08.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:08:08.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:08:08.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-05-29T11:08:08.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:08:08.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-05-29T11:08:08.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:08:08.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:08:08.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:08:08.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T11:08:11.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-05-29T11:08:11.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:08:11.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:08:11.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:08:11.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:08:11.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:08:11.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:08:11.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:08:11.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:08:11.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:08:11.321 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:08:11.322 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:08:11.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:08:11.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:08:11.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:08:11.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:08:11.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:08:11.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:08:11.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:08:11.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:08:11.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:08:11.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:08:11.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:08:11.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:08:11.713 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:07:52
2026-05-29T11:08:11.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71677, datetime.datetime(2026, 5, 29, 11, 7, 52), datetime.datetime(2026, 5, 29, 11, 7, 51), 'salt', 11.06, 67.16, None, 15.28, 54.47, 5.85, 833.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:08:11.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:08:11.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:08:11.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:07:51, diff=20.721293s, valid=True
2026-05-29T11:08:11.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:08:11.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:08:11.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:08:12, diff=-0.275207s, valid=True
2026-05-29T11:08:11.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:08:11.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:08:11.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:07:50, diff=21.732738s, valid=True
2026-05-29T11:08:11.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:08:11.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:08:11.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:08:11.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:08:11.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:08:11.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:08:11.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:08:12, diff=-0.263628s, valid=True
2026-05-29T11:08:11.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:08:11.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:08:11.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:08:11.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978333.737124s, valid=True
2026-05-29T11:08:11.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:08:11.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:08:11.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:08:11.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:08:11.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:08:11.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:08:11.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:08:11.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:08:11.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:08:11.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:08:12.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:08:12.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:08:12.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:08:12.153 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:08:12.394 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:08:12.742 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:08:12.845 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:08:12.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:08:12.845 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:08:12.845 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:08:13.088 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:08:13.089 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:08:43.113 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:08:43.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:08:43.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:08:43.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:08:43.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:08:43.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:08:43.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-05-29T11:08:43.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:08:43.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-05-29T11:08:43.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:08:43.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:08:43.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:08:43.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T11:08:46.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T11:08:46.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:08:46.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:08:46.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:08:46.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:08:46.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:08:46.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:08:46.181 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:08:46.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:08:46.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:08:46.181 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:08:46.181 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:08:46.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:08:46.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:08:46.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:08:46.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:08:46.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:08:46.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:08:46.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:08:46.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:08:46.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:08:46.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:08:46.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:08:46.439 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:08:46.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:08:22
2026-05-29T11:08:46.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71678, datetime.datetime(2026, 5, 29, 11, 8, 22), datetime.datetime(2026, 5, 29, 11, 8, 21), 'salt', 11.03, 66.23, None, 14.79, 42.64, 6.05, 833.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:08:46.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:08:46.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:08:46.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:08:21, diff=25.505271s, valid=True
2026-05-29T11:08:46.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:08:46.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:08:46.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:08:12, diff=34.508165s, valid=True
2026-05-29T11:08:46.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:08:46.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:08:46.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:08:17, diff=29.51481s, valid=True
2026-05-29T11:08:46.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:08:46.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:08:46.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:08:46.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:08:46.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:08:46.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:08:46.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:08:12, diff=34.51785s, valid=True
2026-05-29T11:08:46.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:08:46.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:08:46.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:08:46.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978368.518503s, valid=True
2026-05-29T11:08:46.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:08:46.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:08:46.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:08:46.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:08:46.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:08:46.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:08:46.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:08:46.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:08:46.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:08:46.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:08:46.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:08:46.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:08:46.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:08:46.840 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:08:47.047 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:08:47.388 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:08:47.488 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:08:47.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:08:47.488 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:08:47.488 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:08:47.556 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:08:47.556 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:09:17.585 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:09:17.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:09:17.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:09:17.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:09:17.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:09:18.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:09:18.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-05-29T11:09:18.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:09:18.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-05-29T11:09:18.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:09:18.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:09:18.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:09:18.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-05-29T11:09:20.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-05-29T11:09:20.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:09:20.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:09:20.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:09:20.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:09:20.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:09:20.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:09:20.497 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:09:20.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:09:20.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:09:20.498 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:09:20.498 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:09:20.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:09:20.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:09:20.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:09:20.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:09:20.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:09:20.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:09:20.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:09:20.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:09:20.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:09:20.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:09:20.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:09:20.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:09:20.811 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:08:52
2026-05-29T11:09:20.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71679, datetime.datetime(2026, 5, 29, 11, 8, 52), datetime.datetime(2026, 5, 29, 11, 8, 52), 'salt', 11.22, 67.09, None, 14.12, 66.48, 5.87, 833.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:09:20.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:09:20.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:09:20.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:08:52, diff=28.817575s, valid=True
2026-05-29T11:09:20.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:09:20.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:09:20.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:09:12, diff=8.820459s, valid=True
2026-05-29T11:09:20.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:09:20.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:09:20.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:08:48, diff=32.827087s, valid=True
2026-05-29T11:09:20.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:09:20.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:09:20.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:09:20.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:09:20.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:09:20.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:09:20.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:09:12, diff=8.830112s, valid=True
2026-05-29T11:09:20.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:09:20.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:09:20.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:09:20.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978402.830772s, valid=True
2026-05-29T11:09:20.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:09:20.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:09:20.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:09:20.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:09:20.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:09:20.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:09:20.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:09:20.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:09:20.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:09:21.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:09:21.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:09:21.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:09:21.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:09:21.213 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:09:21.421 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:09:21.766 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:09:21.867 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:09:21.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:09:21.867 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:09:21.867 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:09:22.034 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:09:22.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:09:52.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:09:52.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:09:52.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:09:52.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:09:52.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:09:52.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:09: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-05-29T11:09:52.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:09: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-05-29T11:09:52.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:09:52.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:09:52.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:09:52.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-05-29T11:09: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-05-29T11:09:55.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:09:55.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:09:55.528 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:09:55.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:09:55.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:09:55.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:09:55.550 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:09:55.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:09:55.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:09:55.550 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:09:55.550 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:09:55.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:09:55.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:09:55.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:09:55.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:09:55.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:09:55.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:09:55.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:09:55.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:09:55.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:09:55.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:09:55.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:09:55.801 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:09:55.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:09:52
2026-05-29T11:09:55.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71681, datetime.datetime(2026, 5, 29, 11, 9, 52), datetime.datetime(2026, 5, 29, 11, 9, 52), 'salt', 11.09, 64.47, None, 19.8, 62.42, 6.43, 833.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:09:55.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:09:55.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:09:55.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:09:52, diff=3.866447s, valid=True
2026-05-29T11:09:55.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:09:55.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:09:55.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:10:12, diff=-16.130738s, valid=True
2026-05-29T11:09:55.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:09:55.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:09:55.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:09:48, diff=7.875926s, valid=True
2026-05-29T11:09:55.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:09:55.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:09:55.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:09:55.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:09:55.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:09:55.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:09:55.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:10:12, diff=-16.120944s, valid=True
2026-05-29T11:09:55.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:09:55.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:09:55.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:09:55.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978437.879746s, valid=True
2026-05-29T11:09:55.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:09:55.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:09:55.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:09:55.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:09:55.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:09:55.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:09:55.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:09:55.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:09:55.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:09:56.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:09:56.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:09:56.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:09:56.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:09:56.197 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:09:56.409 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:09:56.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:09:56.848 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:09:56.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:09:56.848 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:09:56.848 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:09:59.707 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:09:59.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:10:29.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:10:29.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:10:29.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:10:30.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:10:30.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:10:30.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:10:30.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-05-29T11:10:30.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:10:30.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-05-29T11:10:30.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:10:30.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:10:30.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:10:30.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-05-29T11:10:32.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-05-29T11:10:32.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:10:32.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:10:32.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:10:32.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:10:32.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:10:32.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:10:32.793 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:10:32.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:10:32.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:10:32.794 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:10:32.794 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:10:32.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:10:32.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:10:32.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:10:32.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:10:32.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:10:33.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:10:33.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:10:33.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:10:33.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:10:33.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:10:33.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:10:33.053 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:10:33.111 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:10:23
2026-05-29T11:10:33.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71682, datetime.datetime(2026, 5, 29, 11, 10, 23), datetime.datetime(2026, 5, 29, 11, 10, 22), 'salt', 11.19, 63.31, None, 17.68, 59.32, 6.7, 833.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:10:33.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:10:33.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:10:33.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:10:22, diff=11.117129s, valid=True
2026-05-29T11:10:33.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:10:33.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:10:33.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:10:12, diff=21.119916s, valid=True
2026-05-29T11:10:33.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:10:33.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:10:33.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:10:18, diff=15.126577s, valid=True
2026-05-29T11:10:33.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:10:33.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:10:33.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:10:33.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:10:33.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:10:33.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:10:33.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:10:12, diff=21.129582s, valid=True
2026-05-29T11:10:33.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:10:33.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:10:33.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:10:33.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978475.130238s, valid=True
2026-05-29T11:10:33.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:10:33.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:10:33.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:10:33.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:10:33.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:10:33.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:10:33.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:10:33.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:10:33.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:10:33.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:10:33.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:10:33.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:10:33.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:10:33.469 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:10:33.690 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:10:34.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:10:34.147 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:10:34.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:10:34.148 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:10:34.148 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:10:34.422 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:10:34.422 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:11:04.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:11:04.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:11:04.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:11:04.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:11:04.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:11:05.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:11:05.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T11:11:05.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:11:05.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-05-29T11:11:05.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:11:05.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:11:05.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:11:05.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-05-29T11:11:07.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T11:11:07.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:11:07.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:11:07.842 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:11:07.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:11:07.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:11:07.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:11:07.863 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:11:07.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:11:07.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:11:07.864 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:11:07.864 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:11:07.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:11:07.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:11:07.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:11:08.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:11:08.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:11:08.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:11:08.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:11:08.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:11:08.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:11:08.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:11:08.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:11:08.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:11:08.179 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:10:53
2026-05-29T11:11:08.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71683, datetime.datetime(2026, 5, 29, 11, 10, 53), datetime.datetime(2026, 5, 29, 11, 10, 52), 'salt', 11.26, 63.74, None, 19.34, 42.97, 6.61, 833.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:11:08.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:11:08.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:11:08.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:10:52, diff=16.186149s, valid=True
2026-05-29T11:11:08.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:11:08.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:11:08.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:11:12, diff=-3.81095s, valid=True
2026-05-29T11:11:08.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:11:08.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:11:08.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:10:49, diff=19.19579s, valid=True
2026-05-29T11:11:08.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:11:08.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:11:08.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:11:08.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:11:08.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:11:08.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:11:08.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:11:12, diff=-3.801121s, valid=True
2026-05-29T11:11:08.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:11:08.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:11:08.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:11:08.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978510.199553s, valid=True
2026-05-29T11:11:08.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:11:08.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:11:08.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:11:08.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:11:08.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:11:08.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:11:08.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:11:08.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:11:08.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:11:08.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:11:08.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:11:08.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:11:08.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:11:08.526 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:11:08.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:11:09.107 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:11:09.268 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:11:09.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:11:09.268 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:11:09.269 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:11:09.537 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:11:09.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:11:39.568 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:11:39.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:11:39.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:11:39.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:11:39.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:11:39.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:11:39.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-05-29T11:11:39.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:11:39.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-05-29T11:11:40.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:11:40.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:11:40.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:11:40.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-05-29T11:11:42.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-05-29T11:11:42.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:11:42.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:11:42.768 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:11:42.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:11:42.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:11:42.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:11:42.789 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:11:42.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:11:42.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:11:42.790 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:11:42.790 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:11:42.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:11:42.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:11:42.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:11:42.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:11:42.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:11:43.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:11:43.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:11:43.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:11:43.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:11:43.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:11:43.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:11:43.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:11:43.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:11:23
2026-05-29T11:11:43.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71684, datetime.datetime(2026, 5, 29, 11, 11, 23), datetime.datetime(2026, 5, 29, 11, 11, 22), 'salt', 11.49, 64.41, None, 14.79, 41.75, 6.47, 833.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:11:43.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:11:43.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:11:43.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:11:22, diff=21.120897s, valid=True
2026-05-29T11:11:43.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:11:43.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:11:43.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:11:12, diff=31.123773s, valid=True
2026-05-29T11:11:43.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:11:43.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:11:43.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:11:20, diff=23.130483s, valid=True
2026-05-29T11:11:43.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:11:43.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:11:43.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:11:43.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:11:43.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:11:43.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:11:43.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:11:12, diff=31.133513s, valid=True
2026-05-29T11:11:43.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:11:43.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:11:43.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:11:43.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978545.134221s, valid=True
2026-05-29T11:11:43.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:11:43.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:11:43.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:11:43.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:11:43.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:11:43.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:11:43.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:11:43.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:11:43.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:11:43.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:11:43.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:11:43.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:11:43.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:11:43.449 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:11:43.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:11:43.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:11:44.096 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:11:44.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:11:44.097 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:11:44.097 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:11:44.354 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:11:44.354 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:12:14.384 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:12:14.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:12:14.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:12:14.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:12:14.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:12:15.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:12:15.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-05-29T11:12:15.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:12:15.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-05-29T11:12:15.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:12:15.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:12:15.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:12:15.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-05-29T11:12:17.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-05-29T11:12:17.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:12:17.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:12:17.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:12:17.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:12:17.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:12:17.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:12:17.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:12:17.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:12:17.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:12:17.520 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:12:17.520 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:12:17.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:12:17.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:12:17.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:12:17.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:12:17.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:12:17.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:12:17.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:12:17.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:12:17.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:12:17.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:12:17.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:12:17.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:12:17.848 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:11:53
2026-05-29T11:12:17.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71685, datetime.datetime(2026, 5, 29, 11, 11, 53), datetime.datetime(2026, 5, 29, 11, 11, 53), 'salt', 11.82, 64.91, None, 14.86, 57.38, 6.38, 833.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:12:17.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:12:17.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:12:17.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:11:53, diff=24.854903s, valid=True
2026-05-29T11:12:17.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:12:17.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:12:17.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:12:12, diff=5.857813s, valid=True
2026-05-29T11:12:17.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:12:17.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:12:17.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:11:52, diff=25.864416s, valid=True
2026-05-29T11:12:17.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:12:17.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:12:17.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:12:17.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:12:17.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:12:17.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:12:17.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:12:12, diff=5.867422s, valid=True
2026-05-29T11:12:17.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:12:17.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:12:17.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:12:17.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978579.868103s, valid=True
2026-05-29T11:12:17.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:12:17.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:12:17.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:12:17.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:12:17.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:12:17.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:12:17.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:12:17.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:12:17.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:12:18.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:12:18.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:12:18.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:12:18.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:12:18.188 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:12:18.474 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:12:18.849 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:12:18.949 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:12:18.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:12:18.949 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:12: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-05-29T11:12:19.207 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:12:19.207 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:12:49.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:12:49.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:12:49.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:12:49.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:12:49.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:12:49.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:12:49.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-05-29T11:12:49.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:12:49.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-05-29T11:12:49.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:12:49.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:12:49.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:12:49.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-05-29T11:12: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-05-29T11:12:52.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:12:52.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:12:52.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:12:52.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:12:52.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:12:52.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:12:52.341 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:12:52.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:12:52.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:12:52.341 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:12:52.341 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:12:52.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:12:52.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:12:52.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:12:52.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:12:52.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:12:52.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:12:52.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:12:52.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:12:52.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:12:52.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:12:52.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:12:52.625 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:12:52.687 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:12:24
2026-05-29T11:12:52.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71686, datetime.datetime(2026, 5, 29, 11, 12, 24), datetime.datetime(2026, 5, 29, 11, 12, 23), 'salt', 11.92, 64.41, None, 18.28, 47.19, 6.49, 833.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:12:52.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:12:52.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:12:52.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:12:23, diff=29.694059s, valid=True
2026-05-29T11:12:52.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:12:52.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:12:52.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:12:12, diff=40.696903s, valid=True
2026-05-29T11:12:52.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:12:52.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:12:52.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:12:23, diff=29.703724s, valid=True
2026-05-29T11:12:52.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:12:52.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:12:52.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:12:52.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:12:52.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:12:52.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:12:52.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:12:12, diff=40.706828s, valid=True
2026-05-29T11:12:52.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:12:52.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:12:52.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:12:52.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978614.707505s, valid=True
2026-05-29T11:12:52.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:12:52.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:12:52.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:12:52.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:12:52.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:12:52.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:12:52.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:12:52.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:12:52.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:12:52.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:12:52.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:12:52.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:12:52.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:12:53.025 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:12:53.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:12:53.599 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:12:53.701 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:12:53.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:12:53.701 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:12:53.701 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:12:53.930 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:12:53.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:13:23.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:13:23.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:13:23.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:13:24.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:13:24.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:13:24.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:13:24.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-05-29T11:13:24.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:13:24.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-05-29T11:13:24.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:13:24.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:13:24.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:13:24.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-05-29T11:13:26.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-05-29T11:13:26.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:13:26.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:13:26.958 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:13:26.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:13:26.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:13:26.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:13:26.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:13:26.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:13:26.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:13:26.979 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:13:26.979 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:13:26.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:13:27.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:13:27.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:13:27.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:13:27.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:13:27.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:13:27.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:13:27.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:13:27.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:13:27.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:13:27.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:13:27.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:13:27.302 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:13:24
2026-05-29T11:13:27.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71688, datetime.datetime(2026, 5, 29, 11, 13, 24), datetime.datetime(2026, 5, 29, 11, 13, 24), 'salt', 11.89, 60.23, None, 14.68, 46.82, 7.46, 834.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:13:27.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:13:27.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:13:27.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:13:24, diff=3.310285s, valid=True
2026-05-29T11:13:27.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:13:27.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:13:27.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:13:12, diff=15.313238s, valid=True
2026-05-29T11:13:27.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:13:27.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:13:27.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:13:20, diff=7.320082s, valid=True
2026-05-29T11:13:27.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:13:27.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:13:27.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:13:27.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:13:27.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:13:27.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:13:27.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:13:12, diff=15.323168s, valid=True
2026-05-29T11:13:27.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:13:27.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:13:27.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:13:27.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978649.323843s, valid=True
2026-05-29T11:13:27.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:13:27.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:13:27.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:13:27.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:13:27.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:13:27.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:13:27.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:13:27.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:13:27.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:13:27.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:13:27.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:13:27.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:13:27.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:13:27.738 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:13:27.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:13:28.296 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:13:28.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:13:28.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:13:28.397 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:13:28.397 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:13:28.570 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:13:28.570 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:13:58.583 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:13:58.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:13:58.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:13:59.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:13:59.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:13:59.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:13:59.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-05-29T11:13:59.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:13:59.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-05-29T11:13:59.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:13:59.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:13:59.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:13:59.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-05-29T11:14:01.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-05-29T11:14:01.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:14:01.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:14:01.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:14:01.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:14:01.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:14:01.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:14:01.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:14:01.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:14:01.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:14:01.775 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:14:01.775 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:14:01.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:14:01.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:14:01.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:14:01.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:14:01.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:14:02.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:14:02.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:14:02.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:14:02.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:14:02.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:14:02.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:14:02.083 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:14:02.144 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:13:54
2026-05-29T11:14:02.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71689, datetime.datetime(2026, 5, 29, 11, 13, 54), datetime.datetime(2026, 5, 29, 11, 13, 54), 'salt', 12.05, 62.18, None, 18.03, 56.25, 7.0, 833.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:14:02.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:14:02.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:14:02.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:13:54, diff=8.157175s, valid=True
2026-05-29T11:14:02.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:14:02.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:14:02.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:14:12, diff=-9.836909s, valid=True
2026-05-29T11:14:02.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:14:02.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:14:02.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:13:51, diff=11.177156s, valid=True
2026-05-29T11:14:02.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:14:02.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:14:02.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:14:02.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:14:02.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:14:02.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:14:02.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:14:12, diff=-9.816706s, valid=True
2026-05-29T11:14:02.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:14:02.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:14:02.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:14:02.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978684.184469s, valid=True
2026-05-29T11:14:02.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:14:02.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:14:02.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:14:02.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:14:02.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:14:02.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:14:02.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:14:02.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:14:02.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:14:02.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:14:02.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:14:02.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:14:02.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:14:02.508 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:14:02.714 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:14:03.063 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:14:03.163 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:14:03.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:14: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-05-29T11:14: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-05-29T11:14:03.417 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:14:03.417 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:14:33.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:14:33.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:14:33.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:14:33.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:14:33.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:14:34.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:14: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-05-29T11:14:34.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:14:34.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-05-29T11:14:34.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:14:34.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:14:34.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:14:34.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-05-29T11:14:36.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-05-29T11:14:36.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:14:36.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:14:36.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:14:36.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:14:36.577 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:14:36.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:14:36.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:14:36.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:14:36.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:14:36.589 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:14:36.589 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:14:36.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:14:36.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:14:36.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:14:36.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:14:36.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:14:36.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:14:36.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:14:36.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:14:36.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:14:36.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:14:36.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:14:36.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:14:36.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:14:24
2026-05-29T11:14:36.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71690, datetime.datetime(2026, 5, 29, 11, 14, 24), datetime.datetime(2026, 5, 29, 11, 14, 24), 'salt', 12.09, 62.15, None, 17.75, 58.71, 7.02, 833.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:14:36.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:14:36.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:14:36.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:14:24, diff=12.904203s, valid=True
2026-05-29T11:14:36.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:14:36.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:14:36.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:14:12, diff=24.907042s, valid=True
2026-05-29T11:14:36.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:14:36.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:14:36.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:14:21, diff=15.913672s, valid=True
2026-05-29T11:14:36.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:14:36.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:14:36.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:14:36.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:14:36.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:14:36.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:14:36.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:14:12, diff=24.916719s, valid=True
2026-05-29T11:14:36.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:14:36.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:14:36.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:14:36.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978718.917386s, valid=True
2026-05-29T11:14:36.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:14:36.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:14:36.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:14:36.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:14:36.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:14:36.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:14:36.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:14:36.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:14:36.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:14:37.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:14:37.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:14:37.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:14:37.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:14:37.307 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:14:37.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:14:37.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:14:37.966 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:14:37.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:14:37.967 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:14:37.967 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:14:38.136 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:14:38.136 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:15:08.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:15:08.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:15:08.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:15:08.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:15:08.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:15:08.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:15:08.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-05-29T11:15:08.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:15:08.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-05-29T11:15:08.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:15:08.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:15:08.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:15:08.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-05-29T11:15:11.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-05-29T11:15:11.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:15:11.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:15:11.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:15:11.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:15:11.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:15:11.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:15:11.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:15:11.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:15:11.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:15:11.033 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:15:11.033 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:15:11.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:15:11.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:15:11.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:15:11.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:15:11.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:15:11.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:15:11.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:15:11.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:15:11.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:15:11.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:15:11.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:15:11.297 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:15:11.354 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:14:55
2026-05-29T11:15:11.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71691, datetime.datetime(2026, 5, 29, 11, 14, 55), datetime.datetime(2026, 5, 29, 11, 14, 54), 'salt', 11.92, 60.86, None, 15.6, 49.94, 7.31, 833.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:15:11.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:15:11.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:15:11.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:14:54, diff=17.360569s, valid=True
2026-05-29T11:15:11.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:15:11.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:15:11.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:15:12, diff=-0.636564s, valid=True
2026-05-29T11:15:11.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:15:11.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:15:11.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:14:51, diff=20.370183s, valid=True
2026-05-29T11:15:11.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:15:11.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:15:11.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:15:11.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:15:11.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:15:11.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:15:11.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:15:12, diff=-0.626767s, valid=True
2026-05-29T11:15:11.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:15:11.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:15:11.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:15:11.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978753.373897s, valid=True
2026-05-29T11:15:11.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:15:11.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:15:11.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:15:11.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:15:11.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:15:11.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:15:11.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:15:11.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:15:11.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:15:11.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:15:11.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:15:11.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:15:11.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:15:11.693 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:15:11.920 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:15:12.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:15:12.359 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:15:12.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:15:12.359 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:15:12.359 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:15:12.534 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:15:12.534 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:15:42.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:15:42.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:15:42.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:15:42.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:15:42.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:15:43.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:15:43.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-05-29T11:15:43.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:15:43.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-05-29T11:15:43.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:15:43.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:15:43.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:15:43.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-05-29T11:15:45.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-05-29T11:15:45.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:15:45.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:15:45.607 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:15:45.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:15:45.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:15:45.628 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:15:45.628 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:15:45.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:15:45.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:15:45.629 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:15:45.629 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:15:45.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:15:45.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:15:45.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:15:45.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:15:45.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:15:45.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:15:45.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:15:45.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:15:45.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:15:45.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:15:45.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:15:45.882 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:15:45.941 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:15:25
2026-05-29T11:15:45.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71692, datetime.datetime(2026, 5, 29, 11, 15, 25), datetime.datetime(2026, 5, 29, 11, 15, 24), 'salt', 11.85, 61.72, None, 18.6, 55.83, 7.1, 833.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:15:45.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:15:45.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:15:45.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:15:24, diff=21.94778s, valid=True
2026-05-29T11:15:45.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:15:45.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:15:45.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:15:12, diff=33.95072s, valid=True
2026-05-29T11:15:45.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:15:45.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:15:45.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:15:21, diff=24.957428s, valid=True
2026-05-29T11:15:45.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:15:45.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:15:45.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:15:45.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:15:45.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:15:45.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:15:45.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:15:12, diff=33.960545s, valid=True
2026-05-29T11:15:45.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:15:45.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:15:45.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:15:45.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978787.96122s, valid=True
2026-05-29T11:15:45.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:15:45.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:15:45.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:15:45.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:15:45.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:15:46.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:15:46.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:15:46.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:15:46.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:15:46.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:15:46.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:15:46.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:15:46.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:15:46.350 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:15:46.562 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:15:46.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:15:47.044 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:15:47.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:15:47.045 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:15:47.045 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:15:47.213 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:15:47.213 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:16:17.223 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:16:17.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:16:17.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:16:17.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:16:17.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:16:17.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:16:17.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-05-29T11:16:17.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:16:17.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-05-29T11:16:17.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:16:17.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:16:17.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:16:17.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-05-29T11:16:20.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-05-29T11:16:20.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:16:20.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:16:20.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:16:20.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:16:20.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:16:20.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:16:20.313 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:16:20.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:16:20.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:16:20.313 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:16:20.313 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:16:20.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:16:20.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:16:20.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:16:20.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:16:20.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:16:20.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:16:20.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:16:20.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:16:20.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:16:20.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:16:20.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:16:20.564 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:16:20.623 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:15:55
2026-05-29T11:16:20.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71693, datetime.datetime(2026, 5, 29, 11, 15, 55), datetime.datetime(2026, 5, 29, 11, 15, 55), 'salt', 11.79, 62.55, None, 17.26, 40.74, 6.91, 833.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:16:20.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:16:20.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:16:20.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:15:55, diff=25.62915s, valid=True
2026-05-29T11:16:20.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:16:20.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:16:20.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:16:12, diff=8.632007s, valid=True
2026-05-29T11:16:20.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:16:20.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:16:20.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:15:53, diff=27.638702s, valid=True
2026-05-29T11:16:20.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:16:20.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:16:20.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:16:20.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:16:20.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:16:20.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:16:20.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:16:12, diff=8.641742s, valid=True
2026-05-29T11:16:20.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:16:20.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:16:20.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:16:20.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978822.642384s, valid=True
2026-05-29T11:16:20.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:16:20.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:16:20.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:16:20.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:16:20.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:16:20.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:16:20.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:16:20.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:16:20.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:16:20.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:16:20.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:16:20.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:16:20.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:16:20.958 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:16:21.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:16:21.504 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:16:21.623 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:16:21.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:16:21.624 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:16:21.624 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:16:21.865 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:16:21.865 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:16:51.870 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:16:51.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:16:51.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:16:52.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:16:52.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:16:52.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:16:52.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-05-29T11:16:52.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:16:52.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-05-29T11:16:52.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:16:52.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:16:52.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:16:52.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-05-29T11:16:54.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-05-29T11:16:54.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:16:54.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:16:54.856 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:16:54.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:16:54.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:16:54.877 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:16:54.877 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:16:54.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:16:54.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:16:54.877 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:16:54.877 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:16:54.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:16:54.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:16:54.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:16:55.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:16:55.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:16:55.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:16:55.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:16:55.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T11:16:55.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:16:55.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:16:55.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:16:55.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:16:55.198 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:16:25
2026-05-29T11:16:55.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71694, datetime.datetime(2026, 5, 29, 11, 16, 25), datetime.datetime(2026, 5, 29, 11, 16, 25), 'salt', 11.75, 62.32, None, 18.07, 42.55, 6.95, 833.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:16:55.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:16:55.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:16:55.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:16:25, diff=30.204102s, valid=True
2026-05-29T11:16:55.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:16:55.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:16:55.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:16:12, diff=43.206895s, valid=True
2026-05-29T11:16:55.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:16:55.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:16:55.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:16:24, diff=31.213375s, valid=True
2026-05-29T11:16:55.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:16:55.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:16:55.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:16:55.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:16:55.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:16:55.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T11:16:55.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:16:12, diff=43.216346s, valid=True
2026-05-29T11:16:55.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:16:55.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:16:55.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:16:55.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978857.217015s, valid=True
2026-05-29T11:16:55.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:16:55.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:16:55.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:16:55.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:16:55.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:16:55.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:16:55.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:16:55.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:16:55.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:16:55.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:16:55.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:16:55.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:16:55.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:16:55.535 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:16:55.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:16:56.089 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:16:56.189 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:16:56.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:16:56.190 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:16:56.190 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:16:56.464 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:16:56.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:17:26.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:17:26.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:17:26.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:17:26.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:17:26.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:17:26.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:17:26.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-05-29T11:17:26.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:17:26.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T11:17:26.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:17:26.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:17:26.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:17:26.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-05-29T11:17:29.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-05-29T11:17:29.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:17:29.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:17:29.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:17:29.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:17:29.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:17:29.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:17:29.445 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:17:29.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:17:29.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:17:29.445 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:17:29.446 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:17:29.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:17:29.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:17:29.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:17:29.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:17:29.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:17:29.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:17:29.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:17:29.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:17:29.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:17:29.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:17:29.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:17:29.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:17:29.763 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:17:26
2026-05-29T11:17:29.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71696, datetime.datetime(2026, 5, 29, 11, 17, 26), datetime.datetime(2026, 5, 29, 11, 17, 25), 'salt', 11.59, 59.56, None, 14.75, 53.13, 7.6, 833.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:17:29.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:17:29.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:17:29.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:17:25, diff=4.769172s, valid=True
2026-05-29T11:17:29.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:17:29.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:17:29.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:17:12, diff=17.772029s, valid=True
2026-05-29T11:17:29.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:17:29.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:17:29.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:17:23, diff=6.77867s, valid=True
2026-05-29T11:17:29.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:17:29.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:17:29.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:17:29.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:17:29.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:17:29.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:17:29.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:17:12, diff=17.78168s, valid=True
2026-05-29T11:17:29.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:17:29.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:17:29.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:17:29.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978891.782359s, valid=True
2026-05-29T11:17:29.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:17:29.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:17:29.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:17:29.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:17:29.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:17:29.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:17:29.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:17:29.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:17:29.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:17:29.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:17:29.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:17:30.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:17:30.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:17:30.120 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:17:30.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:17:30.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:17:30.832 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:17:30.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:17:30.832 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:17:30.833 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:17:31.093 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:17:31.093 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:18:01.118 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:18:01.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:18:01.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:18:01.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:18:01.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:18:01.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:18:01.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-05-29T11:18:01.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:18:01.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-05-29T11:18:01.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:18:01.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:18:01.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:18:01.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-05-29T11:18:04.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-05-29T11:18:04.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:18:04.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:18:04.181 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:18:04.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:18:04.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:18:04.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:18:04.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:18:04.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:18:04.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:18:04.202 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:18:04.202 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:18:04.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:18:04.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:18:04.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:18:04.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:18:04.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:18:04.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:18:04.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:18:04.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:18:04.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:18:04.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:18:04.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:18:04.474 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:18:04.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:17:56
2026-05-29T11:18:04.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71697, datetime.datetime(2026, 5, 29, 11, 17, 56), datetime.datetime(2026, 5, 29, 11, 17, 56), 'salt', 11.79, 59.26, None, 14.75, 61.71, 7.68, 833.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:18:04.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:18:04.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:18:04.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:17:56, diff=8.541774s, valid=True
2026-05-29T11:18:04.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:18:04.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:18:04.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:18:12, diff=-7.455384s, valid=True
2026-05-29T11:18:04.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:18:04.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:18:04.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:17:54, diff=10.551284s, valid=True
2026-05-29T11:18:04.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:18:04.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:18:04.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:18:04.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:18:04.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:18:04.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:18:04.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:18:12, diff=-7.44563s, valid=True
2026-05-29T11:18:04.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:18:04.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:18:04.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:18:04.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978926.555047s, valid=True
2026-05-29T11:18:04.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:18:04.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:18:04.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:18:04.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:18:04.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:18:04.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:18:04.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:18:04.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:18:04.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:18:04.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:18:04.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:18:04.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:18:04.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:18:04.869 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:18:05.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:18:05.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:18:05.517 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:18:05.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:18: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-05-29T11:18: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-05-29T11:18:05.785 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:18:05.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:18:35.789 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:18:35.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:18:35.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:18:36.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:18:36.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:18:36.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:18:36.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-05-29T11:18:36.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:18:36.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-05-29T11:18:36.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:18:36.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:18:36.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:18:36.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-05-29T11:18: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-05-29T11:18:38.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:18:38.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:18:38.993 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:18:38.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:18:39.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:18:39.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:18:39.013 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:18:39.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:18:39.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:18:39.013 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:18:39.013 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:18:39.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:18:39.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:18:39.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:18:39.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:18:39.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:18:39.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:18:39.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:18:39.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:18:39.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:18:39.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:18:39.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:18:39.268 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:18:39.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:18:26
2026-05-29T11:18:39.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71698, datetime.datetime(2026, 5, 29, 11, 18, 26), datetime.datetime(2026, 5, 29, 11, 18, 26), 'salt', 11.98, 59.63, None, 16.69, 54.56, 7.6, 833.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:18:39.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:18:39.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:18:39.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:18:26, diff=13.333077s, valid=True
2026-05-29T11:18:39.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:18:39.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:18:39.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:18:12, diff=27.335942s, valid=True
2026-05-29T11:18:39.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:18:39.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:18:39.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:18:24, diff=15.342532s, valid=True
2026-05-29T11:18:39.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:18:39.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:18:39.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:18:39.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:18:39.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:18:39.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:18:39.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:18:12, diff=27.345593s, valid=True
2026-05-29T11:18:39.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:18:39.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:18:39.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:18:39.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978961.346252s, valid=True
2026-05-29T11:18:39.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:18:39.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:18:39.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:18:39.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:18:39.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:18:39.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:18:39.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:18:39.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:18:39.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:18:39.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:18:39.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:18:39.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:18:39.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:18:39.661 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:18:39.884 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:18:40.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:18:40.431 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:18:40.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:18:40.431 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:18:40.431 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:18:40.597 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:18:40.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:19:10.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:19:10.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:19:10.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:19:10.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:19:10.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:19:11.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:19:11.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-05-29T11:19:11.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:19:11.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-05-29T11:19:11.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:19:11.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:19:11.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:19:11.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T11:19:13.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-05-29T11:19:13.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:19:13.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:19:13.989 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:19:13.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:19:13.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:19:14.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:19:14.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:19:14.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:19:14.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:19:14.010 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:19:14.010 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:19:14.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:19:14.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:19:14.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:19:14.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:19:14.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:19:14.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T11:19:14.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:19:14.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T11:19:14.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:19:14.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:19:14.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:19:14.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:19:14.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:18:56
2026-05-29T11:19:14.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71699, datetime.datetime(2026, 5, 29, 11, 18, 56), datetime.datetime(2026, 5, 29, 11, 18, 56), 'salt', 11.88, 59.26, None, 18.84, 38.18, 7.68, 833.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:19:14.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:19:14.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:19:14.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:18:56, diff=18.328832s, valid=True
2026-05-29T11:19:14.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:19:14.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T11:19:14.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:19:12, diff=2.331694s, valid=True
2026-05-29T11:19:14.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:19:14.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:19:14.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:18:54, diff=20.338321s, valid=True
2026-05-29T11:19:14.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:19:14.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:19:14.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:19:14.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:19:14.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:19:14.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T11:19:14.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:19:12, diff=2.341386s, valid=True
2026-05-29T11:19:14.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:19:14.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:19:14.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:19:14.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=978996.342062s, valid=True
2026-05-29T11:19:14.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:19:14.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:19:14.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:19:14.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:19:14.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:19:14.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:19:14.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:19:14.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:19:14.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:19:14.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:19:14.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:19:14.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:19:14.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:19:14.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:19:14.868 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:19:15.213 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:19:15.315 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:19:15.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:19:15.315 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:19:15.315 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:19:15.559 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:19:15.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:19:45.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:19:45.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:19:45.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:19:45.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:19:45.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:19:46.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:19:46.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T11:19:46.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:19:46.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-05-29T11:19:46.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:19:46.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:19:46.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:19:46.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-05-29T11:19:48.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-05-29T11:19:48.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:19:48.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:19:48.671 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:19:48.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:19:48.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:19:48.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:19:48.692 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:19:48.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:19:48.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:19:48.692 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:19:48.692 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:19:48.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:19:48.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:19:48.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:19:48.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:19:48.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:19:48.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T11:19:48.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:19:48.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T11:19:48.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:19:48.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:19:48.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:19:48.944 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:19:49.002 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:19:27
2026-05-29T11:19:49.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71700, datetime.datetime(2026, 5, 29, 11, 19, 27), datetime.datetime(2026, 5, 29, 11, 19, 26), 'salt', 11.95, 57.54, None, 18.91, 54.56, 8.11, 833.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:19:49.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:19:49.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:19:49.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:19:26, diff=23.008801s, valid=True
2026-05-29T11:19:49.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:19:49.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T11:19:49.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:19:12, diff=37.011718s, valid=True
2026-05-29T11:19:49.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:19:49.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:19:49.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:19:24, diff=25.018296s, valid=True
2026-05-29T11:19:49.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:19:49.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:19:49.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:19:49.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:19:49.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:19:49.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T11:19:49.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:19:12, diff=37.021407s, valid=True
2026-05-29T11:19:49.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:19:49.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:19:49.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:19:49.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979031.022087s, valid=True
2026-05-29T11:19:49.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:19:49.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:19:49.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:19:49.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:19:49.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:19:49.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:19:49.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:19:49.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:19:49.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:19:49.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:19:49.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:19:49.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:19:49.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:19:49.419 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:19:49.630 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:19:49.981 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:19:50.085 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:19:50.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:19:50.085 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:19:50.086 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:19:50.252 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:19:50.252 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:20:20.282 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:20:20.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:20:20.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:20:20.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:20:20.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:20:20.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:20:20.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-05-29T11:20:20.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:20:20.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-05-29T11:20:20.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:20:20.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:20:20.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:20:20.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-05-29T11:20: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-05-29T11:20:23.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:20:23.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:20:23.598 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:20:23.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:20:23.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:20:23.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:20:23.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:20:23.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:20:23.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:20:23.621 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:20:23.621 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:20:23.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:20:23.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:20:23.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:20:23.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:20:23.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:20:23.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-29T11:20:23.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:20:23.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-29T11:20:23.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:20:23.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:20:23.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:20:23.887 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:20:23.949 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:19:57
2026-05-29T11:20:23.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71701, datetime.datetime(2026, 5, 29, 11, 19, 57), datetime.datetime(2026, 5, 29, 11, 19, 56), 'salt', 11.92, 56.28, None, 17.22, 47.89, 8.42, 833.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:20:23.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:20:23.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:20:23.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:19:56, diff=27.955982s, valid=True
2026-05-29T11:20:23.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:20:23.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-29T11:20:23.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:20:12, diff=11.958879s, valid=True
2026-05-29T11:20:23.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:20:23.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:20:23.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:19:54, diff=29.965441s, valid=True
2026-05-29T11:20:23.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:20:23.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:20:23.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:20:23.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:20:23.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:20:23.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-29T11:20:23.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:20:12, diff=11.968495s, valid=True
2026-05-29T11:20:23.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:20:23.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:20:23.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:20:23.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979065.969177s, valid=True
2026-05-29T11:20:23.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:20:23.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:20:23.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:20:23.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:20:23.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:20:24.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:20:24.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:20:24.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:20:24.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:20:24.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:20:24.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:20:24.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:20:24.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:20:24.291 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:20:24.505 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:20:24.855 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:20:24.960 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:20:24.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:20:24.961 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:20:24.961 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:20:25.191 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:20:25.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:20:55.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:20:55.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:20:55.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:20:55.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:20:55.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:20:55.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:20:55.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T11:20:55.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:20:55.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T11:20:55.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:20:55.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:20:55.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:20:55.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-05-29T11:20:58.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-05-29T11:20:58.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:20:58.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:20:58.230 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:20:58.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:20:58.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:20:58.252 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:20:58.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:20:58.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:20:58.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:20:58.252 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:20:58.252 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:20:58.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:20:58.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:20:58.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:20:58.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:20:58.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:20:58.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:20:58.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:20:58.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:20:58.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:20:58.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:20:58.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:20:58.506 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:20:58.565 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:20:57
2026-05-29T11:20:58.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71703, datetime.datetime(2026, 5, 29, 11, 20, 57), datetime.datetime(2026, 5, 29, 11, 20, 57), 'salt', 12.05, 58.07, None, 17.22, 46.13, 7.98, 833.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:20:58.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:20:58.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:20:58.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:20:57, diff=1.571486s, valid=True
2026-05-29T11:20:58.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:20:58.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:20:58.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:21:12, diff=-13.42568s, valid=True
2026-05-29T11:20:58.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:20:58.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:20:58.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:20:57, diff=1.580931s, valid=True
2026-05-29T11:20:58.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:20:58.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:20:58.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:20:58.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:20:58.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:20:58.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:20:58.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:21:12, diff=-13.416039s, valid=True
2026-05-29T11:20:58.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:20:58.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:20:58.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:20:58.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979100.584614s, valid=True
2026-05-29T11:20:58.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:20:58.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:20:58.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:20:58.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:20:58.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:20:58.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:20:58.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:20:58.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:20:58.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:20:58.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:20:58.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:20:58.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:20:58.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:20:58.973 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:20:59.197 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:20:59.543 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:20:59.643 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:20:59.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:20:59.643 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:20:59.644 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:20:59.885 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:20:59.885 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:21:29.914 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:21:29.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:21:29.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:21:30.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:21:30.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:21:30.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:21:30.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T11:21:30.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:21:30.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-05-29T11:21:30.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:21:30.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:21:30.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:21:30.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T11:21:32.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-05-29T11:21:32.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:21:32.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:21:32.725 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:21:32.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:21:32.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:21:32.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:21:32.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:21:32.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:21:32.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:21:32.746 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:21:32.746 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:21:32.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:21:32.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:21:32.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:21:32.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:21:32.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:21:32.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:21:32.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:21:33.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:21:33.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:21:33.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:21:33.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:21:33.012 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:21:33.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:21:27
2026-05-29T11:21:33.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71704, datetime.datetime(2026, 5, 29, 11, 21, 27), datetime.datetime(2026, 5, 29, 11, 21, 27), 'salt', 11.79, 57.51, None, 13.94, 48.34, 8.11, 834.02, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:21:33.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:21:33.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:21:33.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:21:27, diff=6.092597s, valid=True
2026-05-29T11:21:33.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:21:33.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:21:33.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:21:12, diff=21.095521s, valid=True
2026-05-29T11:21:33.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:21:33.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:21:33.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:21:25, diff=8.102207s, valid=True
2026-05-29T11:21:33.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:21:33.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:21:33.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:21:33.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:21:33.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:21:33.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:21:33.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:21:12, diff=21.105272s, valid=True
2026-05-29T11:21:33.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:21:33.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:21:33.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:21:33.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979135.105939s, valid=True
2026-05-29T11:21:33.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:21:33.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:21:33.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:21:33.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:21:33.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:21:33.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:21:33.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:21:33.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:21:33.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:21:33.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:21:33.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:21:33.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:21:33.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:21:33.426 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:21:33.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:21:33.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:21:34.083 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:21:34.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:21:34.083 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:21:34.084 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:21:34.233 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:21:34.233 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:22:04.264 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:22:04.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:22:04.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:22:04.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:22:04.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:22:04.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:22:04.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-05-29T11:22:04.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:22:04.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T11:22:04.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:22:04.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:22:04.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:22:04.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-05-29T11:22:07.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-05-29T11:22:07.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:22:07.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:22:07.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:22:07.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:22:07.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:22:07.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:22:07.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:22:07.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:22:07.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:22:07.158 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:22:07.158 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:22:07.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:22:07.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:22:07.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:22:07.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:22:07.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:22:07.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:22:07.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:22:07.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:22:07.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:22:07.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:22:07.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:22:07.418 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:22:07.482 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:21:58
2026-05-29T11:22:07.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71705, datetime.datetime(2026, 5, 29, 11, 21, 58), datetime.datetime(2026, 5, 29, 11, 21, 57), 'salt', 11.85, 59.3, None, 15.88, 53.85, 7.67, 833.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:22:07.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:22:07.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:22:07.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:21:57, diff=10.488387s, valid=True
2026-05-29T11:22:07.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:22:07.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:22:07.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:22:12, diff=-4.508654s, valid=True
2026-05-29T11:22:07.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:22:07.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:22:07.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:21:55, diff=12.49795s, valid=True
2026-05-29T11:22:07.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:22:07.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:22:07.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:22:07.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:22:07.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:22:07.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:22:07.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:22:12, diff=-4.499002s, valid=True
2026-05-29T11:22:07.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:22:07.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:22:07.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:22:07.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979169.501662s, valid=True
2026-05-29T11:22:07.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:22:07.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:22:07.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:22:07.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:22:07.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:22:07.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:22:07.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:22:07.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:22:07.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:22:07.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:22:07.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:22:07.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:22:07.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:22:07.887 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:22:08.103 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:22:08.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:22:08.552 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:22:08.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:22:08.552 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:22:08.552 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:22:08.727 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:22:08.727 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:22:38.753 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:22:38.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:22:38.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:22:39.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:22:39.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:22:39.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:22:39.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-05-29T11:22:39.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:22:39.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-05-29T11:22:39.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:22:39.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:22:39.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:22:39.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-05-29T11:22:41.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-05-29T11:22:41.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:22:41.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:22:41.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:22:41.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:22:41.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:22:41.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:22:41.661 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:22:41.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:22:41.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:22:41.661 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:22:41.661 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:22:41.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:22:41.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:22:41.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:22:41.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:22:41.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:22:41.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:22:41.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:22:41.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:22:41.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:22:41.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:22:41.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:22:41.948 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:22:42.008 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:22:28
2026-05-29T11:22:42.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71706, datetime.datetime(2026, 5, 29, 11, 22, 28), datetime.datetime(2026, 5, 29, 11, 22, 28), 'salt', 11.75, 57.27, None, 14.82, 62.04, 8.16, 833.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:22:42.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:22:42.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:22:42.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:22:28, diff=14.014643s, valid=True
2026-05-29T11:22:42.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:22:42.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:22:42.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:22:12, diff=30.017549s, valid=True
2026-05-29T11:22:42.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:22:42.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:22:42.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:22:26, diff=16.024222s, valid=True
2026-05-29T11:22:42.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:22:42.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:22:42.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:22:42.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:22:42.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:22:42.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:22:42.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:22:12, diff=30.027291s, valid=True
2026-05-29T11:22:42.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:22:42.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:22:42.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:22:42.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979204.02795s, valid=True
2026-05-29T11:22:42.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:22:42.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:22:42.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:22:42.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:22:42.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:22:42.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:22:42.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:22:42.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:22:42.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:22:42.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:22:42.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:22:42.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:22:42.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:22:42.348 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:22:42.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:22:42.906 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:22:43.007 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:22:43.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:22:43.008 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:22:43.008 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:22:43.172 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:22:43.172 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:23:13.173 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:23:13.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:23:13.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:23:13.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:23:13.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:23:13.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:23:13.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-05-29T11:23:13.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:23:13.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-05-29T11:23:13.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:23:13.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:23:13.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:23:13.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-05-29T11:23:16.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-05-29T11:23:16.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:23:16.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:23:16.234 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:23:16.234 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:23:16.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:23:16.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:23:16.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:23:16.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:23:16.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:23:16.256 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:23:16.256 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:23:16.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:23:16.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:23:16.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:23:16.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:23:16.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:23:16.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:23:16.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:23:16.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:23:16.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:23:16.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:23:16.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:23:16.515 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:23:16.574 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:22:58
2026-05-29T11:23:16.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71707, datetime.datetime(2026, 5, 29, 11, 22, 58), datetime.datetime(2026, 5, 29, 11, 22, 58), 'salt', 11.59, 57.97, None, 13.66, 66.1, 7.98, 833.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:23:16.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:23:16.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:23:16.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:22:58, diff=18.58091s, valid=True
2026-05-29T11:23:16.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:23:16.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:23:16.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:23:12, diff=4.583777s, valid=True
2026-05-29T11:23:16.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:23:16.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:23:16.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:22:56, diff=20.590456s, valid=True
2026-05-29T11:23:16.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:23:16.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:23:16.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:23:16.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:23:16.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:23:16.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:23:16.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:23:12, diff=4.59354s, valid=True
2026-05-29T11:23:16.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:23:16.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:23:16.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:23:16.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979238.594196s, valid=True
2026-05-29T11:23:16.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:23:16.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:23:16.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:23:16.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:23:16.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:23:16.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:23:16.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:23:16.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:23:16.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:23:16.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:23:16.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:23:16.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:23:16.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:23:16.910 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:23:17.118 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:23:17.463 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:23:17.563 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:23:17.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:23:17.563 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:23:17.563 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:23:19.785 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:23:19.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:23:49.815 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:23:49.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:23:49.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:23:50.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:23:50.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:23:50.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:23:50.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-05-29T11:23:50.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:23:50.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-05-29T11:23:50.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:23:50.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:23:50.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:23:50.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-05-29T11:23:52.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-05-29T11:23:52.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:23:52.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:23:52.878 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:23:52.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:23:52.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:23:52.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:23:52.898 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:23:52.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:23:52.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:23:52.898 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:23:52.898 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:23:52.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:23:52.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:23:52.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:23:53.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:23:53.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:23:53.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-29T11:23:53.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:23:53.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-29T11:23:53.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:23:53.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:23:53.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:23:53.156 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:23:53.213 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:23:28
2026-05-29T11:23:53.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71708, datetime.datetime(2026, 5, 29, 11, 23, 28), datetime.datetime(2026, 5, 29, 11, 23, 28), 'salt', 11.65, 58.47, None, 19.13, 51.62, 7.86, 833.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:23:53.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:23:53.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:23:53.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:23:28, diff=25.220011s, valid=True
2026-05-29T11:23:53.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:23:53.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-29T11:23:53.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:23:12, diff=41.222884s, valid=True
2026-05-29T11:23:53.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:23:53.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:23:53.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:23:26, diff=27.229513s, valid=True
2026-05-29T11:23:53.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:23:53.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:23:53.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:23:53.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:23:53.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:23:53.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-29T11:23:53.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:23:12, diff=41.232555s, valid=True
2026-05-29T11:23:53.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:23:53.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:23:53.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:23:53.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979275.233227s, valid=True
2026-05-29T11:23:53.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:23:53.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:23:53.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:23:53.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:23:53.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:23:53.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:23:53.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:23:53.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:23:53.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:23:53.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:23:53.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:23:53.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:23:53.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:23:53.550 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:23:53.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:23:54.096 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:23:54.255 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:23:54.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:23:54.255 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:23:54.255 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:23:54.459 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:23:54.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:24:24.489 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:24:24.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:24:24.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:24:25.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:24:25.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:24:25.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:24:25.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-05-29T11:24:25.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:24:25.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-05-29T11:24:25.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:24:25.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:24:25.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:24:25.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-05-29T11:24:28.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-05-29T11:24:28.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:24:28.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:24:28.230 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:24:28.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:24:28.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:24:28.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:24:28.251 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:24:28.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:24:28.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:24:28.251 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:24:28.251 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:24:28.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:24:28.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:24:28.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:24:28.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:24:28.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:24:28.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:24:28.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:24:28.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:24:28.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:24:28.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:24:28.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:24:28.503 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:24:28.561 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:23:59
2026-05-29T11:24:28.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71709, datetime.datetime(2026, 5, 29, 11, 23, 59), datetime.datetime(2026, 5, 29, 11, 23, 58), 'salt', 11.62, 58.04, None, 17.78, 37.5, 7.97, 833.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:24:28.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:24:28.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:24:28.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:23:58, diff=30.567188s, valid=True
2026-05-29T11:24:28.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:24:28.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:24:28.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:24:12, diff=16.570117s, valid=True
2026-05-29T11:24:28.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:24:28.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:24:28.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:23:56, diff=32.576799s, valid=True
2026-05-29T11:24:28.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:24:28.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:24:28.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:24:28.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:24:28.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:24:28.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:24:28.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:24:12, diff=16.579967s, valid=True
2026-05-29T11:24:28.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:24:28.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:24:28.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:24:28.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979310.580645s, valid=True
2026-05-29T11:24:28.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:24:28.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:24:28.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:24:28.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:24:28.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:24:28.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:24:28.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:24:28.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:24:28.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:24:28.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:24:28.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:24:28.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:24:28.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:24:28.900 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:24:29.108 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:24:29.450 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:24:29.550 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:24:29.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:24:29.550 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:24:29.550 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:24:29.704 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:24:29.704 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:24:59.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:24:59.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:24:59.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:24:59.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:24:59.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:25:00.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:25:00.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-05-29T11:25:00.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:25:00.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-05-29T11:25:00.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:25:00.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:25:00.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:25: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-05-29T11:25:02.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-05-29T11:25:02.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:25:02.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:25:02.697 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:25:02.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:25:02.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:25:02.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:25:02.718 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:25:02.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:25:02.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:25:02.718 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:25:02.719 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:25:02.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:25:02.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:25:02.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:25:02.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:25:02.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:25:02.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:25:02.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:25:02.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:25:02.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:25:02.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:25:02.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:25:02.976 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:25:03.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:24:59
2026-05-29T11:25:03.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71711, datetime.datetime(2026, 5, 29, 11, 24, 59), datetime.datetime(2026, 5, 29, 11, 24, 59), 'salt', 11.72, 56.15, None, 18.81, 47.61, 8.44, 833.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:25:03.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:25:03.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:25:03.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:24:59, diff=4.044764s, valid=True
2026-05-29T11:25:03.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:25:03.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:25:03.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:25:12, diff=-8.952082s, valid=True
2026-05-29T11:25:03.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:25:03.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:25:03.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:24:58, diff=5.054809s, valid=True
2026-05-29T11:25:03.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:25:03.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:25:03.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:25:03.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:25:03.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:25:03.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:25:03.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:25:12, diff=-8.941937s, valid=True
2026-05-29T11:25:03.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:25:03.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:25:03.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:25:03.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979345.058771s, valid=True
2026-05-29T11:25:03.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:25:03.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:25:03.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:25:03.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:25:03.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:25:03.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:25:03.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:25:03.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:25:03.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:25:03.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:25:03.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:25:03.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:25:03.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:25:03.434 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:25:03.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:25:04.135 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:25:04.236 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:25:04.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:25:04.236 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:25:04.236 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:25:04.495 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:25:04.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:25:34.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:25:34.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:25:34.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:25:34.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:25:34.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:25:35.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:25:35.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-05-29T11:25:35.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:25:35.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-05-29T11:25:35.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:25:35.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:25:35.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:25:35.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-05-29T11:25:37.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T11:25:37.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:25:37.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:25:37.923 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:25:37.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:25:37.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:25:37.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:25:37.946 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:25:37.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:25:37.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:25:37.946 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:25:37.946 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:25:37.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:25:38.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:25:38.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:25:38.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:25:38.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:25:38.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:25:38.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:25:38.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:25:38.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:25:38.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:25:38.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:25:38.210 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:25:38.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:25:30
2026-05-29T11:25:38.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71712, datetime.datetime(2026, 5, 29, 11, 25, 30), datetime.datetime(2026, 5, 29, 11, 25, 30), 'salt', 11.92, 56.05, None, 17.01, 39.92, 8.48, 833.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:25:38.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:25:38.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:25:38.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:25:30, diff=8.282414s, valid=True
2026-05-29T11:25:38.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:25:38.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:25:38.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:25:12, diff=26.285278s, valid=True
2026-05-29T11:25:38.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:25:38.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:25:38.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:25:29, diff=9.292056s, valid=True
2026-05-29T11:25:38.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:25:38.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:25:38.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:25:38.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:25:38.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:25:38.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:25:38.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:25:12, diff=26.295126s, valid=True
2026-05-29T11:25:38.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:25:38.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:25:38.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:25:38.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979380.295788s, valid=True
2026-05-29T11:25:38.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:25:38.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:25:38.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:25:38.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:25:38.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:25:38.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:25:38.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:25:38.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:25:38.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:25:38.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:25:38.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:25:38.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:25:38.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:25:38.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:25:38.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:25:39.161 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:25:39.261 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:25:39.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:25:39.262 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:25:39.262 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:25:39.430 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:25:39.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:26:09.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:26:09.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:26:09.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:26:09.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:26:09.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:26:10.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:26:10.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-05-29T11:26:10.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:26:10.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-05-29T11:26:10.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:26:10.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:26:10.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:26:10.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T11:26:12.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-05-29T11:26:12.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:26:12.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:26:12.741 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:26:12.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:26:12.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:26:12.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:26:12.762 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:26:12.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:26:12.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:26:12.763 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:26:12.763 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:26:12.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:26:12.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:26:12.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:26:12.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:26:12.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:26:12.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:26:12.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:26:13.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:26:13.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:26:13.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:26:13.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:26:13.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:26:13.087 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:26:00
2026-05-29T11:26:13.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71713, datetime.datetime(2026, 5, 29, 11, 26), datetime.datetime(2026, 5, 29, 11, 26), 'salt', 11.98, 56.18, None, 17.36, 48.74, 8.45, 833.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:26:13.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:26:13.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:26:13.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:26:00, diff=13.09331s, valid=True
2026-05-29T11:26:13.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:26:13.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:26:13.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:26:12, diff=1.096238s, valid=True
2026-05-29T11:26:13.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:26:13.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:26:13.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:25:57, diff=16.102979s, valid=True
2026-05-29T11:26:13.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:26:13.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:26:13.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:26:13.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:26:13.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:26:13.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:26:13.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:26:12, diff=1.106039s, valid=True
2026-05-29T11:26:13.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:26:13.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:26:13.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:26:13.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979415.106706s, valid=True
2026-05-29T11:26:13.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:26:13.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:26:13.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:26:13.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:26:13.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:26:13.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:26:13.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:26:13.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:26:13.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:26:13.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:26:13.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:26:13.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:26:13.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:26:13.506 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:26:13.718 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:26:14.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:26:14.170 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:26:14.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:26:14.170 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:26:14.170 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:26:14.433 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:26:14.433 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:26:44.463 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:26:44.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:26:44.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:26:44.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:26:44.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:26:45.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:26:45.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-05-29T11:26:45.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:26:45.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-05-29T11:26:45.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:26:45.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:26:45.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:26:45.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-05-29T11:26:47.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-05-29T11:26:47.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:26:47.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:26:47.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:26:47.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:26:47.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:26:47.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:26:47.746 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:26:47.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:26:47.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:26:47.746 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:26:47.746 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:26:47.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:26:47.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:26:47.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:26:47.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:26:47.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:26:47.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-29T11:26:47.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:26:47.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-29T11:26:47.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:26:48.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:26:48.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:26:48.001 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:26:48.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:26:31
2026-05-29T11:26:48.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71714, datetime.datetime(2026, 5, 29, 11, 26, 31), datetime.datetime(2026, 5, 29, 11, 26, 30), 'salt', 12.02, 57.27, None, 15.91, 52.7, 8.18, 833.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:26:48.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:26:48.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:26:48.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:26:30, diff=18.066014s, valid=True
2026-05-29T11:26:48.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:26:48.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-29T11:26:48.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:26:12, diff=36.069858s, valid=True
2026-05-29T11:26:48.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:26:48.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:26:48.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:26:27, diff=21.076548s, valid=True
2026-05-29T11:26:48.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:26:48.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:26:48.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:26:48.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:26:48.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:26:48.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-29T11:26:48.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:26:12, diff=36.079676s, valid=True
2026-05-29T11:26:48.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:26:48.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:26:48.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:26:48.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979450.080327s, valid=True
2026-05-29T11:26:48.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:26:48.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:26:48.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:26:48.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:26:48.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:26:48.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:26:48.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:26:48.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:26:48.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:26:48.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:26:48.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:26:48.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:26:48.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:26:48.403 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:26:48.614 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:26:48.956 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:26:49.059 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:26:49.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:26:49.059 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:26:49.059 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:26:49.327 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:26:49.327 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:27:19.356 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:27:19.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:27:19.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:27:19.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:27:19.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:27:19.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:27:19.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-05-29T11:27:19.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:27:19.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-05-29T11:27:19.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:27:19.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:27:19.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:27:19.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-05-29T11:27:22.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-05-29T11:27:22.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:27:22.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:27:22.722 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:27:22.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:27:22.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:27:22.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:27:22.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:27:22.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:27:22.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:27:22.744 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:27:22.744 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:27:22.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:27:22.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:27:22.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:27:22.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:27:22.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:27:22.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:27:22.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:27:23.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:27:23.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:27:23.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:27:23.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:27:23.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:27:23.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:27:01
2026-05-29T11:27:23.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71715, datetime.datetime(2026, 5, 29, 11, 27, 1), datetime.datetime(2026, 5, 29, 11, 27), 'salt', 12.15, 57.74, None, 16.76, 44.09, 8.07, 833.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:27:23.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:27:23.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:27:23.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:27:00, diff=23.079448s, valid=True
2026-05-29T11:27:23.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:27:23.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:27:23.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:27:12, diff=11.082321s, valid=True
2026-05-29T11:27:23.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:27:23.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:27:23.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:26:58, diff=25.088959s, valid=True
2026-05-29T11:27:23.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:27:23.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:27:23.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:27:23.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:27:23.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:27:23.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:27:23.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:27:12, diff=11.092006s, valid=True
2026-05-29T11:27:23.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:27:23.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:27:23.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:27:23.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979485.092667s, valid=True
2026-05-29T11:27:23.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:27:23.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:27:23.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:27:23.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:27:23.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:27:23.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:27:23.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:27:23.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:27:23.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:27:23.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:27:23.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:27:23.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:27:23.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:27:23.481 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:27:23.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:27:24.037 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:27:24.139 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:27:24.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:27:24.139 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:27:24.139 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:27:24.314 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:27:24.315 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:27:54.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:27:54.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:27:54.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:27:54.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:27:54.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:27:54.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:27: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-05-29T11:27:54.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:27:54.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-05-29T11:27:54.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:27:54.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:27:54.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:27:54.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-05-29T11:27:57.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-05-29T11:27:57.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:27:57.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:27:57.664 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:27:57.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:27:57.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:27:57.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:27:57.685 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:27:57.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:27:57.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:27:57.685 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:27:57.685 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:27:57.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:27:57.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:27:57.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:27:57.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:27:57.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:27:57.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-29T11:27:57.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:27:57.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-29T11:27:57.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:27:57.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:27:57.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:27:57.979 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:27:58.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:27:31
2026-05-29T11:27:58.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71716, datetime.datetime(2026, 5, 29, 11, 27, 31), datetime.datetime(2026, 5, 29, 11, 27, 31), 'salt', 12.25, 56.54, None, 16.06, 51.44, 8.38, 833.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:27:58.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:27:58.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:27:58.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:27:31, diff=27.043418s, valid=True
2026-05-29T11:27:58.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:27:58.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-29T11:27:58.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:27:12, diff=46.046288s, valid=True
2026-05-29T11:27:58.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:27:58.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:27:58.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:27:28, diff=30.053124s, valid=True
2026-05-29T11:27:58.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:27:58.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:27:58.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:27:58.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:27:58.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:27:58.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-29T11:27:58.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:27:12, diff=46.056236s, valid=True
2026-05-29T11:27:58.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:27:58.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:27:58.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:27:58.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979520.05693s, valid=True
2026-05-29T11:27:58.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:27:58.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:27:58.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:27:58.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:27:58.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:27:58.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:27:58.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:27:58.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:27:58.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:27:58.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:27:58.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:27:58.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:27:58.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:27:58.390 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:27:58.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:27:58.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:27:59.054 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:27:59.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:27:59.054 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:27:59.054 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:27:59.313 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:27:59.313 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:28:29.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:28:29.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:28:29.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:28:29.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:28:29.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:28:29.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:28:29.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-05-29T11:28:29.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:28:29.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-05-29T11:28:29.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:28:29.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:28:29.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:28:29.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-05-29T11:28: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-05-29T11:28:32.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:28:32.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:28:32.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:28:32.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:28:32.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:28:32.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:28:32.725 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:28:32.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:28:32.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:28:32.726 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:28:32.726 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:28:32.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:28:32.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:28:32.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:28:32.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:28:32.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:28:32.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:28:32.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:28:32.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-29T11:28:32.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:28:32.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:28:32.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:28:32.990 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:28:33.049 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:28:31
2026-05-29T11:28:33.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71718, datetime.datetime(2026, 5, 29, 11, 28, 31), datetime.datetime(2026, 5, 29, 11, 28, 31), 'salt', 12.31, 56.15, None, 16.69, 27.06, 8.47, 833.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:28:33.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:28:33.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:28:33.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:31, diff=2.055361s, valid=True
2026-05-29T11:28:33.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:28:33.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:28:33.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:12, diff=21.058221s, valid=True
2026-05-29T11:28:33.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:28:33.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:28:33.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:29, diff=4.064904s, valid=True
2026-05-29T11:28:33.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:28:33.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:28:33.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:28:33.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:28:33.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:28:33.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-29T11:28:33.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:12, diff=21.067919s, valid=True
2026-05-29T11:28:33.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:28:33.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:28:33.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:28:33.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979555.068575s, valid=True
2026-05-29T11:28:33.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:28:33.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:28:33.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:28:33.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:28:33.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:28:33.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:28:33.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:28:33.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:28:33.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:28:33.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:28:33.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:28:33.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:28:33.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:28:33.462 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:28:33.674 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:28:34.019 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:28:34.122 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:28:34.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:28:34.122 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:28:34.122 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:28:34.275 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:28:34.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:29:04.286 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:29:04.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:29:04.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:29:04.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:29:04.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:29:04.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:29:04.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-05-29T11:29:04.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:29:04.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T11:29:04.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:29:04.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:29:04.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:29:04.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-05-29T11:29:07.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-05-29T11:29:07.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:29:07.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:29:07.921 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:29:07.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:29:07.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:29:07.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:29:07.943 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:29:07.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:29:07.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:29:07.943 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:29:07.943 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:29:07.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:29:08.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:29:08.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:29:08.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:29:08.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:29:08.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-29T11:29:08.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:29:08.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-29T11:29:08.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:29:08.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:29:08.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:29:08.197 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:29:08.264 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:29:02
2026-05-29T11:29:08.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71719, datetime.datetime(2026, 5, 29, 11, 29, 2), datetime.datetime(2026, 5, 29, 11, 29, 1), 'salt', 12.21, 56.18, None, 12.99, 46.32, 8.46, 833.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:29:08.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:29:08.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:29:08.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:29:01, diff=7.270167s, valid=True
2026-05-29T11:29:08.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:29:08.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-29T11:29:08.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:12, diff=56.273078s, valid=True
2026-05-29T11:29:08.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:29:08.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:29:08.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:59, diff=9.279744s, valid=True
2026-05-29T11:29:08.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:29:08.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:29:08.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:29:08.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:29:08.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:29:08.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-29T11:29:08.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:12, diff=56.282817s, valid=True
2026-05-29T11:29:08.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:29:08.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:29:08.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:29:08.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979590.283466s, valid=True
2026-05-29T11:29:08.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:29:08.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:29:08.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:29:08.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:29:08.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:29:08.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:29:08.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:29:08.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:29:08.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:29:08.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:29:08.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:29:08.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:29:08.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:29:08.616 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:29:08.834 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:29:09.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:29:09.282 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:29:09.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:29:09.282 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:29:09.282 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:29:09.495 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:29:09.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:29:39.504 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:29:39.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:29:39.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:29:39.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:29:39.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:29:40.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:29:40.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-05-29T11:29:40.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:29:40.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-05-29T11:29:40.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:29:40.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:29:40.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:29:40.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-05-29T11:29:43.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-05-29T11:29:43.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:29:43.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:29:43.326 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:29:43.326 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:29:43.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:29:43.345 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:29:43.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:29:43.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:29:43.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:29:43.347 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:29:43.347 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:29:43.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:29:43.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:29:43.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:29:43.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:29:43.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:29:43.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-29T11:29:43.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:29:43.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-29T11:29:43.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:29:43.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:29:43.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:29:43.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:29:43.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:29:32
2026-05-29T11:29:43.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71720, datetime.datetime(2026, 5, 29, 11, 29, 32), datetime.datetime(2026, 5, 29, 11, 29, 31), 'salt', 12.38, 54.95, None, 14.89, 47.47, 8.79, 833.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:29:43.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:29:43.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:29:43.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:29:31, diff=12.684106s, valid=True
2026-05-29T11:29:43.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:29:43.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-29T11:29:43.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:12, diff=91.686987s, valid=True
2026-05-29T11:29:43.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:29:43.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:29:43.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:29:31, diff=12.693683s, valid=True
2026-05-29T11:29:43.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:29:43.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:29:43.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:29:43.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:29:43.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:29:43.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-29T11:29:43.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:12, diff=91.6967s, valid=True
2026-05-29T11:29:43.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:29:43.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:29:43.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:29:43.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979625.697349s, valid=True
2026-05-29T11:29:43.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:29:43.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:29:43.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:29:43.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:29:43.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:29:43.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:29:43.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:29:43.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:29:43.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:29:43.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:29:43.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:29:43.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:29:44.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:29:44.081 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:29:44.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:29:44.704 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:29:44.803 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:29:44.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:29: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-05-29T11:29: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-05-29T11:29:45.044 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:29:45.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:30:15.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:30:15.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:30:15.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:30:15.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:30:15.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:30:15.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:30:15.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-05-29T11:30:15.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:30:15.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-05-29T11:30:15.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:30:15.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:30:15.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:30:15.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-05-29T11:30:18.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T11:30:18.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:30:18.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:30:18.151 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:30:18.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:30:18.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:30:18.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:30:18.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:30:18.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:30:18.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:30:18.172 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:30:18.172 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:30:18.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:30:18.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:30:18.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:30:18.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:30:18.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:30:18.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T11:30:18.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:30:18.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T11:30:18.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:30:18.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:30:18.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:30:18.439 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:30:18.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:30:02
2026-05-29T11:30:18.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71721, datetime.datetime(2026, 5, 29, 11, 30, 2), datetime.datetime(2026, 5, 29, 11, 30, 1), 'salt', 12.38, 55.35, None, 13.27, 46.58, 8.69, 833.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:30:18.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:30:18.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:30:18.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:30:01, diff=17.506751s, valid=True
2026-05-29T11:30:18.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:30:18.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T11:30:18.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:12, diff=126.509624s, valid=True
2026-05-29T11:30:18.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:30:18.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:30:18.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:30:00, diff=18.51629s, valid=True
2026-05-29T11:30:18.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:30:18.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:30:18.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:30:18.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:30:18.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:30:18.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T11:30:18.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:12, diff=126.519343s, valid=True
2026-05-29T11:30:18.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:30:18.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:30:18.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:30:18.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979660.520018s, valid=True
2026-05-29T11:30:18.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:30:18.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:30:18.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:30:18.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:30:18.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:30:18.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:30:18.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:30:18.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:30:18.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:30:18.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:30:18.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:30:18.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:30:18.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:30:18.849 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:30:19.067 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:30:19.429 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:30:19.599 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:30:19.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:30:19.599 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:30:19.599 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:30:19.816 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:30:19.816 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:30:49.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:30:49.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:30:49.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:30:50.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:30:50.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:30:50.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:30:50.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-05-29T11:30:50.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:30:50.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-05-29T11:30:50.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:30:50.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:30:50.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:30:50.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T11:30:53.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-05-29T11:30:53.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:30:53.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:30:53.692 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:30:53.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:30:53.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:30:53.717 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:30:53.717 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:30:53.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:30:53.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:30:53.718 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:30:53.718 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:30:53.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:30:53.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:30:53.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:30:53.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:30:53.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:30:53.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:30:53.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:30:53.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:30:53.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:30:53.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:30:53.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:30:53.969 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:30:54.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:30:33
2026-05-29T11:30:54.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71722, datetime.datetime(2026, 5, 29, 11, 30, 33), datetime.datetime(2026, 5, 29, 11, 30, 31), 'salt', 12.61, 55.32, None, 17.08, 56.41, 8.71, 833.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:30:54.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:30:54.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:30:54.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:30:31, diff=23.03316s, valid=True
2026-05-29T11:30:54.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:30:54.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:30:54.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:12, diff=162.036043s, valid=True
2026-05-29T11:30:54.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:30:54.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:30:54.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:30:30, diff=24.042762s, valid=True
2026-05-29T11:30:54.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:30:54.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:30:54.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:30:54.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:30:54.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:30:54.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:30:54.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:12, diff=162.045865s, valid=True
2026-05-29T11:30:54.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:30:54.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:30:54.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:30:54.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979696.046531s, valid=True
2026-05-29T11:30:54.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:30:54.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:30:54.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:30:54.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:30:54.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:30:54.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:30:54.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:30:54.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:30:54.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:30:54.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:30:54.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:30:54.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:30:54.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:30:54.364 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:30:54.575 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:30:54.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:30:55.019 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:30:55.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:30:55.019 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:30:55.020 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:30:55.235 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:30:55.235 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:31:25.259 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:31:25.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:31:25.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:31:25.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:31:25.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:31:25.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:31:25.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-05-29T11:31:25.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:31:25.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-05-29T11:31:25.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:31:25.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:31:25.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:31:25.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-05-29T11:31:28.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-05-29T11:31:28.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:31:28.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:31:28.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:31:28.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:31:28.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:31:28.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:31:28.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:31:28.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:31:28.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:31:28.324 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:31:28.324 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:31:28.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:31:28.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:31:28.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:31:28.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:31:28.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:31:28.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:31:28.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:31:28.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:31:28.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:31:28.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:31:28.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:31:28.586 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:31:28.644 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:31:03
2026-05-29T11:31:28.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71723, datetime.datetime(2026, 5, 29, 11, 31, 3), datetime.datetime(2026, 5, 29, 11, 31, 3), 'salt', 12.55, 55.32, None, 20.82, 50.9, 8.71, 833.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:31:28.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:31:28.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:31:28.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:31:03, diff=25.650309s, valid=True
2026-05-29T11:31:28.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:31:28.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:31:28.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:12, diff=196.653179s, valid=True
2026-05-29T11:31:28.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:31:28.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:31:28.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:31:00, diff=28.659909s, valid=True
2026-05-29T11:31:28.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:31:28.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:31:28.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:31:28.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:31:28.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:31:28.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:31:28.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:12, diff=196.662959s, valid=True
2026-05-29T11:31:28.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:31:28.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:31:28.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:31:28.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979730.663614s, valid=True
2026-05-29T11:31:28.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:31:28.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:31:28.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:31:28.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:31:28.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:31:28.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:31:28.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:31:28.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:31:28.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:31:28.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:31:28.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:31:28.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:31:28.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:31:28.989 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:31:29.283 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:31:29.647 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:31:29.747 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:31:29.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:31:29.747 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:31:29.747 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:31:30.016 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:31:30.016 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:32:00.045 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:32:00.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:32:00.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:32:00.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:32:00.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:32:00.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:32:00.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-05-29T11:32:00.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:32:00.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-05-29T11:32:00.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:32:00.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:32:00.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:32:00.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-05-29T11:32:02.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-05-29T11:32:02.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:32:02.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:32:02.992 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:32:02.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:32:03.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:32:03.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:32:03.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:32:03.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:32:03.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:32:03.012 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:32:03.013 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:32:03.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:32:03.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:32:03.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:32:03.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:32:03.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:32:03.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:32:03.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:32:03.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:32:03.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:32:03.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:32:03.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:32:03.262 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:32:03.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:31:33
2026-05-29T11:32:03.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71724, datetime.datetime(2026, 5, 29, 11, 31, 33), datetime.datetime(2026, 5, 29, 11, 31, 33), 'salt', 12.18, 55.12, None, 15.24, 58.31, 8.73, 833.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:32:03.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:32:03.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:32:03.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:31:33, diff=30.331162s, valid=True
2026-05-29T11:32:03.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:32:03.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:32:03.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:12, diff=231.334049s, valid=True
2026-05-29T11:32:03.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:32:03.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:32:03.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:31:31, diff=32.340794s, valid=True
2026-05-29T11:32:03.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:32:03.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:32:03.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:32:03.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:32:03.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:32:03.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:32:03.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:28:12, diff=231.343895s, valid=True
2026-05-29T11:32:03.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:32:03.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:32:03.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:32:03.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979765.34455s, valid=True
2026-05-29T11:32:03.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:32:03.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:32:03.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:32:03.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:32:03.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:32:03.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:32:03.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:32:03.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:32:03.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:32:03.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:32:03.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:32:03.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:32:03.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:32:03.666 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:32:03.878 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:32:04.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:32:04.325 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:32:04.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:32:04.325 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:32:04.325 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:32:04.584 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:32:04.584 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:32:34.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:32:34.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:32:34.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:32:35.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:32:35.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:32:35.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:32:35.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T11:32:35.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:32: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-05-29T11:32:35.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:32:35.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:32:35.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:32:35.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-05-29T11:32:38.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-05-29T11:32:38.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:32:38.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:32:38.028 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:32:38.028 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:32:38.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:32:38.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:32:38.047 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:32:38.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:32:38.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:32:38.047 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:32:38.047 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:32:38.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:32:38.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:32:38.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:32:38.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:32:38.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:32:38.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:32:38.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:32:38.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:32:38.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:32:38.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:32:38.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:32:38.304 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:32:38.364 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:32:34
2026-05-29T11:32:38.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71726, datetime.datetime(2026, 5, 29, 11, 32, 34), datetime.datetime(2026, 5, 29, 11, 32, 33), 'salt', 12.05, 58.73, None, 17.08, 63.94, 7.82, 833.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:32:38.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:32:38.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:32:38.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:32:33, diff=5.370918s, valid=True
2026-05-29T11:32:38.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:32:38.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:32:38.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:33:12, diff=-33.626263s, valid=True
2026-05-29T11:32:38.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:32:38.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:32:38.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:32:31, diff=7.380347s, valid=True
2026-05-29T11:32:38.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:32:38.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:32:38.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:32:38.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:32:38.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:32:38.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:32:38.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:33:12, diff=-33.616633s, valid=True
2026-05-29T11:32:38.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:32:38.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:32:38.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:32:38.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979800.384044s, valid=True
2026-05-29T11:32:38.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:32:38.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:32:38.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:32:38.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:32:38.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:32:38.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:32:38.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:32:38.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:32:38.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:32:38.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:32:38.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:32:38.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:32:38.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:32:38.770 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:32:38.977 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:32:39.316 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:32:39.415 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:32:39.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:32:39.415 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:32:39.416 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:32:39.681 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:32:39.681 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:33:09.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:33:09.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:33:09.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:33:10.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:33:10.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:33:10.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:33:10.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-05-29T11:33:10.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:33:10.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-05-29T11:33:10.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:33:10.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:33:10.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:33:10.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-05-29T11:33:13.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-05-29T11:33:13.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:33:13.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:33:13.021 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:33:13.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:33:13.031 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:33:13.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:33:13.043 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:33:13.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:33:13.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:33:13.043 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:33:13.043 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:33:13.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:33:13.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:33:13.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:33:13.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:33:13.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:33:13.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:33:13.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:33:13.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:33:13.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:33:13.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:33:13.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:33:13.305 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:33:13.364 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:33:04
2026-05-29T11:33:13.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71727, datetime.datetime(2026, 5, 29, 11, 33, 4), datetime.datetime(2026, 5, 29, 11, 33, 4), 'salt', 11.95, 57.6, None, 20.01, 50.75, 8.09, 833.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:33:13.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:33:13.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:33:13.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:33:04, diff=9.370939s, valid=True
2026-05-29T11:33:13.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:33:13.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:33:13.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:33:12, diff=1.373784s, valid=True
2026-05-29T11:33:13.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:33:13.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:33:13.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:33:01, diff=12.380372s, valid=True
2026-05-29T11:33:13.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:33:13.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:33:13.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:33:13.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:33:13.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:33:13.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:33:13.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:33:12, diff=1.383413s, valid=True
2026-05-29T11:33:13.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:33:13.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:33:13.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:33:13.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979835.384077s, valid=True
2026-05-29T11:33:13.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:33:13.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:33:13.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:33:13.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:33:13.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:33:13.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:33:13.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:33:13.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:33:13.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:33:13.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:33:13.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:33:13.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:33:13.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:33:13.701 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:33:13.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:33:14.251 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:33:14.351 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:33:14.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:33:14.351 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:33:14.351 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:33:14.572 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:33:14.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:33:44.577 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:33:44.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:33:44.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:33:44.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:33:44.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:33:44.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:33:44.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-05-29T11:33:44.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:33:44.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-05-29T11:33:44.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:33:44.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:33:44.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:33:44.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-05-29T11:33: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-05-29T11:33:47.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:33:47.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:33:47.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:33:47.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:33:47.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:33:47.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:33:47.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:33:47.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:33:47.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:33:47.774 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:33:47.774 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:33:47.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:33:47.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:33:47.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:33:47.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:33:47.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:33:47.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:33:47.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:33:48.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:33:48.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:33:48.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:33:48.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:33:48.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:33:48.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:33:34
2026-05-29T11:33:48.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71728, datetime.datetime(2026, 5, 29, 11, 33, 34), datetime.datetime(2026, 5, 29, 11, 33, 34), 'salt', 11.88, 56.18, None, 20.64, 60.0, 8.44, 833.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:33:48.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:33:48.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:33:48.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:33:34, diff=14.10622s, valid=True
2026-05-29T11:33:48.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:33:48.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:33:48.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:34:12, diff=-23.890862s, valid=True
2026-05-29T11:33:48.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:33:48.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:33:48.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:33:32, diff=16.1159s, valid=True
2026-05-29T11:33:48.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:33:48.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:33:48.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:33:48.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:33:48.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:33:48.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:33:48.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:34:12, diff=-23.881042s, valid=True
2026-05-29T11:33:48.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:33:48.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:33:48.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:33:48.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979870.119633s, valid=True
2026-05-29T11:33:48.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:33:48.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:33:48.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:33:48.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:33:48.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:33:48.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:33:48.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:33:48.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:33:48.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:33:48.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:33:48.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:33:48.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:33:48.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:33:48.526 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:33:48.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:33:49.099 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:33:49.209 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:33:49.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:33: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-05-29T11:33: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-05-29T11:33:49.363 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:33:49.363 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:34:19.386 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:34:19.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:34:19.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:34:19.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:34:19.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:34:19.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:34:19.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-05-29T11:34:19.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:34:19.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-05-29T11:34:19.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:34:19.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:34:19.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:34:19.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-05-29T11:34:22.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-05-29T11:34:22.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:34:22.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:34:22.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:34:22.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:34:22.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:34:22.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:34:22.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:34:22.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:34:22.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:34:22.658 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:34:22.658 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:34:22.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:34:22.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:34:22.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:34:22.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:34:22.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:34:22.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:34:22.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:34:22.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:34:22.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:34:22.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:34:22.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:34:22.920 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:34:22.978 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:34:04
2026-05-29T11:34:22.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71729, datetime.datetime(2026, 5, 29, 11, 34, 4), datetime.datetime(2026, 5, 29, 11, 34, 4), 'salt', 11.82, 55.91, None, 19.87, 52.73, 8.51, 833.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:34:22.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:34:22.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:34:22.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:34:04, diff=18.984556s, valid=True
2026-05-29T11:34:22.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:34:22.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:34:22.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:34:12, diff=10.987442s, valid=True
2026-05-29T11:34:22.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:34:22.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:34:22.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:34:03, diff=19.994041s, valid=True
2026-05-29T11:34:22.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:34:22.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:34:22.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:34:22.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:34:22.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:34:22.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:34:22.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:34:12, diff=10.997076s, valid=True
2026-05-29T11:34:22.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:34:22.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:34:22.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:34:22.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979904.997736s, valid=True
2026-05-29T11:34:22.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:34:22.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:34:22.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:34:22.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:34:22.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:34:23.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:34:23.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:34:23.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:34:23.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:34:23.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:34:23.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:34:23.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:34:23.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:34:23.315 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:34:23.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:34:23.870 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:34:23.970 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:34:23.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:34:23.971 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:34:23.971 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:34:24.224 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:34:24.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:34:54.234 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:34:54.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11: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-05-29T11:34:54.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:34:54.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:34:54.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:34:54.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-05-29T11:34:54.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:34:54.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-05-29T11:34:54.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:34:54.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:34:54.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:34:54.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-05-29T11:34:57.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-05-29T11:34:57.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:34:57.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:34:57.394 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:34:57.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:34:57.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:34:57.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:34:57.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:34:57.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:34:57.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:34:57.416 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:34:57.416 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:34:57.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:34:57.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:34:57.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:34:57.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:34:57.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:34:57.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:34:57.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:34:57.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:34:57.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:34:57.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:34:57.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:34:57.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:34:57.732 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:34:35
2026-05-29T11:34:57.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71730, datetime.datetime(2026, 5, 29, 11, 34, 35), datetime.datetime(2026, 5, 29, 11, 34, 34), 'salt', 12.05, 56.74, None, 22.05, 44.44, 8.31, 833.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:34:57.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:34:57.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:34:57.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:34:34, diff=23.73884s, valid=True
2026-05-29T11:34:57.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:34:57.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:34:57.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:35:12, diff=-14.258275s, valid=True
2026-05-29T11:34:57.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:34:57.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:34:57.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:34:34, diff=23.74856s, valid=True
2026-05-29T11:34:57.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:34:57.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:34:57.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:34:57.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:34:57.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:34:57.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:34:57.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:35:12, diff=-14.248308s, valid=True
2026-05-29T11:34:57.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:34:57.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:34:57.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:34:57.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979939.752352s, valid=True
2026-05-29T11:34:57.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:34:57.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:34:57.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:34:57.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:34:57.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:34:57.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:34:57.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:34:57.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:34:57.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:34:57.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:34:58.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:34:58.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:34:58.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:34:58.138 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:34:58.347 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:34:58.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:34:58.788 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:34:58.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:34:58.789 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:34:58.789 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:34:59.042 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:34:59.042 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:35:29.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:35:29.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:35:29.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:35:29.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:35:29.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:35:29.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:35:29.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-05-29T11:35:29.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:35:29.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-05-29T11:35:29.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:35:29.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:35:29.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:35:29.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-05-29T11:35:32.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-05-29T11:35:32.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:35:32.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:35:32.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:35:32.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:35:32.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:35:32.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:35:32.489 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:35:32.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:35:32.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:35:32.490 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:35:32.490 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:35:32.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:35:32.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:35:32.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:35:32.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:35:32.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:35:32.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:35:32.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:35:32.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:35:32.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:35:32.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:35:32.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:35:32.757 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:35:32.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:35:05
2026-05-29T11:35:32.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71731, datetime.datetime(2026, 5, 29, 11, 35, 5), datetime.datetime(2026, 5, 29, 11, 35, 4), 'salt', 12.08, 54.98, None, 20.89, 40.2, 8.76, 833.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:35:32.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:35:32.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:35:32.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:35:04, diff=28.823611s, valid=True
2026-05-29T11:35:32.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:35:32.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:35:32.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:35:12, diff=20.826443s, valid=True
2026-05-29T11:35:32.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:35:32.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:35:32.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:35:03, diff=29.833113s, valid=True
2026-05-29T11:35:32.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:35:32.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:35:32.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:35:32.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:35:32.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:35:32.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:35:32.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:35:12, diff=20.836103s, valid=True
2026-05-29T11:35:32.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:35:32.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:35:32.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:35:32.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=979974.836768s, valid=True
2026-05-29T11:35:32.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:35:32.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:35:32.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:35:32.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:35:32.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:35:32.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:35:32.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:35:32.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:35:32.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:35:32.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:35:33.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:35:33.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:35:33.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:35:33.176 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:35:33.412 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:35:33.764 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:35:33.875 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:35:33.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:35:33.875 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:35:33.875 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:35:34.142 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:35:34.143 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:36:04.144 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:36:04.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:36:04.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:36:04.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:36:04.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:36:04.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:36:04.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-05-29T11:36:04.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:36:04.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-05-29T11:36:04.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:36:04.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:36:04.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:36:04.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-05-29T11:36: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-05-29T11:36:07.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:36:07.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:36:07.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:36:07.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:36:07.444 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:36:07.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:36:07.462 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:36:07.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:36:07.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:36:07.462 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:36:07.462 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:36:07.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:36:07.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:36:07.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:36:07.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:36:07.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:36:07.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:36:07.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:36:07.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:36:07.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:36:07.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:36:07.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:36:07.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:36:07.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:36:06
2026-05-29T11:36:07.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71733, datetime.datetime(2026, 5, 29, 11, 36, 6), datetime.datetime(2026, 5, 29, 11, 36, 5), 'salt', 12.31, 53.89, None, 14.08, 45.78, 9.06, 833.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:36:07.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:36:07.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:36:07.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:36:05, diff=2.776164s, valid=True
2026-05-29T11:36:07.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:36:07.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:36:07.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:36:12, diff=-4.220895s, valid=True
2026-05-29T11:36:07.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:36:07.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:36:07.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:36:03, diff=4.786281s, valid=True
2026-05-29T11:36:07.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:36:07.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:36:07.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:36:07.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:36:07.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:36:07.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:36:07.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:36:12, diff=-4.210443s, valid=True
2026-05-29T11:36:07.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:36:07.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:36:07.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:36:07.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980009.790227s, valid=True
2026-05-29T11:36:07.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:36:07.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:36:07.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:36:07.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:36:07.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:36:07.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:36:07.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:36:07.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:36:07.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:36:07.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:36:07.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:36:08.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:36:08.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:36:08.110 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:36:08.322 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:36:08.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:36:08.767 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:36:08.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:36:08.767 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:36:08.767 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:36:09.023 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:36:09.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:36:39.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:36:39.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:36:39.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:36:39.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:36:39.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:36:39.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:36:39.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-05-29T11:36:39.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:36:39.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-05-29T11:36:39.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:36:39.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:36:39.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:36:39.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-05-29T11:36:42.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-05-29T11:36:42.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:36:42.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:36:42.371 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:36:42.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:36:42.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:36:42.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:36:42.393 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:36:42.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:36:42.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:36:42.393 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:36:42.393 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:36:42.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:36:42.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:36:42.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:36:42.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:36:42.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:36:42.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:36:42.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:36:42.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:36:42.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:36:42.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:36:42.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:36:42.660 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:36:42.719 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:36:36
2026-05-29T11:36:42.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71734, datetime.datetime(2026, 5, 29, 11, 36, 36), datetime.datetime(2026, 5, 29, 11, 36, 35), 'salt', 12.38, 54.15, None, 19.51, 49.79, 9.0, 833.64, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:36:42.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:36:42.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:36:42.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:36:35, diff=7.725616s, valid=True
2026-05-29T11:36:42.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:36:42.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:36:42.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:37:12, diff=-29.271365s, valid=True
2026-05-29T11:36:42.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:36:42.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:36:42.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:36:33, diff=9.735383s, valid=True
2026-05-29T11:36:42.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:36:42.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:36:42.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:36:42.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:36:42.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:36:42.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:36:42.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:37:12, diff=-29.261426s, valid=True
2026-05-29T11:36:42.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:36:42.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:36:42.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:36:42.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980044.739489s, valid=True
2026-05-29T11:36:42.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:36:42.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:36:42.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:36:42.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:36:42.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:36:42.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:36:42.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:36:42.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:36:42.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:36:42.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:36:42.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:36:42.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:36:43.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:36:43.064 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:36:43.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:36:43.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:36:43.781 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:36:43.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:36:43.781 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:36:43.781 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:36:44.046 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:36:44.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:37:14.076 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:37:14.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:37:14.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:37:14.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:37:14.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:37:14.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:37:14.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-05-29T11:37:14.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:37:14.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-05-29T11:37:14.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:37:14.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:37:14.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:37:14.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-05-29T11:37:17.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-05-29T11:37:17.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:37:17.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:37:17.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:37:17.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:37:17.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:37:17.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:37:17.148 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:37:17.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:37:17.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:37:17.148 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:37:17.149 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:37:17.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:37:17.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:37:17.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:37:17.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:37:17.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:37:17.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:37:17.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:37:17.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:37:17.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:37:17.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:37:17.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:37:17.411 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:37:17.471 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:37:06
2026-05-29T11:37:17.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71735, datetime.datetime(2026, 5, 29, 11, 37, 6), datetime.datetime(2026, 5, 29, 11, 37, 6), 'salt', 12.25, 54.02, None, 20.54, 48.62, 9.02, 833.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:37:17.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:37:17.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:37:17.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:37:06, diff=11.47742s, valid=True
2026-05-29T11:37:17.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:37:17.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:37:17.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:37:12, diff=5.480255s, valid=True
2026-05-29T11:37:17.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:37:17.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:37:17.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:37:04, diff=13.486902s, valid=True
2026-05-29T11:37:17.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:37:17.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:37:17.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:37:17.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:37:17.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:37:17.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:37:17.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:37:12, diff=5.489926s, valid=True
2026-05-29T11:37:17.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:37:17.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:37:17.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:37:17.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980079.49058s, valid=True
2026-05-29T11:37:17.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:37:17.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:37:17.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:37:17.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:37:17.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:37:17.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:37:17.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:37:17.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:37:17.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:37:17.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:37:17.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:37:17.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:37:17.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:37:17.812 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:37:18.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:37:18.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:37:18.449 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:37:18.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:37:18.450 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:37:18.450 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:37:18.672 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:37:18.672 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:37:48.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:37:48.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:37:48.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:37:49.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:37:49.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:37:49.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:37:49.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-05-29T11:37:49.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:37:49.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-05-29T11:37:49.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:37:49.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:37:49.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:37:49.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-05-29T11:37:51.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-05-29T11:37:51.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:37:51.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:37:51.923 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:37:51.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:37:51.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:37:51.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:37:51.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:37:51.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:37:51.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:37:51.946 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:37:51.946 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:37:51.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:37:52.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:37:52.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:37:52.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:37:52.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:37:52.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:37:52.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:37:52.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:37:52.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:37:52.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:37:52.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:37:52.204 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:37:52.266 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:37:36
2026-05-29T11:37:52.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71736, datetime.datetime(2026, 5, 29, 11, 37, 36), datetime.datetime(2026, 5, 29, 11, 37, 36), 'salt', 12.11, 54.49, None, 17.29, 40.31, 8.89, 833.64, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:37:52.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:37:52.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:37:52.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:37:36, diff=16.273028s, valid=True
2026-05-29T11:37:52.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:37:52.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:37:52.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:38:12, diff=-19.724121s, valid=True
2026-05-29T11:37:52.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:37:52.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:37:52.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:37:34, diff=18.28238s, valid=True
2026-05-29T11:37:52.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:37:52.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:37:52.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:37:52.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:37:52.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:37:52.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:37:52.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:38:12, diff=-19.714597s, valid=True
2026-05-29T11:37:52.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:37:52.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:37:52.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:37:52.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980114.286069s, valid=True
2026-05-29T11:37:52.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:37:52.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:37:52.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:37:52.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:37:52.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:37:52.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:37:52.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:37:52.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:37:52.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:37:52.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:37:52.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:37:52.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:37:52.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:37:52.601 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:37:52.799 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:37:53.206 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:37:53.305 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:37:53.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:37:53.306 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:37:53.306 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:37:53.565 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:37:53.565 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:38:23.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:38:23.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:38:23.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:38:23.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:38:23.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:38:24.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:38:24.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-05-29T11:38:24.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:38:24.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T11:38:24.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:38:24.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:38:24.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:38:24.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-05-29T11:38:26.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-05-29T11:38:26.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:38:26.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:38:26.865 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:38:26.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:38:26.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:38:26.884 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:38:26.884 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:38:26.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:38:26.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:38:26.885 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:38:26.885 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:38:26.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:38:26.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:38:26.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:38:27.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:38:27.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:38:27.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:38:27.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:38:27.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:38:27.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:38:27.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:38:27.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:38:27.153 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:38:27.214 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:38:06
2026-05-29T11:38:27.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71737, datetime.datetime(2026, 5, 29, 11, 38, 6), datetime.datetime(2026, 5, 29, 11, 38, 6), 'salt', 12.25, 56.31, None, 17.04, 44.56, 8.44, 833.64, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:38:27.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:38:27.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:38:27.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:38:06, diff=21.220241s, valid=True
2026-05-29T11:38:27.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:38:27.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:38:27.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:38:12, diff=15.223118s, valid=True
2026-05-29T11:38:27.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:38:27.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:38:27.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:38:04, diff=23.229782s, valid=True
2026-05-29T11:38:27.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:38:27.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:38:27.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:38:27.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:38:27.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:38:27.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:38:27.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:38:12, diff=15.232875s, valid=True
2026-05-29T11:38:27.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:38:27.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:38:27.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:38:27.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980149.233527s, valid=True
2026-05-29T11:38:27.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:38:27.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:38:27.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:38:27.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:38:27.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:38:27.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:38:27.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:38:27.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:38:27.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:38:27.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:38:27.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:38:27.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:38:27.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:38:27.554 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:38:27.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:38:28.115 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:38:28.212 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:38:28.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:38:28.213 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:38:28.213 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:38:28.468 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:38:28.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:38:58.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:38:58.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:38:58.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:38:59.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:38:59.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:38:59.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:38:59.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-05-29T11:38:59.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:38:59.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-05-29T11:38:59.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:38:59.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:38:59.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:38:59.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-05-29T11:39:02.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-05-29T11:39:02.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:39:02.077 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:39:02.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:39:02.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:39:02.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:39:02.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:39:02.098 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:39:02.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:39:02.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:39:02.098 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:39:02.099 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:39:02.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:39:02.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:39:02.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:39:02.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:39:02.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:39:02.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:39:02.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:39:02.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:39:02.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:39:02.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:39:02.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:39:02.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:39:02.430 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:38:37
2026-05-29T11:39:02.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71738, datetime.datetime(2026, 5, 29, 11, 38, 37), datetime.datetime(2026, 5, 29, 11, 38, 36), 'salt', 12.15, 54.19, None, 16.13, 45.92, 8.97, 833.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:39:02.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:39:02.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:39:02.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:38:36, diff=26.437072s, valid=True
2026-05-29T11:39:02.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:39:02.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:39:02.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:39:12, diff=-9.560018s, valid=True
2026-05-29T11:39:02.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:39:02.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:39:02.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:38:35, diff=27.446647s, valid=True
2026-05-29T11:39:02.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:39:02.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:39:02.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:39:02.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:39:02.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:39:02.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:39:02.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:39:12, diff=-9.550317s, valid=True
2026-05-29T11:39:02.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:39:02.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:39:02.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:39:02.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980184.450331s, valid=True
2026-05-29T11:39:02.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:39:02.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:39:02.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:39:02.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:39:02.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:39:02.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:39:02.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:39:02.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:39:02.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:39:02.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:39:02.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:39:02.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:39:02.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:39:02.774 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:39:03.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:39:03.459 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:39:03.575 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:39:03.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:39:03.576 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:39:03.576 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:39:03.815 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:39:03.816 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:39:33.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:39:33.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:39:33.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:39:34.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:39:34.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:39:34.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:39:34.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-05-29T11:39:34.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:39:34.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-05-29T11:39:34.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:39:34.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:39:34.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:39:34.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-05-29T11:39:37.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-05-29T11:39:37.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:39:37.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:39:37.801 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:39:37.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:39:37.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:39:37.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:39:37.821 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:39:37.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:39:37.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:39:37.821 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:39:37.821 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:39:37.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:39:37.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:39:37.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:39:37.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:39:37.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:39:38.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:39:38.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:39:38.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:39:38.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:39:38.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:39:38.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:39:38.083 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:39:38.143 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:39:37
2026-05-29T11:39:38.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71740, datetime.datetime(2026, 5, 29, 11, 39, 37), datetime.datetime(2026, 5, 29, 11, 39, 37), 'salt', 12.68, 57.11, None, 14.47, 60.49, 8.26, 833.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:39:38.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:39:38.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:39:38.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:39:37, diff=1.150046s, valid=True
2026-05-29T11:39:38.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:39:38.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:39:38.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:40:12, diff=-33.84712s, valid=True
2026-05-29T11:39:38.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:39:38.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:39:38.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:39:35, diff=3.159635s, valid=True
2026-05-29T11:39:38.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:39:38.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:39:38.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:39:38.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:39:38.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:39:38.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:39:38.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:40:12, diff=-33.837363s, valid=True
2026-05-29T11:39:38.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:39:38.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:39:38.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:39:38.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980220.16328s, valid=True
2026-05-29T11:39:38.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:39:38.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:39:38.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:39:38.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:39:38.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:39:38.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:39:38.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:39:38.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:39:38.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:39:38.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:39:38.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:39:38.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:39:38.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:39:38.480 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:39:38.680 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:39:39.010 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:39:39.110 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:39:39.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:39:39.110 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:39:39.110 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:39:39.394 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:39:39.394 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:40:09.418 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:40:09.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:40:09.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:40:09.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:40:09.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:40:09.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:40:09.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-05-29T11:40:09.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:40:09.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T11:40:09.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:40:09.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:40:10.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:40:10.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-05-29T11:40:12.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-05-29T11:40:12.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:40:12.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:40:12.815 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:40:12.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:40:12.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:40:12.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:40:12.836 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:40:12.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:40:12.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:40:12.836 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:40:12.836 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:40:12.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:40:12.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:40:12.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:40:13.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:40:13.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:40:13.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:40:13.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:40:13.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:40:13.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:40:13.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:40:13.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:40:13.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:40:13.258 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:40:08
2026-05-29T11:40:13.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71741, datetime.datetime(2026, 5, 29, 11, 40, 8), datetime.datetime(2026, 5, 29, 11, 40, 7), 'salt', 12.41, 56.54, None, 20.4, 55.89, 8.38, 833.58, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:40:13.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:40:13.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:40:13.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:40:07, diff=6.265154s, valid=True
2026-05-29T11:40:13.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:40:13.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:40:13.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:40:12, diff=1.268041s, valid=True
2026-05-29T11:40:13.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:40:13.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:40:13.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:40:05, diff=8.274745s, valid=True
2026-05-29T11:40:13.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:40:13.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:40:13.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:40:13.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:40:13.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:40:13.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:40:13.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:40:12, diff=1.277792s, valid=True
2026-05-29T11:40:13.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:40:13.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:40:13.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:40:13.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980255.278439s, valid=True
2026-05-29T11:40:13.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:40:13.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:40:13.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:40:13.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:40:13.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:40:13.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:40:13.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:40:13.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:40:13.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:40:13.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:40:13.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:40:13.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:40:13.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:40:13.692 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:40:13.923 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:40:14.297 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:40:14.407 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:40:14.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:40:14.408 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:40:14.408 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:40:14.661 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:40:14.661 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:40:44.685 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:40:44.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:40:44.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:40:45.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:40:45.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:40:45.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:40: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-05-29T11:40:45.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:40:45.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-05-29T11:40:45.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:40:45.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:40:45.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:40:45.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T11:40:48.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-05-29T11:40:48.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:40:48.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:40:48.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:40:48.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:40:48.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:40:48.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:40:48.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:40:48.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:40:48.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:40:48.069 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:40:48.069 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:40:48.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:40:48.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:40:48.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:40:48.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:40:48.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:40:48.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:40:48.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:40:48.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:40:48.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:40:48.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:40:48.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:40:48.331 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:40:48.389 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:40:39
2026-05-29T11:40:48.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71742, datetime.datetime(2026, 5, 29, 11, 40, 39), datetime.datetime(2026, 5, 29, 11, 40, 38), 'salt', 12.18, 56.77, None, 17.96, 50.21, 8.31, 833.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:40:48.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:40:48.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:40:48.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:40:38, diff=10.399219s, valid=True
2026-05-29T11:40:48.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:40:48.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:40:48.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:41:12, diff=-23.596724s, valid=True
2026-05-29T11:40:48.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:40:48.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:40:48.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:40:35, diff=13.413206s, valid=True
2026-05-29T11:40:48.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:40:48.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:40:48.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:40:48.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:40:48.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:40:48.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:40:48.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:41:12, diff=-23.582115s, valid=True
2026-05-29T11:40:48.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:40:48.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:40:48.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:40:48.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980290.418755s, valid=True
2026-05-29T11:40:48.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:40:48.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:40:48.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:40:48.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:40:48.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:40:48.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:40:48.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:40:48.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:40:48.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:40:48.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:40:48.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:40:48.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:40:48.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:40:48.747 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:40:48.955 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:40:49.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:40:49.401 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:40:49.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:40:49.401 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:40:49.401 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:40:49.656 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:40:49.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:41:19.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:41:19.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:41:19.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:41:19.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:41:19.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:41:20.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:41:20.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T11:41:20.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:41:20.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T11:41:20.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:41:20.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:41:20.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:41:20.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-05-29T11:41:22.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T11:41:22.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:41:22.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:41:22.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:41:22.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:41:22.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:41:22.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:41:22.623 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:41:22.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:41:22.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:41:22.623 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:41:22.623 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:41:22.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:41:22.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:41:22.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:41:22.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:41:22.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:41:22.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:41:22.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:41:22.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:41:22.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:41:22.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:41:22.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:41:22.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:41:22.942 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:41:09
2026-05-29T11:41:22.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71743, datetime.datetime(2026, 5, 29, 11, 41, 9), datetime.datetime(2026, 5, 29, 11, 41, 8), 'salt', 12.18, 57.87, None, 15.95, 42.49, 8.04, 833.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:41:22.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:41:22.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:41:22.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:41:08, diff=14.948857s, valid=True
2026-05-29T11:41:22.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:41:22.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:41:22.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:41:12, diff=10.951678s, valid=True
2026-05-29T11:41:22.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:41:22.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:41:22.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:41:06, diff=16.958267s, valid=True
2026-05-29T11:41:22.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:41:22.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:41:22.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:41:22.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:41:22.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:41:22.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:41:22.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:41:12, diff=10.961375s, valid=True
2026-05-29T11:41:22.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:41:22.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:41:22.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:41:22.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980324.962055s, valid=True
2026-05-29T11:41:22.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:41:22.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:41:22.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:41:22.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:41:22.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:41:23.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:41:23.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:41:23.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:41:23.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:41:23.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:41:23.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:41:23.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:41:23.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:41:23.367 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:41:23.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:41:23.916 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:41:24.021 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:41:24.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:41:24.021 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:41:24.021 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:41:24.162 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:41:24.163 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:41:54.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:41:54.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:41:54.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:41:54.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:41:54.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:41:54.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:41:54.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-05-29T11:41:54.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:41:54.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-05-29T11:41:54.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:41:54.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:41:54.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:41:54.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-05-29T11:41:57.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-05-29T11:41:57.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:41:57.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:41:57.509 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:41:57.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:41:57.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:41:57.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:41:57.529 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:41:57.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:41:57.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:41:57.529 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:41:57.529 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:41:57.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:41:57.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:41:57.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:41:57.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:41:57.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:41:57.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:41:57.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:41:57.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:41:57.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:41:57.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:41:57.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:41:57.789 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:41:57.848 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:41:39
2026-05-29T11:41:57.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71744, datetime.datetime(2026, 5, 29, 11, 41, 39), datetime.datetime(2026, 5, 29, 11, 41, 38), 'salt', 11.98, 57.97, None, 13.48, 48.15, 8.0, 833.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:41:57.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:41:57.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:41:57.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:41:38, diff=19.855091s, valid=True
2026-05-29T11:41:57.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:41:57.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:41:57.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:42:12, diff=-14.142075s, valid=True
2026-05-29T11:41:57.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:41:57.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:41:57.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:41:36, diff=21.864552s, valid=True
2026-05-29T11:41:57.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:41:57.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:41:57.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:41:57.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:41:57.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:41:57.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:41:57.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:42:12, diff=-14.132417s, valid=True
2026-05-29T11:41:57.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:41:57.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:41:57.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:41:57.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980359.868252s, valid=True
2026-05-29T11:41:57.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:41:57.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:41:57.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:41:57.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:41:57.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:41:57.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:41:57.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:41:57.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:41:57.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:41:58.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:41:58.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:41:58.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:41:58.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:41:58.185 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:41:58.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:41:58.714 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:41:58.818 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:41:58.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:41: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-05-29T11:41: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-05-29T11:41:59.354 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:41:59.354 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:42:29.365 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:42:29.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:42:29.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:42:29.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:42:29.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:42:29.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:42:29.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-05-29T11:42:29.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:42:29.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-05-29T11:42:29.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:42:29.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:42:29.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:42:29.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-05-29T11:42:32.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-05-29T11:42:32.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:42:32.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:42:32.466 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:42:32.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:42:32.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:42:32.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:42:32.486 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:42:32.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:42:32.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:42:32.486 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:42:32.486 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:42:32.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:42:32.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:42:32.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:42:32.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:42:32.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:42:32.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:42:32.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:42:32.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:42:32.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:42:32.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:42:32.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:42:32.741 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:42:32.818 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:42:09
2026-05-29T11:42:32.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71745, datetime.datetime(2026, 5, 29, 11, 42, 9), datetime.datetime(2026, 5, 29, 11, 42, 9), 'salt', 12.24, 59.13, None, 17.96, 56.17, 7.73, 833.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:42:32.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:42:32.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:42:32.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:42:09, diff=23.824498s, valid=True
2026-05-29T11:42:32.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:42:32.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:42:32.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:42:12, diff=20.827358s, valid=True
2026-05-29T11:42:32.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:42:32.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:42:32.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:42:06, diff=26.834015s, valid=True
2026-05-29T11:42:32.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:42:32.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:42:32.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:42:32.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:42:32.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:42:32.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:42:32.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:42:12, diff=20.837004s, valid=True
2026-05-29T11:42:32.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:42:32.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:42:32.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:42:32.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980394.837658s, valid=True
2026-05-29T11:42:32.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:42:32.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:42:32.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:42:32.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:42:32.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:42:32.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:42:32.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:42:32.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:42:32.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:42:33.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:42:33.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:42:33.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:42:33.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:42:33.222 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:42:33.422 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:42:33.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:42:33.855 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:42:33.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:42:33.855 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:42:33.856 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:42:34.039 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:42:34.039 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:43:04.070 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:43:04.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:43:04.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:43:04.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:43:04.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:43:04.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:43:04.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-05-29T11:43:04.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:43:04.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-05-29T11:43:04.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:43:04.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:43:04.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:43:04.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-05-29T11:43:07.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-05-29T11:43:07.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:43:07.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:43:07.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:43:07.585 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:43:07.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:43:07.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:43:07.606 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:43:07.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:43:07.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:43:07.607 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:43:07.607 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:43:07.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:43:07.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:43:07.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:43:07.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:43:07.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:43:07.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:43:07.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:43:07.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:43:07.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:43:07.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:43:07.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:43:07.875 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:43:07.936 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:42:39
2026-05-29T11:43:07.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71746, datetime.datetime(2026, 5, 29, 11, 42, 39), datetime.datetime(2026, 5, 29, 11, 42, 39), 'salt', 12.18, 57.34, None, 18.46, 51.36, 8.17, 833.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:43:07.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:43:07.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:43:07.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:42:39, diff=28.942615s, valid=True
2026-05-29T11:43:07.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:43:07.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:43:07.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:43:12, diff=-4.054474s, valid=True
2026-05-29T11:43:07.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:43:07.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:43:07.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:42:36, diff=31.952318s, valid=True
2026-05-29T11:43:07.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:43:07.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:43:07.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:43:07.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:43:07.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:43:07.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:43:07.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:43:12, diff=-4.044555s, valid=True
2026-05-29T11:43:07.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:43:07.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:43:07.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:43:07.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980429.956119s, valid=True
2026-05-29T11:43:07.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:43:07.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:43:07.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:43:07.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:43:07.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:43:08.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:43:08.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:43:08.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:43:08.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:43:08.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:43:08.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:43:08.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:43:08.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:43:08.288 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:43:08.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:43:08.862 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:43:08.964 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:43:08.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:43:08.964 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:43:08.964 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:43:09.133 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:43:09.133 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:43:39.163 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:43:39.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:43:39.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:43:39.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:43:39.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:43:39.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:43:39.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-05-29T11:43:39.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:43:39.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-05-29T11:43:39.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:43:39.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:43:39.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:43:39.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-05-29T11:43:42.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-05-29T11:43:42.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:43:42.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:43:42.198 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:43:42.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:43:42.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:43:42.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:43:42.211 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:43:42.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:43:42.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:43:42.212 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:43:42.212 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:43:42.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:43:42.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:43:42.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:43:42.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:43:42.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:43:42.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:43:42.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:43:42.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:43:42.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:43:42.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:43:42.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:43:42.543 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:43:42.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:43:40
2026-05-29T11:43:42.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71748, datetime.datetime(2026, 5, 29, 11, 43, 40), datetime.datetime(2026, 5, 29, 11, 43, 39), 'salt', 12.28, 56.97, None, 17.26, 29.38, 8.27, 833.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:43:42.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:43:42.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:43:42.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:43:39, diff=3.60859s, valid=True
2026-05-29T11:43:42.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:43:42.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:43:42.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:44:12, diff=-29.388525s, valid=True
2026-05-29T11:43:42.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:43:42.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:43:42.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:43:39, diff=3.618143s, valid=True
2026-05-29T11:43:42.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:43:42.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:43:42.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:43:42.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:43:42.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:43:42.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:43:42.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:44:12, diff=-29.378827s, valid=True
2026-05-29T11:43:42.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:43:42.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:43:42.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:43:42.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980464.621849s, valid=True
2026-05-29T11:43:42.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:43:42.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:43:42.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:43:42.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:43:42.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:43:42.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:43:42.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:43:42.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:43:42.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:43:42.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:43:42.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:43:42.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:43:42.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:43:42.961 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:43:43.168 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:43:43.514 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:43:43.613 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:43:43.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:43:43.613 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:43:43.613 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:43:43.859 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:43:43.859 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:44:13.889 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:44:13.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:44:13.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:44:14.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:44:14.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:44:14.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:44: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-05-29T11:44:14.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:44:14.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-05-29T11:44:14.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:44:14.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:44:14.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:44: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-05-29T11:44:17.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-05-29T11:44:17.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:44:17.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:44:17.610 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:44:17.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:44:17.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:44:17.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:44:17.629 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:44:17.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:44:17.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:44:17.630 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:44:17.630 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:44:17.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:44:17.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:44:17.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:44:17.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:44:17.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:44:17.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:44:17.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:44:17.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:44:17.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:44:17.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:44:17.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:44:17.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:44:17.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:44:10
2026-05-29T11:44:17.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71749, datetime.datetime(2026, 5, 29, 11, 44, 10), datetime.datetime(2026, 5, 29, 11, 44, 10), 'salt', 12.14, 58.4, None, 20.89, 39.61, 7.9, 833.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:44:17.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:44:17.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:44:17.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:44:10, diff=7.964641s, valid=True
2026-05-29T11:44:17.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:44:17.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:44:17.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:44:12, diff=5.967513s, valid=True
2026-05-29T11:44:17.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:44:17.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:44:17.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:44:07, diff=10.974259s, valid=True
2026-05-29T11:44:17.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:44:17.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:44:17.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:44:17.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:44:17.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:44:17.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:44:17.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:44:12, diff=5.977306s, valid=True
2026-05-29T11:44:17.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:44:17.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:44:17.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:44:17.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980499.977968s, valid=True
2026-05-29T11:44:17.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:44:17.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:44:17.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:44:17.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:44:17.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:44:18.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:44:18.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:44:18.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:44:18.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:44:18.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:44:18.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:44:18.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:44:18.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:44:18.321 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:44:18.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:44:18.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:44:18.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:44:18.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:44:18.977 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:44:18.977 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:44:19.218 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:44:19.218 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:44:49.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:44:49.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:44:49.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:44:49.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:44:49.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:44:49.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:44:49.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T11:44:49.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:44:49.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T11:44:49.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:44:49.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:44:49.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:44:49.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-05-29T11:44:52.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-05-29T11:44:52.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:44:52.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:44:52.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:44:52.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:44:52.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:44:52.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:44:52.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:44:52.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:44:52.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:44:52.613 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:44:52.613 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:44:52.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:44:52.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:44:52.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:44:52.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:44:52.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:44:52.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:44:52.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:44:52.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:44:52.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:44:52.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:44:52.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:44:52.877 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:44:52.940 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:44:40
2026-05-29T11:44:52.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71750, datetime.datetime(2026, 5, 29, 11, 44, 40), datetime.datetime(2026, 5, 29, 11, 44, 40), 'salt', 12.34, 59.26, None, 18.7, 48.81, 7.71, 833.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:44:52.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:44:52.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:44:52.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:44:40, diff=12.948517s, valid=True
2026-05-29T11:44:52.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:44:52.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:44:52.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:45:12, diff=-19.047994s, valid=True
2026-05-29T11:44:52.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:44:52.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:44:52.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:44:37, diff=15.959383s, valid=True
2026-05-29T11:44:52.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:44:52.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:44:52.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:44:52.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:44:52.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:44:52.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:44:52.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:45:12, diff=-19.037428s, valid=True
2026-05-29T11:44:52.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:44:52.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:44:52.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:44:52.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980534.963304s, valid=True
2026-05-29T11:44:52.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:44:52.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:44:52.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:44:52.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:44:52.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:44:53.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:44:53.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:44:53.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:44:53.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:44:53.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:44:53.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:44:53.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:44:53.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:44:53.331 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:44:53.536 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:44:53.868 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:44:53.967 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:44:53.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:44:53.968 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:44:53.968 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:44:54.132 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:44:54.132 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:45:24.162 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:45:24.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:45:24.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:45:24.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:45:24.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:45:24.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:45:24.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-05-29T11:45:24.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:45:24.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-05-29T11:45:24.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:45:24.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:45:24.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:45:24.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-05-29T11:45:28.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-05-29T11:45:28.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:45:28.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:45:28.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:45:28.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:45:28.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:45:28.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:45:28.348 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:45:28.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:45:28.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:45:28.349 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:45:28.349 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:45:28.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:45:28.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:45:28.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:45:28.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:45:28.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:45:28.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:45:28.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:45:28.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:45:28.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:45:28.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:45:28.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:45:28.613 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:45:28.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:45:11
2026-05-29T11:45:28.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71751, datetime.datetime(2026, 5, 29, 11, 45, 11), datetime.datetime(2026, 5, 29, 11, 45, 10), 'salt', 12.21, 57.9, None, 17.11, 45.19, 8.03, 833.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:45:28.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:45:28.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:45:28.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:45:10, diff=18.679365s, valid=True
2026-05-29T11:45:28.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:45:28.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:45:28.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:45:12, diff=16.682367s, valid=True
2026-05-29T11:45:28.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:45:28.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:45:28.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:45:08, diff=20.689109s, valid=True
2026-05-29T11:45:28.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:45:28.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:45:28.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:45:28.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:45:28.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:45:28.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:45:28.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:45:12, diff=16.692223s, valid=True
2026-05-29T11:45:28.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:45:28.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:45:28.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:45:28.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980570.692888s, valid=True
2026-05-29T11:45:28.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:45:28.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:45:28.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:45:28.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:45:28.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:45:28.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:45:28.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:45:28.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:45:28.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:45:28.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:45:28.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:45:28.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:45:28.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:45:29.020 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:45:29.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:45:29.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:45:29.735 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:45:29.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:45:29.735 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:45:29.735 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:45:29.902 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:45:29.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:45:59.913 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:45:59.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:45:59.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:46:00.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:46:00.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:46:00.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:46:00.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-05-29T11:46:00.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:46:00.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-05-29T11:46:00.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:46:00.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:46:00.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:46:00.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-05-29T11:46:03.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-05-29T11:46:03.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:46:03.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:46:03.147 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:46:03.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:46:03.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:46:03.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:46:03.169 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:46:03.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:46:03.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:46:03.170 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:46:03.170 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:46:03.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:46:03.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:46:03.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:46:03.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:46:03.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:46:03.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:46:03.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:46:03.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:46:03.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:46:03.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:46:03.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:46:03.422 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:46:03.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:45:41
2026-05-29T11:46:03.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71752, datetime.datetime(2026, 5, 29, 11, 45, 41), datetime.datetime(2026, 5, 29, 11, 45, 41), 'salt', 12.11, 58.46, None, 17.43, 40.55, 7.89, 833.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:46:03.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:46:03.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:46:03.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:45:41, diff=22.489632s, valid=True
2026-05-29T11:46:03.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:46:03.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:46:03.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:46:12, diff=-8.507557s, valid=True
2026-05-29T11:46:03.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:46:03.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:46:03.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:45:38, diff=25.499064s, valid=True
2026-05-29T11:46:03.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:46:03.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:46:03.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:46:03.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:46:03.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:46:03.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:46:03.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:46:12, diff=-8.497914s, valid=True
2026-05-29T11:46:03.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:46:03.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:46:03.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:46:03.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980605.502756s, valid=True
2026-05-29T11:46:03.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:46:03.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:46:03.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:46:03.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:46:03.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:46:03.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:46:03.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:46:03.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:46:03.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:46:03.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:46:03.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:46:03.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:46:03.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:46:03.817 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:46:04.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:46:04.348 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:46:04.449 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:46:04.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:46:04.449 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:46:04.449 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:46:04.611 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:46:04.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:46:34.616 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:46:34.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:46:34.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:46:35.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:46:35.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:46:35.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:46:35.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-05-29T11:46:35.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:46: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-05-29T11:46:35.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:46:35.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:46:35.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:46:35.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-05-29T11:46:38.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-05-29T11:46:38.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:46:38.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:46:38.285 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:46:38.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:46:38.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:46:38.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:46:38.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:46:38.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:46:38.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:46:38.304 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:46:38.304 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:46:38.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:46:38.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:46:38.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:46:38.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:46:38.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:46:38.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:46:38.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:46:38.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:46:38.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:46:38.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:46:38.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:46:38.562 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:46:38.620 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:46:11
2026-05-29T11:46:38.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71753, datetime.datetime(2026, 5, 29, 11, 46, 11), datetime.datetime(2026, 5, 29, 11, 46, 11), 'salt', 12.38, 58.6, None, 17.26, 34.78, 7.88, 833.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:46:38.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:46:38.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:46:38.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:46:11, diff=27.626407s, valid=True
2026-05-29T11:46:38.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:46:38.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:46:38.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:46:12, diff=26.629187s, valid=True
2026-05-29T11:46:38.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:46:38.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:46:38.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:46:08, diff=30.635731s, valid=True
2026-05-29T11:46:38.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:46:38.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:46:38.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:46:38.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:46:38.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:46:38.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:46:38.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:46:12, diff=26.63874s, valid=True
2026-05-29T11:46:38.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:46:38.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:46:38.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:46:38.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980640.639404s, valid=True
2026-05-29T11:46:38.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:46:38.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:46:38.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:46:38.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:46:38.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:46:38.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:46:38.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:46:38.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:46:38.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:46:38.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:46:38.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:46:38.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:46:38.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:46:38.953 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:46:39.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:46:39.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:46:39.664 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:46:39.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:46:39.664 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:46:39.664 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:46:39.833 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:46:39.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:47:09.863 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:47:09.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:47:09.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:47:10.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:47:10.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:47:10.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:47:10.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-05-29T11:47:10.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:47:10.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-05-29T11:47:10.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:47:10.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:47:10.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:47:10.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-05-29T11:47:13.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-05-29T11:47:13.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:47:13.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:47:13.063 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:47:13.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:47:13.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:47:13.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:47:13.083 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:47:13.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:47:13.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:47:13.083 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:47:13.084 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:47:13.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:47:13.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:47:13.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:47:13.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:47:13.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:47:13.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:47:13.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:47:13.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:47:13.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:47:13.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:47:13.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:47:13.388 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:47:13.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:47:12
2026-05-29T11:47:13.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71755, datetime.datetime(2026, 5, 29, 11, 47, 12), datetime.datetime(2026, 5, 29, 11, 47, 12), 'salt', 12.51, 57.83, None, 14.12, 39.26, 8.07, 833.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:47:13.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:47:13.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:47:13.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:47:12, diff=1.457638s, valid=True
2026-05-29T11:47:13.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:47:13.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:47:13.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:47:12, diff=1.460491s, valid=True
2026-05-29T11:47:13.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:47:13.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:47:13.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:47:09, diff=4.467065s, valid=True
2026-05-29T11:47:13.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:47:13.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:47:13.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:47:13.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:47:13.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:47:13.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:47:13.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:47:12, diff=1.470103s, valid=True
2026-05-29T11:47:13.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:47:13.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:47:13.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:47:13.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980675.470771s, valid=True
2026-05-29T11:47:13.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:47:13.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:47:13.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:47:13.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:47:13.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:47:13.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:47:13.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:47:13.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:47:13.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:47:13.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:47:13.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:47:13.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:47:13.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:47:13.796 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:47:14.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:47:14.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:47:14.455 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:47:14.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:47:14.455 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:47:14.455 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:47:14.617 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:47:14.618 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:47:44.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:47:44.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:47:44.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:47:45.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:47:45.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:47:45.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:47:45.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-05-29T11:47:45.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:47:45.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-05-29T11:47:45.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:47:45.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:47:45.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:47:45.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-05-29T11:47:47.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-05-29T11:47:47.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:47:47.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:47:47.865 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:47:47.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:47:47.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:47:47.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:47:47.885 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:47:47.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:47:47.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:47:47.885 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:47:47.885 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:47:47.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:47:47.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:47:47.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:47:48.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:47:48.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:47:48.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:47:48.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:47:48.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:47:48.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:47:48.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:47:48.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:47:48.158 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:47:48.220 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:47:42
2026-05-29T11:47:48.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71756, datetime.datetime(2026, 5, 29, 11, 47, 42), datetime.datetime(2026, 5, 29, 11, 47, 42), 'salt', 12.61, 58.06, None, 18.38, 44.7, 8.02, 833.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:47:48.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:47:48.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:47:48.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:47:42, diff=6.229009s, valid=True
2026-05-29T11:47:48.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:47:48.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:47:48.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:48:12, diff=-23.767259s, valid=True
2026-05-29T11:47:48.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:47:48.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:47:48.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:47:40, diff=8.241295s, valid=True
2026-05-29T11:47:48.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:47:48.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:47:48.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:47:48.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:47:48.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:47:48.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:47:48.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:48:12, diff=-23.755575s, valid=True
2026-05-29T11:47:48.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:47:48.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:47:48.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:47:48.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980710.245121s, valid=True
2026-05-29T11:47:48.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:47:48.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:47:48.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:47:48.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:47:48.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:47:48.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:47:48.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:47:48.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:47:48.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:47:48.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:47:48.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:47:48.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:47:48.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:47:48.636 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:47:48.852 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:47:49.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:47:49.288 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:47:49.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:47:49.288 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:47:49.288 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:47:49.556 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:47:49.557 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:48:19.580 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:48:19.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:48:19.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:48:20.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:48:20.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:48:20.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:48:20.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-05-29T11:48:20.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:48:20.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-05-29T11:48:20.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:48:20.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:48:20.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:48:20.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-05-29T11:48:23.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-05-29T11:48:23.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:48:23.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:48:23.180 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:48:23.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:48:23.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:48:23.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:48:23.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:48:23.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:48:23.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:48:23.201 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:48:23.201 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:48:23.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:48:23.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:48:23.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:48:23.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:48:23.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:48:23.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:48:23.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:48:23.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:48:23.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:48:23.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:48:23.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:48:23.478 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:48:23.541 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:48:12
2026-05-29T11:48:23.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71757, datetime.datetime(2026, 5, 29, 11, 48, 12), datetime.datetime(2026, 5, 29, 11, 48, 12), 'salt', 12.51, 57.63, None, 21.31, 39.02, 8.12, 833.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:48:23.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:48:23.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:48:23.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:48:12, diff=11.547985s, valid=True
2026-05-29T11:48:23.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:48:23.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:48:23.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:48:12, diff=11.55224s, valid=True
2026-05-29T11:48:23.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:48:23.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:48:23.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:48:12, diff=11.563364s, valid=True
2026-05-29T11:48:23.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:48:23.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:48:23.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:48:23.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:48:23.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:48:23.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:48:23.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:48:12, diff=11.568842s, valid=True
2026-05-29T11:48:23.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:48:23.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:48:23.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:48:23.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980745.569973s, valid=True
2026-05-29T11:48:23.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:48:23.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:48:23.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:48:23.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:48:23.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:48:23.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:48:23.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:48:23.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:48:23.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:48:23.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:48:23.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:48:23.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:48:23.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:48:23.895 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:48:24.107 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:48:24.445 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:48:24.553 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:48:24.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:48:24.554 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:48:24.554 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:48:24.824 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:48:24.824 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:48:54.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:48:54.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:48:54.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:48:55.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:48:55.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:48:55.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:48:55.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-05-29T11:48:55.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:48:55.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T11:48:55.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:48:55.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:48:55.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:48:55.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-05-29T11:48:58.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-05-29T11:48:58.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:48:58.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:48:58.260 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:48:58.260 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:48:58.269 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:48:58.280 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:48:58.281 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:48:58.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:48:58.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:48:58.281 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:48:58.281 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:48:58.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:48:58.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:48:58.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:48:58.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:48:58.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:48:58.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:48:58.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:48:58.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:48:58.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:48:58.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:48:58.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:48:58.557 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:48:58.630 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:48:43
2026-05-29T11:48:58.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71758, datetime.datetime(2026, 5, 29, 11, 48, 43), datetime.datetime(2026, 5, 29, 11, 48, 42), 'salt', 12.61, 57.87, None, 22.83, 38.74, 8.07, 833.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:48:58.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:48:58.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:48:58.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:48:42, diff=16.63673s, valid=True
2026-05-29T11:48:58.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:48:58.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:48:58.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:49:12, diff=-13.36036s, valid=True
2026-05-29T11:48:58.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:48:58.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:48:58.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:48:40, diff=18.646296s, valid=True
2026-05-29T11:48:58.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:48:58.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:48:58.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:48:58.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:48:58.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:48:58.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:48:58.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:49:12, diff=-13.35064s, valid=True
2026-05-29T11:48:58.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:48:58.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:48:58.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:48:58.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980780.650033s, valid=True
2026-05-29T11:48:58.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:48:58.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:48:58.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:48:58.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:48:58.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:48:58.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:48:58.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:48:58.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:48:58.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:48:58.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:48:58.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:48:58.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:48:58.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:48:59.042 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:48:59.243 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:48:59.589 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:48:59.689 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:48:59.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:48:59.690 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:48:59.690 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:48:59.984 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:48:59.984 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:49:30.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:49:30.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:49:30.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:49:30.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:49:30.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:49:30.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:49:30.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-05-29T11:49:30.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:49:30.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-05-29T11:49:30.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:49:30.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:49:30.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:49:30.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-05-29T11:49:33.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-05-29T11:49:33.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:49:33.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:49:33.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:49:33.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:49:33.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:49:33.444 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:49:33.444 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:49:33.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:49:33.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:49:33.445 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:49:33.445 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:49:33.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:49:33.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:49:33.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:49:33.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:49:33.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:49:33.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:49:33.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:49:33.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:49:33.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:49:33.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:49:33.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:49:33.725 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:49:33.788 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:49:13
2026-05-29T11:49:33.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71759, datetime.datetime(2026, 5, 29, 11, 49, 13), datetime.datetime(2026, 5, 29, 11, 49, 12), 'salt', 12.57, 56.51, None, 19.97, 52.65, 8.4, 833.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:49:33.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:49:33.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:49:33.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:49:12, diff=21.795509s, valid=True
2026-05-29T11:49:33.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:49:33.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:49:33.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:49:12, diff=21.798755s, valid=True
2026-05-29T11:49:33.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:49:33.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:49:33.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:49:10, diff=23.806264s, valid=True
2026-05-29T11:49:33.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:49:33.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:49:33.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:49:33.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:49:33.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:49:33.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:49:33.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:49:12, diff=21.809719s, valid=True
2026-05-29T11:49:33.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:49:33.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:49:33.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:49:33.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980815.81045s, valid=True
2026-05-29T11:49:33.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:49:33.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:49:33.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:49:33.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:49:33.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:49:33.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:49:33.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:49:33.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:49:33.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:49:33.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:49:34.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:49:34.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:49:34.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:49:34.135 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:49:34.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:49:34.740 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:49:34.843 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:49:34.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:49:34.844 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:49:34.844 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:49:35.112 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:49:35.112 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:50:05.134 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:50:05.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:50:05.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:50:05.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:50:05.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:50:05.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:50:05.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-05-29T11:50:05.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:50:05.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-05-29T11:50:05.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:50:05.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:50:05.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:50:05.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-05-29T11:50:08.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-05-29T11:50:08.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:50:08.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:50:08.570 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:50:08.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:50:08.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:50:08.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:50:08.590 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:50:08.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:50:08.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:50:08.591 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:50:08.591 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:50:08.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:50:08.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:50:08.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:50:08.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:50:08.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:50:08.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:50:08.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:50:08.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:50:08.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:50:08.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:50:08.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:50:08.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:50:08.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:49:45
2026-05-29T11:50:08.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71760, datetime.datetime(2026, 5, 29, 11, 49, 45), datetime.datetime(2026, 5, 29, 11, 49, 43), 'salt', 12.57, 56.97, None, 21.52, 40.15, 8.28, 833.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:50:08.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:50:08.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:50:08.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:49:43, diff=25.941108s, valid=True
2026-05-29T11:50:08.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:50:08.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:50:08.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:50:12, diff=-3.056036s, valid=True
2026-05-29T11:50:08.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:50:08.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:50:08.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:49:40, diff=28.950492s, valid=True
2026-05-29T11:50:08.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:50:08.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:50:08.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:50:08.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:50:08.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:50:08.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:50:08.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:50:12, diff=-3.046512s, valid=True
2026-05-29T11:50:08.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:50:08.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:50:08.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:50:08.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980850.95414s, valid=True
2026-05-29T11:50:08.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:50:08.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:50:08.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:50:08.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:50:08.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:50:09.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:50:09.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:50:09.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:50:09.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:50:09.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:50:09.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:50:09.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:50:09.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:50:09.270 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:50:09.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:50:09.821 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:50:09.932 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:50:09.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:50:09.933 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:50:09.933 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:50:10.179 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:50:10.179 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:50:40.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:50:40.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:50:40.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:50:40.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:50:40.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:50:40.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:50:40.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-05-29T11:50:40.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:50:40.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-05-29T11:50:40.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:50:40.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:50:40.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:50:40.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-05-29T11:50:43.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T11:50:43.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:50:43.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:50:43.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:50:43.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:50:43.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:50:43.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:50:43.624 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:50:43.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:50:43.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:50:43.624 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:50:43.624 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:50:43.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:50:43.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:50:43.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:50:43.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:50:43.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:50:43.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:50:43.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:50:43.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:50:43.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:50:43.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:50:43.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:50:43.904 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:50:43.966 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:50:15
2026-05-29T11:50:43.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71761, datetime.datetime(2026, 5, 29, 11, 50, 15), datetime.datetime(2026, 5, 29, 11, 50, 15), 'salt', 12.61, 57.2, None, 19.27, 37.68, 8.23, 833.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:50:43.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:50:43.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:50:43.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:50:15, diff=28.973227s, valid=True
2026-05-29T11:50:43.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:50:43.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:50:43.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:50:12, diff=31.976143s, valid=True
2026-05-29T11:50:43.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:50:43.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:50:43.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:50:10, diff=33.98305s, valid=True
2026-05-29T11:50:43.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:50:43.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:50:43.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:50:43.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:50:43.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:50:43.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:50:43.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:50:12, diff=31.98631s, valid=True
2026-05-29T11:50:43.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:50:43.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:50:43.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:50:43.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980885.987012s, valid=True
2026-05-29T11:50:43.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:50:43.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:50:43.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:50:43.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:50:43.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:50:44.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:50:44.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:50:44.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:50:44.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:50:44.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:50:44.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:50:44.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:50:44.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:50:44.307 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:50:44.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:50:44.868 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:50:44.970 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:50:44.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:50:44.970 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:50:44.970 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:50:45.227 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:50:45.227 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:51:15.250 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:51:15.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:51:15.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:51:15.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:51:15.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:51:15.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:51:15.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-05-29T11:51:15.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:51:15.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-05-29T11:51:15.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:51:15.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:51:15.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:51:15.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-05-29T11:51:19.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-05-29T11:51:19.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:51:19.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:51:19.144 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:51:19.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:51:19.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:51:19.171 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:51:19.171 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:51:19.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:51:19.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:51:19.172 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:51:19.172 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:51:19.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:51:19.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:51:19.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:51:19.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:51:19.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:51:19.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:51:19.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:51:19.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:51:19.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:51:19.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:51:19.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:51:19.428 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:51:19.486 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:51:16
2026-05-29T11:51:19.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71763, datetime.datetime(2026, 5, 29, 11, 51, 16), datetime.datetime(2026, 5, 29, 11, 51, 16), 'salt', 12.61, 56.54, None, 18.38, 54.01, 8.4, 833.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:51:19.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:51:19.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:51:19.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:51:16, diff=3.492974s, valid=True
2026-05-29T11:51:19.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:51:19.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:51:19.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:51:12, diff=7.495854s, valid=True
2026-05-29T11:51:19.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:51:19.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:51:19.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:51:11, diff=8.502479s, valid=True
2026-05-29T11:51:19.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:51:19.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:51:19.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:51:19.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:51:19.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:51:19.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:51:19.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:51:12, diff=7.505508s, valid=True
2026-05-29T11:51:19.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:51:19.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:51:19.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:51:19.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980921.506163s, valid=True
2026-05-29T11:51:19.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:51:19.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:51:19.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:51:19.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:51:19.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:51:19.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:51:19.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:51:19.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:51:19.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:51:19.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:51:19.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:51:19.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:51:19.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:51:19.828 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:51:20.089 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:51:20.453 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:51:20.555 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:51:20.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:51:20.555 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:51:20.555 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:51:20.820 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:51:20.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:51:50.826 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:51:50.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:51:50.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:51:50.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:51:51.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:51:51.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:51:51.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-05-29T11:51:51.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:51:51.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-05-29T11:51:51.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:51:51.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:51:51.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:51:51.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T11:51:54.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-05-29T11:51:54.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:51:54.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:51:54.260 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:51:54.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:51:54.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:51:54.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:51:54.281 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:51:54.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:51:54.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:51:54.282 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:51:54.282 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:51:54.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:51:54.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:51:54.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:51:54.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:51:54.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:51:54.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:51:54.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:51:54.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:51:54.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:51:54.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:51:54.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:51:54.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:51:54.593 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:51:46
2026-05-29T11:51:54.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71764, datetime.datetime(2026, 5, 29, 11, 51, 46), datetime.datetime(2026, 5, 29, 11, 51, 46), 'salt', 12.51, 57.86, None, 17.5, 36.16, 8.06, 833.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:51:54.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:51:54.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:51:54.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:51:46, diff=8.600141s, valid=True
2026-05-29T11:51:54.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:51:54.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:51:54.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:52:12, diff=-17.397036s, valid=True
2026-05-29T11:51:54.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:51:54.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:51:54.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:51:41, diff=13.609439s, valid=True
2026-05-29T11:51:54.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:51:54.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:51:54.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:51:54.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:51:54.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:51:54.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:51:54.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:52:12, diff=-17.387536s, valid=True
2026-05-29T11:51:54.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:51:54.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:51:54.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:51:54.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980956.613118s, valid=True
2026-05-29T11:51:54.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:51:54.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:51:54.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:51:54.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:51:54.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:51:54.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:51:54.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:51:54.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:51:54.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:51:54.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:51:54.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:51:54.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:51:54.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:51:54.930 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:51:55.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:51:55.584 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:51:55.684 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:51:55.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:51:55.684 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:51:55.685 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:51:55.953 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:51:55.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:52:25.962 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:52:25.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:52:25.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:52:26.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:52:26.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:52:26.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:52:26.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-05-29T11:52:26.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:52:26.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-05-29T11:52:26.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:52:26.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:52:26.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:52:26.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-05-29T11:52:29.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-05-29T11:52:29.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:52:29.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:52:29.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:52:29.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:52:29.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:52:29.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:52:29.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:52:29.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:52:29.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:52:29.344 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:52:29.344 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:52:29.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:52:29.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:52:29.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:52:29.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:52:29.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:52:29.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:52:29.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:52:29.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:52:29.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:52:29.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:52:29.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:52:29.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:52:29.654 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:52:17
2026-05-29T11:52:29.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71765, datetime.datetime(2026, 5, 29, 11, 52, 17), datetime.datetime(2026, 5, 29, 11, 52, 16), 'salt', 12.61, 57.7, None, 18.35, 41.58, 8.11, 833.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:52:29.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:52:29.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:52:29.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:52:16, diff=13.660139s, valid=True
2026-05-29T11:52:29.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:52:29.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:52:29.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:52:12, diff=17.662997s, valid=True
2026-05-29T11:52:29.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:52:29.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:52:29.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:52:13, diff=16.669541s, valid=True
2026-05-29T11:52:29.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:52:29.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:52:29.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:52:29.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:52:29.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:52:29.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:52:29.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:52:12, diff=17.672576s, valid=True
2026-05-29T11:52:29.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:52:29.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:52:29.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:52:29.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=980991.673241s, valid=True
2026-05-29T11:52:29.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:52:29.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:52:29.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:52:29.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:52:29.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:52:29.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:52:29.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:52:29.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:52:29.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:52:29.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:52:29.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:52:29.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:52:29.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:52:30.009 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:52:30.231 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:52:30.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:52:30.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:52:30.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:52: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-05-29T11:52: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-05-29T11:52:30.918 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:52:30.918 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:53:00.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:53:00.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:53:00.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:53:01.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:53:01.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:53:01.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:53:01.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T11:53:01.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:53:01.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-05-29T11:53:01.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:53:01.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:53:01.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:53:01.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T11:53: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-05-29T11:53:04.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:53:04.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:53:04.298 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:53:04.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:53:04.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:53:04.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:53:04.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:53:04.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:53:04.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:53:04.320 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:53:04.320 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:53:04.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:53:04.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:53:04.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:53:04.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:53:04.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:53:04.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:53:04.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:53:04.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:53:04.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:53:04.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:53:04.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:53:04.622 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:53:04.681 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:52:47
2026-05-29T11:53:04.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71766, datetime.datetime(2026, 5, 29, 11, 52, 47), datetime.datetime(2026, 5, 29, 11, 52, 46), 'salt', 12.41, 56.6, None, 18.21, 56.17, 8.37, 833.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:53:04.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:53:04.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:53:04.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:52:46, diff=18.688115s, valid=True
2026-05-29T11:53:04.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:53:04.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:53:04.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:53:12, diff=-7.309031s, valid=True
2026-05-29T11:53:04.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:53:04.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:53:04.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:52:44, diff=20.697609s, valid=True
2026-05-29T11:53:04.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:53:04.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:53:04.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:53:04.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:53:04.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:53:04.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:53:04.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:53:12, diff=-7.299248s, valid=True
2026-05-29T11:53:04.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:53:04.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:53:04.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:53:04.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981026.701414s, valid=True
2026-05-29T11:53:04.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:53:04.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:53:04.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:53:04.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:53:04.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:53:04.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:53:04.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:53:04.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:53:04.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:53:04.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:53:04.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:53:04.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:53:04.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:53:05.088 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:53:05.296 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:53:05.635 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:53:05.735 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:53:05.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:53:05.735 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:53:05.735 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:53:05.901 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:53:05.901 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:53:35.931 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:53:35.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:53:35.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:53:36.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:53:36.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:53:36.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:53:36.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T11:53:36.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:53:36.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-05-29T11:53:36.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:53:36.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:53:36.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:53:36.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T11:53: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-05-29T11:53:39.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:53:39.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:53:39.387 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:53:39.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:53:39.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:53:39.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:53:39.408 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:53:39.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:53:39.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:53:39.408 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:53:39.408 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:53:39.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:53:39.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:53:39.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:53:39.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:53:39.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:53:39.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:53:39.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:53:39.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:53:39.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:53:39.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:53:39.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:53:39.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:53:39.723 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:53:17
2026-05-29T11:53:39.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71767, datetime.datetime(2026, 5, 29, 11, 53, 17), datetime.datetime(2026, 5, 29, 11, 53, 17), 'salt', 12.47, 57.13, None, 20.36, 52.51, 8.24, 833.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:53:39.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:53:39.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:53:39.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:53:17, diff=22.730317s, valid=True
2026-05-29T11:53:39.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:53:39.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:53:39.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:53:12, diff=27.733469s, valid=True
2026-05-29T11:53:39.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:53:39.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:53:39.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:53:15, diff=24.740944s, valid=True
2026-05-29T11:53:39.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:53:39.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:53:39.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:53:39.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:53:39.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:53:39.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:53:39.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:53:12, diff=27.744343s, valid=True
2026-05-29T11:53:39.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:53:39.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:53:39.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:53:39.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981061.745104s, valid=True
2026-05-29T11:53:39.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:53:39.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:53:39.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:53:39.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:53:39.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:53:39.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:53:39.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:53:39.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:53:39.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:53:39.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:53:39.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:53:39.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:53:40.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:53:40.082 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:53:40.296 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:53:40.677 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:53:40.778 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:53:40.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:53:40.779 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:53:40.779 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:53:41.029 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:53:41.029 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:54:11.059 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:54:11.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:54:11.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:54:11.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:54:11.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:54:11.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:54:11.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-05-29T11:54:11.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:54:11.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-05-29T11:54:11.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:54:11.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:54:11.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:54:11.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-05-29T11:54:15.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-05-29T11:54:15.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:54:15.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:54:15.159 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:54:15.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:54:15.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:54:15.173 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:54:15.174 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:54:15.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:54:15.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:54:15.174 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:54:15.174 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:54:15.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:54:15.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:54:15.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:54:15.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:54:15.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:54:15.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:54:15.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:54:15.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:54:15.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:54:15.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:54:15.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:54:15.433 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:54:15.492 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:53:47
2026-05-29T11:54:15.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71768, datetime.datetime(2026, 5, 29, 11, 53, 47), datetime.datetime(2026, 5, 29, 11, 53, 47), 'salt', 12.34, 57.53, None, 20.47, 43.34, 8.13, 833.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:54:15.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:54:15.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:54:15.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:53:47, diff=28.498741s, valid=True
2026-05-29T11:54:15.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:54:15.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:54:15.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:54:12, diff=3.501603s, valid=True
2026-05-29T11:54:15.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:54:15.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:54:15.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:53:47, diff=28.508322s, valid=True
2026-05-29T11:54:15.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:54:15.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:54:15.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:54:15.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:54:15.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:54:15.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:54:15.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:54:12, diff=3.511385s, valid=True
2026-05-29T11:54:15.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:54:15.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:54:15.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:54:15.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981097.512055s, valid=True
2026-05-29T11:54:15.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:54:15.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:54:15.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:54:15.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:54:15.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:54:15.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:54:15.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:54:15.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:54:15.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:54:15.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:54:15.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:54:15.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:54:15.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:54:15.905 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:54:16.118 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:54:16.471 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:54:16.576 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:54:16.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:54:16.576 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:54:16.577 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:54:16.645 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:54:16.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:54:46.650 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:54:46.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:54:46.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:54:47.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:54:47.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:54:47.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:54:47.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-05-29T11:54:47.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:54:47.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-05-29T11:54:47.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:54:47.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:54:47.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:54:47.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-05-29T11:54:49.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-05-29T11:54:49.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:54:49.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:54:49.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:54:49.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:54:49.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:54:49.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:54:49.977 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:54:49.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:54:49.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:54:49.977 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:54:49.977 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:54:49.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:54:50.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:54:50.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:54:50.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:54:50.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:54:50.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:54:50.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:54:50.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:54:50.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:54:50.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:54:50.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:54:50.240 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:54:50.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:54:48
2026-05-29T11:54:50.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71770, datetime.datetime(2026, 5, 29, 11, 54, 48), datetime.datetime(2026, 5, 29, 11, 54, 47), 'salt', 12.51, 58.96, None, 18.88, 49.86, 7.8, 833.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:54:50.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:54:50.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:54:50.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:54:47, diff=3.304637s, valid=True
2026-05-29T11:54:50.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:54:50.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:54:50.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:55:12, diff=-21.692504s, valid=True
2026-05-29T11:54:50.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:54:50.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:54:50.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:54:43, diff=7.314187s, valid=True
2026-05-29T11:54:50.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:54:50.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:54:50.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:54:50.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:54:50.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:54:50.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:54:50.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:55:12, diff=-21.682754s, valid=True
2026-05-29T11:54:50.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:54:50.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:54:50.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:54:50.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981132.317903s, valid=True
2026-05-29T11:54:50.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:54:50.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:54:50.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:54:50.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:54:50.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:54:50.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:54:50.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:54:50.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:54:50.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:54:50.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:54:50.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:54:50.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:54:50.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:54:50.639 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:54:50.870 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:54:51.214 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:54:51.312 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:54:51.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:54: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-05-29T11:54: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-05-29T11:54:51.797 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:54:51.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:55:21.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:55:21.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:55:21.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:55:22.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:55:22.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:55:22.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:55:22.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-05-29T11:55:22.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:55: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-05-29T11:55:22.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:55:22.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:55:22.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:55:22.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-05-29T11:55:25.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-05-29T11:55:25.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:55:25.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:55:25.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:55:25.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:55:25.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:55:25.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:55:25.081 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:55:25.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:55:25.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:55:25.082 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:55:25.082 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:55:25.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:55:25.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:55:25.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:55:25.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:55:25.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:55:25.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:55:25.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:55:25.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:55:25.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:55:25.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:55:25.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:55:25.345 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:55:25.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:55:18
2026-05-29T11:55:25.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71771, datetime.datetime(2026, 5, 29, 11, 55, 18), datetime.datetime(2026, 5, 29, 11, 55, 18), 'salt', 12.44, 58.03, None, 19.27, 47.3, 8.02, 833.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:55:25.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:55:25.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:55:25.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:55:18, diff=7.409459s, valid=True
2026-05-29T11:55:25.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:55:25.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:55:25.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:55:12, diff=13.412308s, valid=True
2026-05-29T11:55:25.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:55:25.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:55:25.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:55:13, diff=12.418884s, valid=True
2026-05-29T11:55:25.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:55:25.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:55:25.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:55:25.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:55:25.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:55:25.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:55:25.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:55:12, diff=13.421878s, valid=True
2026-05-29T11:55:25.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:55:25.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:55:25.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:55:25.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981167.422568s, valid=True
2026-05-29T11:55:25.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:55:25.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:55:25.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:55:25.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:55:25.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:55:25.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:55:25.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:55:25.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:55:25.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:55:25.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:55:25.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:55:25.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:55:25.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:55:25.822 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:55:26.041 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:55:26.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:55:26.501 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:55:26.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:55:26.501 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:55:26.501 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:55:26.672 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:55:26.672 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:55:56.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:55:56.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:55:56.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:55:56.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:55:56.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:55:57.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:55:57.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-05-29T11:55:57.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:55:57.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-05-29T11:55:57.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:55:57.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:55:57.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:55:57.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-05-29T11:56:00.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-05-29T11:56:00.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:56:00.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:56:00.191 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:56:00.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:56:00.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:56:00.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:56:00.211 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:56:00.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:56:00.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:56:00.212 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:56:00.212 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:56:00.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:56:00.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:56:00.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:56:00.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:56:00.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:56:00.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:56:00.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:56:00.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:56:00.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:56:00.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:56:00.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:56:00.471 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:56:00.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:55:48
2026-05-29T11:56:00.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71772, datetime.datetime(2026, 5, 29, 11, 55, 48), datetime.datetime(2026, 5, 29, 11, 55, 48), 'salt', 12.27, 58.46, None, 22.69, 39.65, 7.9, 833.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:56:00.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:56:00.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:56:00.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:55:48, diff=12.545338s, valid=True
2026-05-29T11:56:00.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:56:00.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:56:00.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:56:12, diff=-11.451789s, valid=True
2026-05-29T11:56:00.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:56:00.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:56:00.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:55:43, diff=17.554918s, valid=True
2026-05-29T11:56:00.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:56:00.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:56:00.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:56:00.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:56:00.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:56:00.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:56:00.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:56:12, diff=-11.442031s, valid=True
2026-05-29T11:56:00.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:56:00.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:56:00.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:56:00.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981202.558638s, valid=True
2026-05-29T11:56:00.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:56:00.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:56:00.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:56:00.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:56:00.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:56:00.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:56:00.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:56:00.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:56:00.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:56:00.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:56:00.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:56:00.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:56:00.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:56:00.878 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:56:01.140 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:56:01.488 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:56:01.589 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:56:01.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:56:01.589 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:56:01.589 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:56:01.834 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:56:01.834 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:56:31.864 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:56:31.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:56:31.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:56:32.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:56:32.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:56:32.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:56:32.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-05-29T11:56:32.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:56:32.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-05-29T11:56:32.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:56:32.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:56:32.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:56: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-05-29T11:56:35.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-05-29T11:56:35.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:56:35.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:56:35.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:56:35.617 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:56:35.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:56:35.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:56:35.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:56:35.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:56:35.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:56:35.637 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:56:35.637 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:56:35.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:56:35.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:56:35.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:56:35.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:56:35.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:56:35.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:56:35.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:56:35.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:56:35.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:56:35.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:56:35.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:56:35.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:56:35.956 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:56:18
2026-05-29T11:56:35.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71773, datetime.datetime(2026, 5, 29, 11, 56, 18), datetime.datetime(2026, 5, 29, 11, 56, 18), 'salt', 12.31, 59.29, None, 21.63, 53.17, 7.7, 833.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:56:35.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:56:35.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:56:35.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:56:18, diff=17.962701s, valid=True
2026-05-29T11:56:35.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:56:35.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:56:35.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:56:12, diff=23.965555s, valid=True
2026-05-29T11:56:35.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:56:35.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:56:35.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:56:13, diff=22.972244s, valid=True
2026-05-29T11:56:35.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:56:35.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:56:35.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:56:35.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:56:35.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:56:35.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:56:35.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:56:12, diff=23.975259s, valid=True
2026-05-29T11:56:35.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:56:35.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:56:35.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:56:35.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981237.975928s, valid=True
2026-05-29T11:56:35.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:56:35.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:56:35.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:56:35.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:56:35.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:56:36.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:56:36.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:56:36.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:56:36.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:56:36.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:56:36.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:56:36.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:56:36.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:56:36.299 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:56:36.510 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:56:36.866 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:56:36.966 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:56:36.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:56:36.966 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:56:36.966 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:56:37.136 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:56:37.136 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:57:07.150 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:57:07.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:57:07.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:57:07.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:57:07.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:57:07.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:57: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-05-29T11:57:07.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:57:07.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-05-29T11:57:07.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:57:07.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:57:07.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:57:07.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-05-29T11:57:10.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-05-29T11:57:10.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:57:10.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:57:10.686 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:57:10.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:57:10.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:57:10.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:57:10.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:57:10.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:57:10.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:57:10.706 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:57:10.707 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:57:10.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:57:10.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:57:10.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:57:10.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:57:10.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:57:10.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:57:10.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:57:10.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:57:10.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:57:10.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:57:10.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:57:10.967 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:57:11.028 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:56:49
2026-05-29T11:57:11.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71774, datetime.datetime(2026, 5, 29, 11, 56, 49), datetime.datetime(2026, 5, 29, 11, 56, 48), 'salt', 12.31, 59.69, None, 18.53, 49.23, 7.61, 833.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:57:11.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:57:11.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:57:11.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:56:48, diff=23.034381s, valid=True
2026-05-29T11:57:11.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:57:11.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:57:11.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:57:12, diff=-0.962771s, valid=True
2026-05-29T11:57:11.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:57:11.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:57:11.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:56:45, diff=26.043901s, valid=True
2026-05-29T11:57:11.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:57:11.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:57:11.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:57:11.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:57:11.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:57:11.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:57:11.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:57:12, diff=-0.953047s, valid=True
2026-05-29T11:57:11.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:57:11.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:57:11.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:57:11.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981273.047645s, valid=True
2026-05-29T11:57:11.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:57:11.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:57:11.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:57:11.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:57:11.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:57:11.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:57:11.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:57:11.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:57:11.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:57:11.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:57:11.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:57:11.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:57:11.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:57:11.365 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:57:11.572 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:57:11.913 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:57:12.070 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:57:12.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:57:12.070 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:57:12.070 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:57:12.324 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:57:12.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:57:42.354 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:57:42.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:57:42.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:57:42.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:57:42.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:57:43.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:57:43.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-05-29T11:57:43.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:57:43.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-05-29T11:57:43.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:57:43.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:57:43.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:57:43.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-05-29T11:57:46.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-05-29T11:57:46.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:57:46.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:57:46.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:57:46.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:57:46.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:57:46.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:57:46.060 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:57:46.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:57:46.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:57:46.061 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:57:46.061 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:57:46.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:57:46.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T11:57:46.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:57:46.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T11:57:46.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:57:46.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:57:46.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:57:46.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:57:46.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:57:46.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:57:46.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:57:46.314 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:57:46.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:57:19
2026-05-29T11:57:46.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71775, datetime.datetime(2026, 5, 29, 11, 57, 19), datetime.datetime(2026, 5, 29, 11, 57, 18), 'salt', 12.24, 59.62, None, 17.08, 45.47, 7.62, 833.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:57:46.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:57:46.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T11:57:46.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:57:18, diff=28.386755s, valid=True
2026-05-29T11:57:46.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:57:46.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:57:46.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:57:12, diff=34.389965s, valid=True
2026-05-29T11:57:46.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:57:46.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T11:57:46.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:57:16, diff=30.397239s, valid=True
2026-05-29T11:57:46.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:57:46.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:57:46.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:57:46.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:57:46.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:57:46.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:57:46.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:57:12, diff=34.400544s, valid=True
2026-05-29T11:57:46.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:57:46.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:57:46.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:57:46.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981308.40128s, valid=True
2026-05-29T11:57:46.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:57:46.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:57:46.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:57:46.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:57:46.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:57:46.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:57:46.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:57:46.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:57:46.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:57:46.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:57:46.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:57:46.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:57:46.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:57:46.719 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:57:46.928 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:57:47.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:57:47.368 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:57:47.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:57:47.368 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:57:47.368 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:57:47.535 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:57:47.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:58:17.566 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:58:17.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:58:17.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:58:17.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:58:18.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:58:18.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:58:18.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-05-29T11:58:18.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:58:18.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-05-29T11:58:18.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:58:18.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:58:18.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:58:18.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-05-29T11:58:20.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-05-29T11:58:20.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:58:20.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:58:20.890 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:58:20.890 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:58:20.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:58:20.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:58:20.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:58:20.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:58:20.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:58:20.910 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:58:20.910 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:58:20.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:58:20.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:58:20.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:58:21.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:58:21.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:58:21.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:58:21.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:58:21.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:58:21.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:58:21.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:58:21.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:58:21.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:58:21.224 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:58:19
2026-05-29T11:58:21.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71777, datetime.datetime(2026, 5, 29, 11, 58, 19), datetime.datetime(2026, 5, 29, 11, 58, 19), 'salt', 12.44, 59.82, None, 19.05, 45.17, 7.58, 833.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:58:21.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:58:21.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:58:21.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:58:19, diff=2.230935s, valid=True
2026-05-29T11:58:21.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:58:21.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:58:21.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:58:12, diff=9.233782s, valid=True
2026-05-29T11:58:21.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:58:21.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:58:21.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:58:19, diff=2.240521s, valid=True
2026-05-29T11:58:21.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:58:21.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:58:21.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:58:21.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:58:21.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:58:21.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:58:21.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:58:12, diff=9.243594s, valid=True
2026-05-29T11:58:21.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:58:21.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:58:21.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:58:21.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981343.244258s, valid=True
2026-05-29T11:58:21.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:58:21.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:58:21.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:58:21.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:58:21.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:58:21.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:58:21.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:58:21.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:58:21.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:58:21.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:58:21.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:58:21.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:58:21.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:58:21.561 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:58:21.853 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:58:22.195 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:58:22.294 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:58:22.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:58: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-05-29T11:58:22.295 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:58:22.464 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:58:22.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:58:52.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:58:52.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:58:52.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:58:53.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:58:53.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:58:53.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:58:53.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-05-29T11:58:53.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:58:53.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-05-29T11:58:53.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:58:53.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:58:53.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:58:53.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-05-29T11:58:56.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-05-29T11:58:56.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:58:56.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:58:56.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:58:56.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:58:56.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:58:56.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:58:56.575 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:58:56.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:58:56.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:58:56.576 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:58:56.576 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:58:56.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:58:56.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:58:56.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:58:56.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:58:56.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:58:56.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:58:56.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:58:56.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T11:58:56.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:58:56.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:58:56.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:58:56.839 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:58:56.896 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:58:50
2026-05-29T11:58:56.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71778, datetime.datetime(2026, 5, 29, 11, 58, 50), datetime.datetime(2026, 5, 29, 11, 58, 49), 'salt', 12.34, 58.53, None, 18.31, 57.74, 7.89, 833.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:58:56.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:58:56.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:58:56.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:58:49, diff=7.903327s, valid=True
2026-05-29T11:58:56.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:58:56.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:58:56.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:59:12, diff=-15.093811s, valid=True
2026-05-29T11:58:56.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:58:56.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:58:56.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:58:44, diff=12.913232s, valid=True
2026-05-29T11:58:56.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:58:56.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:58:56.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:58:56.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:58:56.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:58:56.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T11:58:56.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:59:12, diff=-15.083674s, valid=True
2026-05-29T11:58:56.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:58:56.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:58:56.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:58:56.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981378.917034s, valid=True
2026-05-29T11:58:56.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:58:56.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:58:56.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:58:56.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:58:56.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:58:56.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:58:56.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:58:56.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:58:56.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:58:57.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:58:57.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:58:57.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:58:57.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:58:57.246 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:58:57.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:58:57.912 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:58:58.016 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:58:58.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:58:58.016 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:58:58.016 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:58:58.187 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:58:58.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T11:59:28.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T11:59:28.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T11:59:28.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T11:59:28.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T11:59:28.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T11:59:28.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T11:59:28.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-05-29T11:59:28.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T11:59:28.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-05-29T11:59:28.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T11:59:28.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T11:59:28.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T11:59:28.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T11:59:31.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-05-29T11:59:31.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T11:59:31.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T11:59:31.821 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T11:59:31.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T11:59:31.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T11:59:31.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T11:59:31.845 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T11:59:31.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T11:59:31.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T11:59:31.845 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T11:59:31.845 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T11:59:31.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T11:59:31.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T11:59:31.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T11:59:32.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T11:59:32.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:59:32.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:59:32.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T11:59:32.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T11:59:32.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T11:59:32.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T11:59:32.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T11:59:32.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T11:59:32.167 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:59:20
2026-05-29T11:59:32.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71779, datetime.datetime(2026, 5, 29, 11, 59, 20), datetime.datetime(2026, 5, 29, 11, 59, 19), 'salt', 12.14, 57.23, None, 17.36, 40.97, 8.19, 833.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T11:59:32.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T11:59:32.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T11:59:32.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:59:19, diff=13.173252s, valid=True
2026-05-29T11:59:32.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T11:59:32.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:59:32.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:59:12, diff=20.176137s, valid=True
2026-05-29T11:59:32.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T11:59:32.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T11:59:32.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:59:15, diff=17.182826s, valid=True
2026-05-29T11:59:32.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T11:59:32.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:59:32.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T11:59:32.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T11:59:32.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T11:59:32.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T11:59:32.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:59:12, diff=20.185867s, valid=True
2026-05-29T11:59:32.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T11:59:32.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T11:59:32.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T11:59:32.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981414.186531s, valid=True
2026-05-29T11:59:32.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T11:59:32.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T11:59:32.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T11:59:32.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T11:59:32.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T11:59:32.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T11:59:32.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T11:59:32.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T11:59:32.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T11:59:32.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T11:59:32.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T11:59:32.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T11:59:32.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T11:59:32.581 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T11:59:32.794 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:59:33.147 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T11:59:33.248 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T11:59:33.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T11:59:33.248 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T11:59:33.248 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T11:59:33.420 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T11:59:33.420 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:00:03.422 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:00:03.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:00:03.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:00:03.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:00:03.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:00:03.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:00:03.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-05-29T12:00:03.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:00:03.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-05-29T12:00:03.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:00:03.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:00:03.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:00:03.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-05-29T12:00:06.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-05-29T12:00:06.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:00:06.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:00:06.519 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:00:06.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:00:06.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:00:06.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:00:06.540 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:00:06.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:00:06.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:00:06.541 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:00:06.541 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:00:06.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:00:06.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:00:06.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:00:06.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:00:06.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:00:06.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:00:06.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:00:06.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:00:06.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:00:06.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:00:06.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:00:06.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:00:06.855 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 11:59:50
2026-05-29T12:00:06.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71780, datetime.datetime(2026, 5, 29, 11, 59, 50), datetime.datetime(2026, 5, 29, 11, 59, 50), 'salt', 11.88, 58.79, None, 21.31, 53.1, 7.8, 833.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:00:06.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:00:06.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:00:06.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:59:50, diff=16.861757s, valid=True
2026-05-29T12:00:06.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:00:06.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:00:06.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:00:12, diff=-5.135452s, valid=True
2026-05-29T12:00:06.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:00:06.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:00:06.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 11:59:45, diff=21.871063s, valid=True
2026-05-29T12:00:06.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:00:06.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:00:06.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:00:06.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:00:06.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:00:06.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:00:06.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:00:12, diff=-5.125919s, valid=True
2026-05-29T12:00:06.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:00:06.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:00:06.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:00:06.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981448.874756s, valid=True
2026-05-29T12:00:06.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:00:06.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:00:06.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:00:06.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:00:06.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:00:06.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:00:06.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:00:06.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:00:06.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:00:07.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:00:07.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:00:07.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:00:07.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:00:07.193 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:00:07.404 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:00:07.750 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:00:07.852 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:00:07.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:00:07.852 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:00:07.852 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:00:08.072 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:00:08.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:00:38.102 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:00:38.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:00:38.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:00:38.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:00:38.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:00:38.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:00:38.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-05-29T12:00:38.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:00:38.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-05-29T12:00:38.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:00:38.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:00:38.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:00:38.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-05-29T12:00:41.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-05-29T12:00:41.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:00:41.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:00:41.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:00:41.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:00:41.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:00:41.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:00:41.445 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:00:41.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:00:41.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:00:41.446 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:00:41.446 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:00:41.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:00:41.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:00:41.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:00:41.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:00:41.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:00:41.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:00:41.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:00:41.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:00:41.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:00:41.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:00:41.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:00:41.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:00:41.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:00:20
2026-05-29T12:00:41.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71781, datetime.datetime(2026, 5, 29, 12, 0, 20), datetime.datetime(2026, 5, 29, 12, 0, 20), 'salt', 12.07, 60.02, None, 18.38, 55.49, 7.51, 833.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:00:41.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:00:41.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:00:41.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:00:20, diff=21.790562s, valid=True
2026-05-29T12:00:41.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:00:41.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:00:41.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:00:12, diff=29.79343s, valid=True
2026-05-29T12:00:41.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:00:41.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:00:41.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:00:15, diff=26.800089s, valid=True
2026-05-29T12:00:41.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:00:41.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:00:41.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:00:41.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:00:41.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:00:41.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:00:41.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:00:12, diff=29.803115s, valid=True
2026-05-29T12:00:41.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:00:41.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:00:41.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:00:41.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981483.803774s, valid=True
2026-05-29T12:00:41.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:00:41.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:00:41.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:00:41.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:00:41.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:00:41.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:00:41.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:00:41.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:00:41.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:00:41.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:00:42.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:00:42.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:00:42.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:00:42.206 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:00:42.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:00:42.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:00:42.876 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:00:42.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:00:42.877 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:00:42.877 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:00:43.041 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:00:43.041 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:01:13.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:01:13.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:01:13.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:01:13.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:01:13.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:01:13.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:01:13.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T12:01:13.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:01:13.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-05-29T12:01:13.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:01:13.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:01:13.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:01:13.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-05-29T12:01:16.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-05-29T12:01:16.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:01:16.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:01:16.467 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:01:16.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:01:16.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:01:16.492 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:01:16.492 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:01:16.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:01:16.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:01:16.493 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:01:16.493 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:01:16.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:01:16.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:01:16.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:01:16.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:01:16.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:01:16.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:01:16.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:01:16.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:01:16.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:01:16.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:01:16.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:01:16.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:01:16.818 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:00:50
2026-05-29T12:01:16.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71782, datetime.datetime(2026, 5, 29, 12, 0, 50), datetime.datetime(2026, 5, 29, 12, 0, 50), 'salt', 11.91, 58.19, None, 13.27, 68.11, 7.94, 833.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:01:16.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:01:16.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:01:16.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:00:50, diff=26.824412s, valid=True
2026-05-29T12:01:16.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:01:16.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:01:16.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:01:12, diff=4.827279s, valid=True
2026-05-29T12:01:16.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:01:16.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:01:16.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:00:46, diff=30.833978s, valid=True
2026-05-29T12:01:16.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:01:16.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:01:16.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:01:16.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:01:16.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:01:16.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:01:16.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:01:12, diff=4.837021s, valid=True
2026-05-29T12:01:16.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:01:16.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:01:16.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:01:16.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981518.837685s, valid=True
2026-05-29T12:01:16.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:01:16.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:01:16.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:01:16.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:01:16.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:01:16.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:01:16.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:01:16.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:01:16.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:01:16.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:01:17.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:01:17.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:01:17.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:01:17.154 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:01:17.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:01:17.702 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:01:17.803 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:01:17.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:01:17.803 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:01:17.803 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:01:17.970 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:01:17.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:01:47.986 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:01:47.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:01:47.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:01:48.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:01:48.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:01:48.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:01:48.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-05-29T12:01:48.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:01:48.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-05-29T12:01:48.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:01:48.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:01:48.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:01:48.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-05-29T12:01:51.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-05-29T12:01:51.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:01:51.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:01:51.253 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:01:51.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:01:51.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:01:51.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:01:51.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:01:51.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:01:51.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:01:51.273 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:01:51.273 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:01:51.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:01:51.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:01:51.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:01:51.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:01:51.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:01:51.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:01:51.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:01:51.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:01:51.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:01:51.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:01:51.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:01:51.552 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:01:51.616 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:01:51
2026-05-29T12:01:51.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71784, datetime.datetime(2026, 5, 29, 12, 1, 51), datetime.datetime(2026, 5, 29, 12, 1, 50), 'salt', 12.01, 59.52, None, 14.29, 56.08, 7.63, 833.32, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:01:51.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:01:51.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:01:51.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:01:50, diff=1.624317s, valid=True
2026-05-29T12:01:51.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:01:51.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:01:51.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:02:12, diff=-20.372307s, valid=True
2026-05-29T12:01:51.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:01:51.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:01:51.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:01:49, diff=2.635312s, valid=True
2026-05-29T12:01:51.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:01:51.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:01:51.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:01:51.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:01:51.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:01:51.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:01:51.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:02:12, diff=-20.361167s, valid=True
2026-05-29T12:01:51.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:01:51.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:01:51.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:01:51.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981553.640131s, valid=True
2026-05-29T12:01:51.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:01:51.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:01:51.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:01:51.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:01:51.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:01:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:01:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:01:51.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:01:51.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:01:51.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:01:51.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:01:51.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:01:51.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:01:52.029 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:01:52.238 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:01:52.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:01:52.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:01:52.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:01:52.680 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:01:52.680 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:01:52.853 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:01:52.853 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:02:22.883 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:02:22.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:02:22.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:02:23.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:02:23.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:02:23.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:02:23.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-05-29T12:02:23.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:02:23.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-05-29T12:02:23.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:02:23.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:02:23.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:02:23.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-05-29T12:02: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-05-29T12:02:27.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:02:27.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:02:27.096 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:02:27.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:02:27.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:02:27.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:02:27.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:02:27.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:02:27.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:02:27.116 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:02:27.116 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:02:27.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:02:27.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:02:27.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:02:27.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:02:27.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:02:27.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:02:27.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:02:27.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:02:27.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:02:27.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:02:27.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:02:27.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:02:27.433 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:02:21
2026-05-29T12:02:27.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71785, datetime.datetime(2026, 5, 29, 12, 2, 21), datetime.datetime(2026, 5, 29, 12, 2, 21), 'salt', 11.64, 59.26, None, 15.67, 47.54, 7.67, 833.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:02:27.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:02:27.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:02:27.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:02:21, diff=6.439145s, valid=True
2026-05-29T12:02:27.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:02:27.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:02:27.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:02:12, diff=15.441976s, valid=True
2026-05-29T12:02:27.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:02:27.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:02:27.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:02:20, diff=7.448546s, valid=True
2026-05-29T12:02:27.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:02:27.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:02:27.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:02:27.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:02:27.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:02:27.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:02:27.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:02:12, diff=15.451578s, valid=True
2026-05-29T12:02:27.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:02:27.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:02:27.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:02:27.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981589.452229s, valid=True
2026-05-29T12:02:27.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:02:27.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:02:27.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:02:27.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:02:27.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:02:27.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:02:27.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:02:27.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:02:27.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:02:27.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:02:27.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:02:27.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:02:27.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:02:27.771 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:02:27.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:02:28.329 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:02:28.431 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:02:28.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:02:28.431 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:02:28.431 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:02:28.689 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:02:28.689 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:02:58.719 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:02:58.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:02:58.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:02:58.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:02:58.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:02:59.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:02:59.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-05-29T12:02:59.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:02:59.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-05-29T12:02:59.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:02:59.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:02:59.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:02:59.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-05-29T12:03:02.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-05-29T12:03:02.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:03:02.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:03:02.081 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:03:02.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:03:02.090 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:03:02.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:03:02.102 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:03:02.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:03:02.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:03:02.102 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:03:02.103 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:03:02.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:03:02.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:03:02.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:03:02.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:03:02.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:03:02.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:03:02.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:03:02.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:03:02.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:03:02.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:03:02.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:03:02.373 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:03:02.435 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:02:51
2026-05-29T12:03:02.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71786, datetime.datetime(2026, 5, 29, 12, 2, 51), datetime.datetime(2026, 5, 29, 12, 2, 51), 'salt', 11.78, 60.78, None, 15.32, 59.12, 7.32, 833.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:03:02.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:03:02.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:03:02.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:02:51, diff=11.441638s, valid=True
2026-05-29T12:03:02.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:03:02.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:03:02.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:03:12, diff=-9.555522s, valid=True
2026-05-29T12:03:02.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:03:02.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:03:02.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:02:46, diff=16.451643s, valid=True
2026-05-29T12:03:02.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:03:02.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:03:02.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:03:02.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:03:02.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:03:02.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:03:02.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:03:12, diff=-9.545338s, valid=True
2026-05-29T12:03:02.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:03:02.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:03:02.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:03:02.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981624.455303s, valid=True
2026-05-29T12:03:02.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:03:02.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:03:02.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:03:02.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:03:02.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:03:02.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:03:02.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:03:02.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:03:02.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:03:02.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:03:02.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:03:02.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:03:02.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:03:02.780 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:03:02.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:03:03.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:03:03.483 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:03:03.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:03:03.483 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:03:03.483 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:03:03.679 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:03:03.679 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:03:33.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:03:33.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:03:33.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:03:33.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:03:33.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:03:34.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:03:34.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-05-29T12:03:34.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:03:34.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-05-29T12:03:34.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:03:34.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:03:34.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:03:34.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-05-29T12:03:37.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-05-29T12:03:37.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:03:37.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:03:37.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:03:37.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:03:37.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:03:37.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:03:37.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:03:37.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:03:37.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:03:37.775 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:03:37.775 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:03:37.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:03:37.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:03:37.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:03:37.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:03:37.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:03:37.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:03:37.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:03:38.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:03:38.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:03:38.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:03:38.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:03:38.049 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:03:38.113 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:03:21
2026-05-29T12:03:38.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71787, datetime.datetime(2026, 5, 29, 12, 3, 21), datetime.datetime(2026, 5, 29, 12, 3, 21), 'salt', 11.94, 62.37, None, 16.83, 50.35, 6.95, 833.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:03:38.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:03:38.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:03:38.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:03:21, diff=17.120115s, valid=True
2026-05-29T12:03:38.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:03:38.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:03:38.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:03:12, diff=26.123009s, valid=True
2026-05-29T12:03:38.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:03:38.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:03:38.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:03:17, diff=21.130374s, valid=True
2026-05-29T12:03:38.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:03:38.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:03:38.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:03:38.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:03:38.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:03:38.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:03:38.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:03:12, diff=26.13349s, valid=True
2026-05-29T12:03:38.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:03:38.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:03:38.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:03:38.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981660.134168s, valid=True
2026-05-29T12:03:38.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:03:38.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:03:38.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:03:38.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:03:38.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:03:38.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:03:38.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:03:38.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:03:38.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:03:38.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:03:38.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:03:38.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:03:38.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:03:38.463 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:03:38.677 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:03:39.041 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:03:39.208 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:03:39.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:03:39.209 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:03:39.209 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:03:39.405 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:03:39.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:04:09.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:04:09.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:04:09.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:04:10.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:04:10.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:04:10.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:04:10.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-05-29T12:04:10.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:04:10.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-05-29T12:04:10.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:04:10.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:04:10.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:04:10.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-05-29T12:04:13.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-05-29T12:04:13.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:04:13.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:04:13.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:04:13.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:04:13.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:04:13.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:04:13.078 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:04:13.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:04:13.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:04:13.078 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:04:13.078 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:04:13.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:04:13.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:04:13.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:04:13.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:04:13.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:04:13.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:04:13.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:04:13.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:04:13.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:04:13.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:04:13.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:04:13.348 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:04:13.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:03:52
2026-05-29T12:04:13.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71788, datetime.datetime(2026, 5, 29, 12, 3, 52), datetime.datetime(2026, 5, 29, 12, 3, 51), 'salt', 12.27, 58.99, None, 19.87, 45.33, 7.77, 833.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:04:13.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:04:13.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:04:13.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:03:51, diff=22.415154s, valid=True
2026-05-29T12:04:13.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:04:13.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:04:13.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:04:12, diff=1.418129s, valid=True
2026-05-29T12:04:13.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:04:13.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:04:13.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:03:47, diff=26.424951s, valid=True
2026-05-29T12:04:13.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:04:13.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:04:13.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:04:13.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:04:13.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:04:13.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:04:13.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:04:12, diff=1.428042s, valid=True
2026-05-29T12:04:13.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:04:13.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:04:13.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:04:13.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981695.428738s, valid=True
2026-05-29T12:04:13.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:04:13.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:04:13.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:04:13.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:04:13.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:04:13.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:04:13.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:04:13.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:04:13.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:04:13.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:04:13.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:04:13.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:04:13.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:04:13.748 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:04:13.959 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:04:14.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:04:14.406 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:04:14.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:04:14.406 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:04:14.406 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:04:14.661 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:04:14.661 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:04:44.690 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:04:44.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:04:44.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:04:45.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:04:45.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:04:45.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:04:45.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-05-29T12:04:45.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:04:45.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-05-29T12:04:45.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:04:45.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:04:45.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:04:45.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-05-29T12:04:48.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-05-29T12:04:48.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:04:48.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:04:48.479 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:04:48.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:04:48.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:04:48.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:04:48.498 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:04:48.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:04:48.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:04:48.499 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:04:48.499 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:04:48.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:04:48.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:04:48.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:04:48.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:04:48.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:04:48.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:04:48.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:04:48.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:04:48.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:04:48.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:04:48.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:04:48.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:04:48.812 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:04:22
2026-05-29T12:04:48.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71789, datetime.datetime(2026, 5, 29, 12, 4, 22), datetime.datetime(2026, 5, 29, 12, 4, 22), 'salt', 12.17, 58.0, None, 21.49, 46.69, 8.0, 833.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:04:48.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:04:48.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:04:48.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:04:22, diff=26.818965s, valid=True
2026-05-29T12:04:48.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:04:48.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:04:48.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:04:12, diff=36.821854s, valid=True
2026-05-29T12:04:48.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:04:48.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:04:48.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:04:17, diff=31.828553s, valid=True
2026-05-29T12:04:48.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:04:48.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:04:48.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:04:48.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:04:48.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:04:48.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:04:48.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:04:12, diff=36.831637s, valid=True
2026-05-29T12:04:48.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:04:48.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:04:48.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:04:48.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981730.832294s, valid=True
2026-05-29T12:04:48.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:04:48.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:04:48.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:04:48.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:04:48.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:04:48.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:04:48.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:04:48.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:04:48.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:04:48.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:04:49.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:04:49.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:04:49.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:04:49.160 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:04:49.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:04:49.802 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:04:49.915 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:04:49.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:04:49.916 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:04:49.916 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:04:50.082 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:04:50.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:05:20.111 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:05:20.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:05:20.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:05:20.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:05:20.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:05:20.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:05:20.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-05-29T12:05:20.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:05:20.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-05-29T12:05:20.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:05:20.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:05:20.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:05:20.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-05-29T12:05:23.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-05-29T12:05:23.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:05:23.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:05:23.605 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:05:23.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:05:23.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:05:23.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:05:23.625 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:05:23.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:05:23.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:05:23.626 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:05:23.626 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:05:23.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:05:23.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:05:23.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:05:23.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:05:23.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:05:23.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:05:23.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:05:23.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:05:23.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:05:23.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:05:23.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:05:23.887 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:05:23.946 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:05:22
2026-05-29T12:05:23.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71791, datetime.datetime(2026, 5, 29, 12, 5, 22), datetime.datetime(2026, 5, 29, 12, 5, 22), 'salt', 12.5, 56.97, None, 21.07, 40.19, 8.28, 833.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:05:23.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:05:23.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:05:23.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:05:22, diff=1.952231s, valid=True
2026-05-29T12:05:23.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:05:23.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:05:23.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:05:12, diff=11.955821s, valid=True
2026-05-29T12:05:23.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:05:23.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:05:23.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:05:18, diff=5.963882s, valid=True
2026-05-29T12:05:23.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:05:23.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:05:23.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:05:23.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:05:23.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:05:23.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:05:23.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:05:12, diff=11.966912s, valid=True
2026-05-29T12:05:23.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:05:23.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:05:23.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:05:23.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981765.967571s, valid=True
2026-05-29T12:05:23.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:05:23.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:05:23.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:05:23.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:05:23.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:05:24.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:05:24.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:05:24.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:05:24.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:05:24.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:05:24.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:05:24.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:05:24.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:05:24.299 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:05:24.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:05:24.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:05:24.986 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:05:24.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:05:24.986 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:05:24.986 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:05:25.267 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:05:25.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:05:55.273 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:05:55.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:05:55.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:05:55.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:05:55.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:05:56.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:05:56.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-05-29T12:05:56.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:05:56.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-05-29T12:05:56.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:05:56.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:05:56.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:05:56.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-05-29T12:05:58.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-05-29T12:05:58.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:05:58.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:05:58.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:05:58.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:05:58.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:05:58.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:05:58.786 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:05:58.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:05:58.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:05:58.787 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:05:58.787 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:05:58.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:05:58.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:05:58.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:05:58.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:05:58.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:05:59.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:05:59.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:05:59.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:05:59.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:05:59.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:05:59.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:05:59.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:05:59.113 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:05:53
2026-05-29T12:05:59.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71792, datetime.datetime(2026, 5, 29, 12, 5, 53), datetime.datetime(2026, 5, 29, 12, 5, 52), 'salt', 12.7, 57.1, None, 20.29, 55.14, 8.26, 833.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:05:59.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:05:59.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:05:59.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:05:52, diff=7.119687s, valid=True
2026-05-29T12:05:59.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:05:59.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:05:59.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:12, diff=-12.877411s, valid=True
2026-05-29T12:05:59.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:05:59.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:05:59.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:05:50, diff=9.129472s, valid=True
2026-05-29T12:05:59.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:05:59.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:05:59.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:05:59.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:05:59.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:05:59.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:05:59.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:12, diff=-12.867413s, valid=True
2026-05-29T12:05:59.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:05:59.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:05:59.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:05:59.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981801.133254s, valid=True
2026-05-29T12:05:59.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:05:59.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:05:59.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:05:59.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:05:59.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:05:59.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:05:59.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:05:59.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:05:59.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:05:59.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:05:59.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:05:59.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:05:59.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:05:59.540 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:05:59.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:06:00.119 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:06:00.227 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:06:00.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:06:00.227 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:06:00.228 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:06:00.378 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:06:00.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:06:30.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:06:30.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:06:30.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:06:30.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:06:30.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:06:30.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:06: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-05-29T12:06:30.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:06:30.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-05-29T12:06:30.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:06:30.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:06:30.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:06:30.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-05-29T12:06:33.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-05-29T12:06:33.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:06:33.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:06:33.574 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:06:33.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:06:33.582 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:06:33.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:06:33.594 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:06:33.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:06:33.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:06:33.594 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:06:33.594 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:06:33.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:06:33.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:06:33.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:06:33.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:06:33.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:06:33.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:06:33.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:06:33.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:06:33.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:06:33.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:06:33.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:06:33.857 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:06:33.918 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:06:33
2026-05-29T12:06:33.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71793, datetime.datetime(2026, 5, 29, 12, 6, 33), datetime.datetime(2026, 5, 29, 12, 6, 22), 'salt', 12.64, 56.3, None, 16.69, 34.98, 8.46, 833.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:06:33.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:06:33.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:06:33.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:22, diff=11.925823s, valid=True
2026-05-29T12:06:33.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:06:33.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:06:33.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:12, diff=21.929016s, valid=True
2026-05-29T12:06:33.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:06:33.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:06:33.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:21, diff=12.936243s, valid=True
2026-05-29T12:06:33.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:06:33.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:06:33.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:06:33.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:06:33.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:06:33.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:06:33.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:12, diff=21.942104s, valid=True
2026-05-29T12:06:33.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:06:33.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:06:33.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:06:33.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981835.942866s, valid=True
2026-05-29T12:06:33.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:06:33.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:06:33.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:06:33.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:06:33.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:06:34.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:06:34.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:06:34.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:06:34.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:06:34.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:06:34.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:06:34.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:06:34.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:06:34.289 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:06:34.553 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:06:34.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:06:35.055 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:06:35.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:06:35.055 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:06:35.055 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:06:35.321 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:06:35.321 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:07:05.328 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:07:05.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:07:05.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:07:05.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:07:05.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:07:05.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:07:05.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-05-29T12:07:05.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:07:05.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-05-29T12:07:05.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:07:05.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:07:05.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:07:05.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-05-29T12:07:08.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-05-29T12:07:08.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:07:08.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:07:08.338 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:07:08.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:07:08.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:07:08.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:07:08.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:07:08.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:07:08.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:07:08.360 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:07:08.360 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:07:08.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:07:08.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:07:08.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:07:08.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:07:08.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:07:08.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:07:08.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:07:08.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:07:08.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:07:08.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:07:08.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:07:08.621 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:07:08.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:07:03
2026-05-29T12:07:08.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71794, datetime.datetime(2026, 5, 29, 12, 7, 3), datetime.datetime(2026, 5, 29, 12, 7, 3), 'salt', 12.84, 56.77, None, 20.01, 44.84, 8.36, 833.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:07:08.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:07:08.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:07:08.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:07:03, diff=5.685931s, valid=True
2026-05-29T12:07:08.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:07:08.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:07:08.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:12, diff=56.68882s, valid=True
2026-05-29T12:07:08.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:07:08.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:07:08.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:59, diff=9.695392s, valid=True
2026-05-29T12:07:08.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:07:08.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:07:08.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:07:08.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:07:08.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:07:08.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:07:08.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:12, diff=56.698411s, valid=True
2026-05-29T12:07:08.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:07:08.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:07:08.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:07:08.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981870.69907s, valid=True
2026-05-29T12:07:08.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:07:08.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:07:08.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:07:08.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:07:08.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:07:08.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:07:08.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:07:08.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:07:08.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:07:08.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:07:08.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:07:08.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:07:09.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:07:09.082 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:07:09.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:07:09.632 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:07:09.732 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:07:09.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:07:09.732 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:07:09.732 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:07:09.990 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:07:09.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:07:40.019 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:07:40.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:07:40.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:07:40.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:07:40.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:07:40.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:07: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-05-29T12:07:40.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:07:40.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-05-29T12:07:40.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:07:40.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:07:40.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:07:40.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-05-29T12:07:44.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-05-29T12:07:44.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:07:44.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:07:44.254 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:07:44.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:07:44.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:07:44.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:07:44.276 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:07:44.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:07:44.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:07:44.276 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:07:44.276 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:07:44.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:07:44.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:07:44.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:07:44.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:07:44.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:07:44.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T12:07:44.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:07:44.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T12:07:44.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:07:44.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:07:44.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:07:44.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:07:44.603 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:07:33
2026-05-29T12:07:44.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71795, datetime.datetime(2026, 5, 29, 12, 7, 33), datetime.datetime(2026, 5, 29, 12, 7, 33), 'salt', 12.64, 55.64, None, 16.59, 59.31, 8.63, 833.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:07:44.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:07:44.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:07:44.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:07:33, diff=11.609878s, valid=True
2026-05-29T12:07:44.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:07:44.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T12:07:44.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:12, diff=92.612736s, valid=True
2026-05-29T12:07:44.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:07:44.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:07:44.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:07:29, diff=15.619455s, valid=True
2026-05-29T12:07:44.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:07:44.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:07:44.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:07:44.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:07:44.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:07:44.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T12:07:44.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:12, diff=92.622482s, valid=True
2026-05-29T12:07:44.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:07:44.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:07:44.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:07:44.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981906.623149s, valid=True
2026-05-29T12:07:44.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:07:44.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:07:44.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:07:44.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:07:44.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:07:44.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:07:44.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:07:44.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:07:44.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:07:44.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:07:44.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:07:44.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:07:44.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:07:44.946 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:07:45.159 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:07:45.511 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:07:45.613 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:07:45.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:07:45.613 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:07:45.613 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:07:45.845 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:07:45.845 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:08:15.847 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:08:15.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:08:15.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:08:16.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:08:16.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:08:16.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:08:16.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-05-29T12:08:16.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:08:16.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-05-29T12:08:16.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:08:16.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:08:16.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:08:16.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-05-29T12:08:19.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-05-29T12:08:19.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:08:19.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:08:19.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:08:19.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:08:19.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:08:19.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:08:19.253 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:08:19.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:08:19.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:08:19.254 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:08:19.254 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:08:19.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:08:19.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:08:19.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:08:19.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:08:19.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:08:19.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T12:08:19.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:08:19.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T12:08:19.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:08:19.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:08:19.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:08:19.512 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:08:19.571 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:08:03
2026-05-29T12:08:19.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71796, datetime.datetime(2026, 5, 29, 12, 8, 3), datetime.datetime(2026, 5, 29, 12, 8, 3), 'salt', 12.44, 57.26, None, 16.2, 49.97, 8.21, 833.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:08:19.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:08:19.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:08:19.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:08:03, diff=16.578064s, valid=True
2026-05-29T12:08:19.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:08:19.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T12:08:19.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:12, diff=127.580954s, valid=True
2026-05-29T12:08:19.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:08:19.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:08:19.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:07:59, diff=20.587564s, valid=True
2026-05-29T12:08:19.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:08:19.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:08:19.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:08:19.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:08:19.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:08:19.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T12:08:19.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:12, diff=127.590575s, valid=True
2026-05-29T12:08:19.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:08:19.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:08:19.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:08:19.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981941.591237s, valid=True
2026-05-29T12:08:19.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:08:19.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:08:19.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:08:19.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:08:19.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:08:19.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:08:19.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:08:19.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:08:19.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:08:19.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:08:19.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:08:19.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:08:19.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:08:20.011 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:08:20.232 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:08:20.582 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:08:20.682 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:08:20.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:08:20.682 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:08: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-05-29T12:08:20.937 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:08:20.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:08:50.967 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:08:50.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:08:50.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:08:51.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:08:51.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:08:51.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:08:51.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-05-29T12:08:51.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:08:51.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-05-29T12:08:51.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:08:51.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:08:51.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:08:51.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-05-29T12:08:54.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-05-29T12:08:54.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:08:54.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:08:54.398 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:08:54.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:08:54.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:08:54.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:08:54.419 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:08:54.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:08:54.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:08:54.419 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:08:54.419 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:08:54.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:08:54.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:08:54.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:08:54.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:08:54.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:08:54.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T12:08:54.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:08:54.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T12:08:54.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:08:54.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:08:54.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:08:54.670 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:08:54.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:08:34
2026-05-29T12:08:54.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71797, datetime.datetime(2026, 5, 29, 12, 8, 34), datetime.datetime(2026, 5, 29, 12, 8, 33), 'salt', 12.17, 57.3, None, 20.92, 57.65, 8.18, 833.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:08:54.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:08:54.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:08:54.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:08:33, diff=21.735118s, valid=True
2026-05-29T12:08:54.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:08:54.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T12:08:54.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:12, diff=162.737969s, valid=True
2026-05-29T12:08:54.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:08:54.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:08:54.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:08:29, diff=25.744634s, valid=True
2026-05-29T12:08:54.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:08:54.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:08:54.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:08:54.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:08:54.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:08:54.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T12:08:54.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:12, diff=162.747762s, valid=True
2026-05-29T12:08:54.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:08:54.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:08:54.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:08:54.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=981976.748432s, valid=True
2026-05-29T12:08:54.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:08:54.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:08:54.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:08:54.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:08:54.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:08:54.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:08:54.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:08:54.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:08:54.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:08:54.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:08:54.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:08:54.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:08:55.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:08:55.064 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:08:55.272 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:08:55.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:08:55.711 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:08:55.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:08:55.712 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:08:55.712 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:08:55.965 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:08:55.965 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:09:25.984 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:09:25.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:09:25.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:09:26.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:09:26.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:09:26.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:09:26.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-05-29T12:09:26.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:09:26.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-05-29T12:09:26.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:09:26.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:09:26.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:09:26.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-05-29T12:09:29.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-05-29T12:09:29.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:09:29.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:09:29.459 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:09:29.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:09:29.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:09:29.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:09:29.479 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:09:29.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:09:29.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:09:29.479 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:09:29.480 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:09:29.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:09:29.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:09:29.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:09:29.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:09:29.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:09:29.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T12:09:29.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:09:29.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T12:09:29.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:09:29.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:09:29.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:09:29.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:09:29.807 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:09:04
2026-05-29T12:09:29.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71798, datetime.datetime(2026, 5, 29, 12, 9, 4), datetime.datetime(2026, 5, 29, 12, 9, 3), 'salt', 12.07, 58.39, None, 17.54, 37.66, 7.9, 833.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:09:29.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:09:29.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:09:29.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:09:03, diff=26.813633s, valid=True
2026-05-29T12:09:29.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:09:29.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T12:09:29.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:12, diff=197.817559s, valid=True
2026-05-29T12:09:29.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:09:29.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:09:29.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:09:00, diff=29.825928s, valid=True
2026-05-29T12:09:29.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:09:29.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:09:29.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:09:29.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:09:29.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:09:29.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T12:09:29.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:06:12, diff=197.82986s, valid=True
2026-05-29T12:09:29.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:09:29.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:09:29.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:09:29.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982011.830565s, valid=True
2026-05-29T12:09:29.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:09:29.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:09:29.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:09:29.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:09:29.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:09:29.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:09:29.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:09:29.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:09:29.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:09:29.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:09:30.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:09:30.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:09:30.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:09:30.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:09:30.416 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:09:30.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:09:30.874 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:09:30.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:09:30.875 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:09:30.875 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:09:31.131 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:09:31.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:10:01.161 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:10:01.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:10:01.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:10:01.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:10:01.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:10:01.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:10:01.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-05-29T12:10:01.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:10: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-05-29T12:10:01.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:10:01.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:10:01.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:10:01.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T12:10:04.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-05-29T12:10:04.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:10:04.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:10:04.224 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:10:04.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:10:04.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:10:04.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:10:04.245 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:10:04.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:10:04.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:10:04.245 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:10:04.245 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:10:04.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:10:04.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:10:04.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:10:04.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:10:04.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:10:04.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T12:10:04.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:10:04.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T12:10:04.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:10:04.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:10:04.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:10:04.502 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:10:04.562 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:09:34
2026-05-29T12:10:04.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71799, datetime.datetime(2026, 5, 29, 12, 9, 34), datetime.datetime(2026, 5, 29, 12, 9, 34), 'salt', 12.37, 59.88, None, 14.72, 35.31, 7.56, 833.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:10:04.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:10:04.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:10:04.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:10:04, diff=0.569057s, valid=True
2026-05-29T12:10:04.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:10:04.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T12:10:04.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:10:12, diff=-7.428067s, valid=True
2026-05-29T12:10:04.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:10:04.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:10:04.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:10:01, diff=3.578589s, valid=True
2026-05-29T12:10:04.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:10:04.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:10:04.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:10:04.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:10:04.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:10:04.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T12:10:04.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:10:12, diff=-7.418362s, valid=True
2026-05-29T12:10:04.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:10:04.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:10:04.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:10:04.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982046.582301s, valid=True
2026-05-29T12:10:04.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:10:04.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:10:04.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:10:04.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:10:04.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:10:04.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:10:04.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:10:04.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:10:04.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:10:04.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:10:04.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:10:04.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:10:04.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:10:04.902 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:10:05.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:10:05.461 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:10:05.627 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:10:05.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:10:05.627 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:10:05.627 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:10:05.874 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:10:05.874 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:10:35.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:10:35.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:10:35.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:10:36.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:10:36.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:10:36.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:10:36.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-05-29T12:10:36.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:10:36.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-05-29T12:10:36.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:10:36.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:10:36.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:10:36.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T12:10:39.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-05-29T12:10:39.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:10:39.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:10:39.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:10:39.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:10:39.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:10:39.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:10:39.564 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:10:39.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:10:39.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:10:39.564 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:10:39.564 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:10:39.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:10:39.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:10:39.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:10:39.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:10:39.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:10:39.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T12:10:39.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:10:39.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T12:10:39.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:10:39.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:10:39.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:10:39.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:10:39.878 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:10:34
2026-05-29T12:10:39.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71801, datetime.datetime(2026, 5, 29, 12, 10, 34), datetime.datetime(2026, 5, 29, 12, 10, 34), 'salt', 12.57, 59.78, None, 19.09, 39.63, 7.6, 833.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:10:39.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:10:39.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:10:39.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:10:34, diff=5.885177s, valid=True
2026-05-29T12:10:39.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:10:39.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T12:10:39.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:11:12, diff=-32.111855s, valid=True
2026-05-29T12:10:39.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:10:39.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:10:39.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:10:33, diff=6.896406s, valid=True
2026-05-29T12:10:39.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:10:39.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:10:39.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:10:39.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:10:39.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:10:39.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T12:10:39.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:11:12, diff=-32.100423s, valid=True
2026-05-29T12:10:39.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:10:39.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:10:39.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:10:39.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982081.900261s, valid=True
2026-05-29T12:10:39.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:10:39.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:10:39.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:10:39.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:10:39.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:10:39.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:10:39.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:10:39.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:10:39.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:10:40.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:10:40.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:10:40.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:10:40.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:10:40.234 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:10:40.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:10:40.795 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:10:40.897 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:10:40.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:10:40.898 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:10:40.898 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:10:41.070 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:10:41.070 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:11:11.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:11:11.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:11:11.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:11:11.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:11:11.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:11:11.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:11:11.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-05-29T12:11:11.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:11: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-05-29T12:11:11.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:11:11.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:11:11.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:11:11.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T12:11:15.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-05-29T12:11:15.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:11:15.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:11:15.355 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:11:15.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:11:15.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:11:15.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:11:15.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:11:15.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:11:15.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:11:15.369 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:11:15.369 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:11:15.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:11:15.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:11:15.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:11:15.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:11:15.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:11:15.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T12:11:15.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:11:15.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T12:11:15.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:11:15.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:11:15.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:11:15.659 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:11:15.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:11:05
2026-05-29T12:11:15.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71802, datetime.datetime(2026, 5, 29, 12, 11, 5), datetime.datetime(2026, 5, 29, 12, 11, 4), 'salt', 12.6, 59.55, None, 17.75, 32.12, 7.65, 833.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:11:15.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:11:15.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:11:15.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:11:04, diff=11.726835s, valid=True
2026-05-29T12:11:15.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:11:15.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T12:11:15.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:11:12, diff=3.729709s, valid=True
2026-05-29T12:11:15.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:11:15.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:11:15.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:11:04, diff=11.736261s, valid=True
2026-05-29T12:11:15.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:11:15.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:11:15.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:11:15.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:11:15.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:11:15.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T12:11:15.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:11:12, diff=3.739528s, valid=True
2026-05-29T12:11:15.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:11:15.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:11:15.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:11:15.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982117.74047s, valid=True
2026-05-29T12:11:15.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:11:15.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:11:15.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:11:15.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:11:15.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:11:15.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:11:15.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:11:15.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:11:15.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:11:15.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:11:15.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:11:15.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:11:16.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:11:16.073 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:11:16.360 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:11:16.711 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:11:16.809 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:11:16.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:11:16.809 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:11:16.809 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:11:16.982 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:11:17.039 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:11:47.069 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:11:47.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:11:47.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:11:47.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:11:47.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:11:47.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:11:47.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-05-29T12:11:47.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:11:47.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-05-29T12:11:47.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:11:47.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:11:47.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:11:47.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-05-29T12:11:50.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-05-29T12:11:50.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:11:50.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:11:50.882 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:11:50.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:11:50.890 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:11:50.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:11:50.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:11:50.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:11:50.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:11:50.902 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:11:50.902 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:11:50.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:11:50.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:11:50.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:11:51.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:11:51.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:11:51.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T12:11:51.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:11:51.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T12:11:51.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:11:51.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:11:51.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:11:51.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:11:51.234 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:11:35
2026-05-29T12:11:51.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71803, datetime.datetime(2026, 5, 29, 12, 11, 35), datetime.datetime(2026, 5, 29, 12, 11, 35), 'salt', 12.6, 58.39, None, 15.91, 55.63, 7.93, 833.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:11:51.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:11:51.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:11:51.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:11:35, diff=16.240993s, valid=True
2026-05-29T12:11:51.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:11:51.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T12:11:51.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:12:12, diff=-20.756144s, valid=True
2026-05-29T12:11:51.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:11:51.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:11:51.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:11:32, diff=19.250592s, valid=True
2026-05-29T12:11:51.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:11:51.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:11:51.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:11:51.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:11:51.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:11:51.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T12:11:51.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:12:12, diff=-20.746369s, valid=True
2026-05-29T12:11:51.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:11:51.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:11:51.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:11:51.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982153.254285s, valid=True
2026-05-29T12:11:51.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:11:51.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:11:51.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:11:51.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:11:51.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:11:51.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:11:51.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:11:51.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:11:51.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:11:51.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:11:51.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:11:51.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:11:51.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:11:51.571 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:11:51.783 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:11:52.124 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:11:52.224 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:11:52.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:11:52.224 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:11:52.224 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:11:52.394 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:11:52.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:12:22.416 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:12:22.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:12:22.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:12:22.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:12:22.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:12:23.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:12:23.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T12:12:23.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:12:23.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T12:12:23.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:12:23.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:12:23.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:12:23.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-05-29T12:12: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-05-29T12:12:25.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:12:25.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:12:25.845 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:12:25.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:12:25.853 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:12:25.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:12:25.866 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:12:25.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:12:25.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:12:25.866 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:12:25.866 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:12:25.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:12:25.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:12:25.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:12:26.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:12:26.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:12:26.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T12:12:26.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:12:26.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T12:12:26.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:12:26.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:12:26.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:12:26.124 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:12:26.183 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:12:05
2026-05-29T12:12:26.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71804, datetime.datetime(2026, 5, 29, 12, 12, 5), datetime.datetime(2026, 5, 29, 12, 12, 5), 'salt', 12.7, 58.99, None, 17.96, 59.73, 7.79, 833.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:12:26.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:12:26.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:12:26.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:12:05, diff=21.190097s, valid=True
2026-05-29T12:12:26.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:12:26.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T12:12:26.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:12:12, diff=14.192975s, valid=True
2026-05-29T12:12:26.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:12:26.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:12:26.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:12:02, diff=24.199632s, valid=True
2026-05-29T12:12:26.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:12:26.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:12:26.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:12:26.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:12:26.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:12:26.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T12:12:26.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:12:12, diff=14.202644s, valid=True
2026-05-29T12:12:26.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:12:26.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:12:26.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:12:26.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982188.203289s, valid=True
2026-05-29T12:12:26.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:12:26.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:12:26.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:12:26.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:12:26.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:12:26.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:12:26.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:12:26.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:12:26.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:12:26.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:12:26.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:12:26.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:12:26.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:12:26.592 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:12:26.800 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:12:27.143 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:12:27.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:12:27.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:12:27.244 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:12:27.244 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:12:27.393 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:12:27.394 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:12:57.424 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:12:57.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:12:57.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:12:57.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:12:57.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:12:57.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:12:57.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-05-29T12:12:57.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:12:57.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-05-29T12:12:57.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:12:57.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:12:57.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:12:57.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-05-29T12:13:00.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-05-29T12:13:00.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:13:00.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:13:00.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:13:00.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:13:00.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:13:00.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:13:00.733 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:13:00.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:13:00.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:13:00.733 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:13:00.733 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:13:00.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:13:00.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:13:00.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:13:00.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:13:00.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:13:00.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:13:00.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:13:00.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:13:00.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:13:00.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:13:00.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:13:00.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:13:01.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:12:35
2026-05-29T12:13:01.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71805, datetime.datetime(2026, 5, 29, 12, 12, 35), datetime.datetime(2026, 5, 29, 12, 12, 35), 'salt', 12.74, 58.96, None, 20.4, 47.77, 7.81, 833.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:13:01.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:13:01.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:13:01.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:12:35, diff=26.054022s, valid=True
2026-05-29T12:13:01.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:13:01.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:13:01.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:13:12, diff=-10.943137s, valid=True
2026-05-29T12:13:01.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:13:01.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:13:01.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:12:32, diff=29.063469s, valid=True
2026-05-29T12:13:01.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:13:01.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:13:01.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:13:01.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:13:01.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:13:01.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:13:01.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:13:12, diff=-10.933502s, valid=True
2026-05-29T12:13:01.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:13:01.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:13:01.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:13:01.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982223.067153s, valid=True
2026-05-29T12:13:01.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:13:01.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:13:01.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:13:01.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:13:01.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:13:01.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:13:01.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:13:01.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:13:01.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:13:01.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:13:01.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:13:01.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:13:01.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:13:01.383 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:13:01.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:13:01.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:13:02.096 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:13:02.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:13:02.096 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:13:02.096 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:13:02.314 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:13:02.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:13:32.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:13:32.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:13:32.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:13:32.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:13:32.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:13:32.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:13:32.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-05-29T12:13:32.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:13:32.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-05-29T12:13:32.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:13:32.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:13:32.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:13:32.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-05-29T12:13:35.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-05-29T12:13:35.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:13:35.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:13:35.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:13:35.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:13:35.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:13:35.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:13:35.517 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:13:35.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:13:35.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:13:35.517 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:13:35.517 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:13:35.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:13:35.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:13:35.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:13:35.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:13:35.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:13:35.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:13:35.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:13:35.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:13:35.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:13:35.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:13:35.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:13:35.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:13:35.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:13:06
2026-05-29T12:13:35.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71806, datetime.datetime(2026, 5, 29, 12, 13, 6), datetime.datetime(2026, 5, 29, 12, 13, 5), 'salt', 12.64, 58.62, None, 21.49, 49.72, 7.89, 833.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:13:35.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:13:35.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:13:35.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:13:05, diff=30.830174s, valid=True
2026-05-29T12:13:35.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:13:35.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:13:35.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:13:12, diff=23.833065s, valid=True
2026-05-29T12:13:35.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:13:35.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:13:35.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:13:02, diff=33.839785s, valid=True
2026-05-29T12:13:35.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:13:35.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:13:35.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:13:35.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:13:35.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:13:35.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:13:35.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:13:12, diff=23.842851s, valid=True
2026-05-29T12:13:35.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:13:35.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:13:35.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:13:35.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982257.843501s, valid=True
2026-05-29T12:13:35.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:13:35.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:13:35.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:13:35.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:13:35.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:13:35.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:13:35.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:13:35.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:13:35.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:13:35.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:13:36.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:13:36.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:13:36.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:13:36.230 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:13:36.437 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:13:36.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:13:36.878 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:13:36.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:13:36.878 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:13:36.878 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:13:37.052 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:13:37.052 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:14:07.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:14:07.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:14:07.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:14:07.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:14:07.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:14:07.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:14:07.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-05-29T12:14:07.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:14:07.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-05-29T12:14:07.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:14:07.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:14:07.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:14:07.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-05-29T12:14:10.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-05-29T12:14:10.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:14:10.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:14:10.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:14:10.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:14:10.131 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:14:10.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:14:10.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:14:10.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:14:10.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:14:10.143 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:14:10.143 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:14:10.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:14:10.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:14:10.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:14:10.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:14:10.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:14:10.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:14:10.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:14:10.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:14:10.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:14:10.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:14:10.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:14:10.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:14:10.473 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:14:06
2026-05-29T12:14:10.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71808, datetime.datetime(2026, 5, 29, 12, 14, 6), datetime.datetime(2026, 5, 29, 12, 14, 6), 'salt', 12.6, 58.59, None, 19.3, 59.47, 7.89, 833.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:14:10.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:14:10.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:14:10.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:14:06, diff=4.479772s, valid=True
2026-05-29T12:14:10.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:14:10.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:14:10.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:14:12, diff=-1.517402s, valid=True
2026-05-29T12:14:10.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:14:10.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:14:10.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:14:03, diff=7.489169s, valid=True
2026-05-29T12:14:10.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:14:10.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:14:10.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:14:10.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:14:10.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:14:10.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:14:10.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:14:12, diff=-1.507798s, valid=True
2026-05-29T12:14:10.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:14:10.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:14:10.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:14:10.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982292.49288s, valid=True
2026-05-29T12:14:10.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:14:10.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:14:10.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:14:10.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:14:10.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:14:10.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:14:10.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:14:10.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:14:10.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:14:10.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:14:10.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:14:10.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:14:10.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:14:10.823 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:14:11.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:14:11.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:14:11.520 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:14:11.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:14:11.521 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:14:11.521 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:14:11.776 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:14:11.777 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:14:41.783 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:14:41.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:14:41.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:14:41.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:14:41.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:14:42.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:14:42.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-05-29T12:14:42.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:14:42.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-05-29T12:14:42.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:14:42.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:14:42.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:14:42.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-05-29T12:14:44.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-05-29T12:14:44.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:14:44.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:14:44.741 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:14:44.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:14:44.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:14:44.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:14:44.762 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:14:44.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:14:44.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:14:44.762 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:14:44.762 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:14:44.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:14:44.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:14:44.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:14:44.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:14:44.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:14:44.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:14:44.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:14:45.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:14:45.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:14:45.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:14:45.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:14:45.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:14:45.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:14:36
2026-05-29T12:14:45.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71809, datetime.datetime(2026, 5, 29, 12, 14, 36), datetime.datetime(2026, 5, 29, 12, 14, 36), 'salt', 12.74, 59.32, None, 20.25, 49.22, 7.72, 833.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:14:45.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:14:45.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:14:45.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:14:36, diff=9.103983s, valid=True
2026-05-29T12:14:45.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:14:45.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:14:45.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:15:12, diff=-26.893124s, valid=True
2026-05-29T12:14:45.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:14:45.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:14:45.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:14:34, diff=11.114057s, valid=True
2026-05-29T12:14:45.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:14:45.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:14:45.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:14:45.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:14:45.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:14:45.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:14:45.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:15:12, diff=-26.882816s, valid=True
2026-05-29T12:14:45.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:14:45.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:14:45.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:14:45.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982327.118347s, valid=True
2026-05-29T12:14:45.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:14:45.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:14:45.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:14:45.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:14:45.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:14:45.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:14:45.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:14:45.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:14:45.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:14:45.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:14:45.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:14:45.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:14:45.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:14:45.511 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:14:45.735 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:14:46.096 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:14:46.197 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:14:46.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:14:46.198 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:14:46.198 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:14:46.372 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:14:46.372 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:15:16.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:15:16.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:15:16.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:15:16.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:15:16.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:15:16.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:15:16.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-05-29T12:15:16.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:15:16.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-05-29T12:15:16.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:15:16.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:15:16.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:15:16.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-05-29T12:15:19.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-05-29T12:15:19.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:15:19.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:15:19.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:15:19.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:15:19.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:15:19.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:15:19.541 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:15:19.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:15:19.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:15:19.541 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:15:19.541 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:15:19.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:15:19.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:15:19.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:15:19.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:15:19.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:15:19.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:15:19.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:15:19.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:15:19.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:15:19.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:15:19.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:15:19.810 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:15:19.868 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:15:07
2026-05-29T12:15:19.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71810, datetime.datetime(2026, 5, 29, 12, 15, 7), datetime.datetime(2026, 5, 29, 12, 15, 6), 'salt', 12.83, 59.49, None, 17.22, 42.21, 7.68, 833.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:15:19.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:15:19.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:15:19.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:15:06, diff=13.875664s, valid=True
2026-05-29T12:15:19.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:15:19.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:15:19.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:15:12, diff=7.878636s, valid=True
2026-05-29T12:15:19.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:15:19.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:15:19.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:15:05, diff=14.885586s, valid=True
2026-05-29T12:15:19.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:15:19.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:15:19.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:15:19.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:15:19.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:15:19.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:15:19.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:15:12, diff=7.889014s, valid=True
2026-05-29T12:15:19.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:15:19.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:15:19.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:15:19.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982361.890038s, valid=True
2026-05-29T12:15:19.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:15:19.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:15:19.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:15:19.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:15:19.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:15:19.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:15:19.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:15:19.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:15:19.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:15:20.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:15:20.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:15:20.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:15:20.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:15:20.227 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:15:20.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:15:20.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:15:20.877 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:15:20.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:15:20.877 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:15:20.877 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:15:21.080 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:15:21.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:15:51.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:15:51.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:15:51.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:15:51.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:15:51.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:15:51.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:15:51.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-05-29T12:15:51.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:15:51.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-05-29T12:15:51.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:15:51.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:15:51.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:15:51.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-05-29T12:15:54.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T12:15:54.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:15:54.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:15:54.211 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:15:54.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:15:54.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:15:54.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:15:54.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:15:54.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:15:54.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:15:54.231 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:15:54.231 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:15:54.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:15:54.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:15:54.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:15:54.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:15:54.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:15:54.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:15:54.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:15:54.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:15:54.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:15:54.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:15:54.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:15:54.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:15:54.547 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:15:37
2026-05-29T12:15:54.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71811, datetime.datetime(2026, 5, 29, 12, 15, 37), datetime.datetime(2026, 5, 29, 12, 15, 36), 'salt', 12.93, 58.62, None, 13.59, 44.3, 7.9, 833.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:15:54.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:15:54.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:15:54.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:15:36, diff=18.553825s, valid=True
2026-05-29T12:15:54.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:15:54.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:15:54.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:16:12, diff=-17.443348s, valid=True
2026-05-29T12:15:54.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:15:54.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:15:54.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:15:37, diff=17.563183s, valid=True
2026-05-29T12:15:54.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:15:54.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:15:54.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:15:54.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:15:54.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:15:54.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:15:54.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:16:12, diff=-17.433818s, valid=True
2026-05-29T12:15:54.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:15:54.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:15:54.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:15:54.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982396.566843s, valid=True
2026-05-29T12:15:54.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:15:54.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:15:54.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:15:54.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:15:54.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:15:54.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:15:54.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:15:54.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:15:54.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:15:54.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:15:54.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:15:54.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:15:54.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:15:54.881 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:15:55.109 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:15:55.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:15:55.588 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:15:55.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:15:55.588 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:15: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-05-29T12:15:55.757 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:15:55.757 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:16:25.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:16:25.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:16:25.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:16:26.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:16:26.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:16:26.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:16:26.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T12:16:26.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:16:26.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-05-29T12:16:26.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:16:26.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:16:26.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:16:26.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T12:16:28.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-05-29T12:16:28.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:16:28.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:16:28.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:16:28.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:16:28.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:16:28.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:16:28.985 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:16:28.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:16:28.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:16:28.986 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:16:28.986 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:16:28.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:16:29.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:16:29.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:16:29.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:16:29.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:16:29.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:16:29.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:16:29.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:16:29.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:16:29.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:16:29.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:16:29.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:16:29.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:16:07
2026-05-29T12:16:29.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71812, datetime.datetime(2026, 5, 29, 12, 16, 7), datetime.datetime(2026, 5, 29, 12, 16, 7), 'salt', 13.07, 58.95, None, 16.66, 39.98, 7.83, 833.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:16:29.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:16:29.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:16:29.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:16:07, diff=22.300555s, valid=True
2026-05-29T12:16:29.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:16:29.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:16:29.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:16:12, diff=17.303479s, valid=True
2026-05-29T12:16:29.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:16:29.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:16:29.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:16:04, diff=25.310277s, valid=True
2026-05-29T12:16:29.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:16:29.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:16:29.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:16:29.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:16:29.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:16:29.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:16:29.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:16:12, diff=17.313309s, valid=True
2026-05-29T12:16:29.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:16:29.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:16:29.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:16:29.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982431.313979s, valid=True
2026-05-29T12:16:29.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:16:29.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:16:29.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:16:29.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:16:29.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:16:29.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:16:29.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:16:29.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:16:29.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:16:29.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:16:29.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:16:29.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:16:29.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:16:29.630 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:16:29.838 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:16:30.199 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:16:30.299 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:16:30.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:16:30.299 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:16:30.299 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:16:30.481 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:16:30.482 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:17:00.511 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:17:00.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:17:00.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:17:00.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:17:00.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:17:01.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:17:01.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-05-29T12:17:01.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:17:01.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-05-29T12:17:01.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:17:01.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:17:01.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:17:01.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-05-29T12:17:03.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-05-29T12:17:03.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:17:03.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:17:03.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:17:03.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:17:03.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:17:03.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:17:03.807 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:17:03.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:17:03.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:17:03.808 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:17:03.808 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:17:03.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:17:03.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:17:03.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:17:03.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:17:03.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:17:04.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:17:04.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:17:04.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:17:04.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:17:04.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:17:04.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:17:04.089 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:17:04.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:16:37
2026-05-29T12:17:04.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71813, datetime.datetime(2026, 5, 29, 12, 16, 37), datetime.datetime(2026, 5, 29, 12, 16, 37), 'salt', 13.07, 58.46, None, 15.53, 29.05, 7.95, 833.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:17:04.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:17:04.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:17:04.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:16:37, diff=27.160295s, valid=True
2026-05-29T12:17:04.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:17:04.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:17:04.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:17:12, diff=-7.836795s, valid=True
2026-05-29T12:17:04.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:17:04.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:17:04.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:16:34, diff=30.169864s, valid=True
2026-05-29T12:17:04.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:17:04.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:17:04.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:17:04.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:17:04.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:17:04.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:17:04.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:17:12, diff=-7.827076s, valid=True
2026-05-29T12:17:04.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:17:04.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:17:04.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:17:04.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982466.173579s, valid=True
2026-05-29T12:17:04.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:17:04.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:17:04.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:17:04.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:17:04.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:17:04.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:17:04.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:17:04.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:17:04.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:17:04.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:17:04.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:17:04.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:17:04.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:17:04.493 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:17:04.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:17:05.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:17:05.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:17:05.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:17:05.148 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:17:05.148 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:17:05.410 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:17:05.410 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:17:35.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:17:35.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:17:35.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:17:35.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:17:35.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:17:35.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:17:35.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-05-29T12:17:36.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:17:36.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-05-29T12:17:36.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:17:36.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:17:36.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:17:36.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-05-29T12:17:38.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-05-29T12:17:38.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:17:38.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:17:38.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:17:38.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:17:38.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:17:38.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:17:38.722 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:17:38.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:17:38.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:17:38.722 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:17:38.722 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:17:38.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:17:38.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:17:38.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:17:38.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:17:38.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:17:38.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:17:38.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:17:38.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:17:38.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:17:38.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:17:38.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:17:38.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:17:39.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:17:38
2026-05-29T12:17:39.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71815, datetime.datetime(2026, 5, 29, 12, 17, 38), datetime.datetime(2026, 5, 29, 12, 17, 37), 'salt', 13.23, 58.99, None, 15.6, 62.48, 7.83, 833.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:17:39.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:17:39.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:17:39.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:17:37, diff=2.0536s, valid=True
2026-05-29T12:17:39.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:17:39.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:17:39.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:18:12, diff=-32.943492s, valid=True
2026-05-29T12:17:39.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:17:39.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:17:39.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:17:35, diff=4.063244s, valid=True
2026-05-29T12:17:39.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:17:39.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:17:39.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:17:39.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:17:39.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:17:39.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:17:39.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:18:12, diff=-32.933657s, valid=True
2026-05-29T12:17:39.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:17:39.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:17:39.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:17:39.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982501.067028s, valid=True
2026-05-29T12:17:39.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:17:39.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:17:39.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:17:39.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:17:39.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:17:39.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:17:39.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:17:39.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:17:39.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:17:39.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:17:39.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:17:39.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:17:39.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:17:39.383 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:17:39.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:17:40.041 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:17:40.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:17:40.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:17:40.150 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:17:40.150 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:17:40.349 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:17:40.349 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:18:10.379 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:18:10.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:18:10.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:18:10.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:18:10.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:18:10.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:18:10.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-05-29T12:18:10.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:18:10.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T12:18:10.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:18:10.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:18:10.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:18:10.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-05-29T12:18:13.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-05-29T12:18:13.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:18:13.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:18:13.323 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:18:13.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:18:13.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:18:13.345 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:18:13.345 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:18:13.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:18:13.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:18:13.345 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:18:13.345 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:18:13.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:18:13.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:18:13.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:18:13.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:18:13.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:18:13.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:18:13.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:18:13.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:18:13.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:18:13.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:18:13.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:18:13.607 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:18:13.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:18:08
2026-05-29T12:18:13.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71816, datetime.datetime(2026, 5, 29, 12, 18, 8), datetime.datetime(2026, 5, 29, 12, 18, 7), 'salt', 13.4, 59.42, None, 20.57, 62.71, 7.74, 833.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:18:13.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:18:13.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:18:13.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:18:07, diff=6.684989s, valid=True
2026-05-29T12:18:13.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:18:13.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:18:13.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:18:12, diff=1.687873s, valid=True
2026-05-29T12:18:13.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:18:13.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:18:13.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:18:05, diff=8.694634s, valid=True
2026-05-29T12:18:13.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:18:13.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:18:13.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:18:13.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:18:13.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:18:13.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:18:13.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:18:12, diff=1.697695s, valid=True
2026-05-29T12:18:13.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:18:13.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:18:13.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:18:13.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982535.698348s, valid=True
2026-05-29T12:18:13.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:18:13.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:18:13.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:18:13.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:18:13.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:18:13.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:18:13.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:18:13.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:18:13.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:18:13.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:18:13.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:18:13.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:18:13.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:18:14.023 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:18:14.239 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:18:14.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:18:14.694 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:18:14.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:18:14.695 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:18:14.695 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:18:14.948 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:18:14.948 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:18:44.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:18:44.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:18:44.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:18:45.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:18:45.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:18:45.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:18:45.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-05-29T12:18:45.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:18:45.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T12:18:45.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:18:45.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:18:45.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:18:45.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-05-29T12:18:48.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-05-29T12:18:48.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:18:48.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:18:48.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:18:48.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:18:48.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:18:48.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:18:48.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:18:48.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:18:48.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:18:48.277 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:18:48.277 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:18:48.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:18:48.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:18:48.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:18:48.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:18:48.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:18:48.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:18:48.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:18:48.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:18:48.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:18:48.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:18:48.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:18:48.552 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:18:48.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:18:38
2026-05-29T12:18:48.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71817, datetime.datetime(2026, 5, 29, 12, 18, 38), datetime.datetime(2026, 5, 29, 12, 18, 38), 'salt', 13.27, 58.82, None, 23.71, 57.41, 7.88, 833.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:18:48.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:18:48.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:18:48.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:18:38, diff=10.618109s, valid=True
2026-05-29T12:18:48.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:18:48.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:18:48.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:19:12, diff=-23.379064s, valid=True
2026-05-29T12:18:48.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:18:48.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:18:48.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:18:35, diff=13.627555s, valid=True
2026-05-29T12:18:48.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:18:48.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:18:48.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:18:48.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:18:48.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:18:48.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:18:48.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:19:12, diff=-23.369418s, valid=True
2026-05-29T12:18:48.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:18:48.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:18:48.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:18:48.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982570.631251s, valid=True
2026-05-29T12:18:48.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:18:48.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:18:48.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:18:48.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:18:48.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:18:48.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:18:48.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:18:48.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:18:48.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:18:48.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:18:48.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:18:48.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:18:48.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:18:49.021 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:18:49.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:18:49.594 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:18:49.695 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:18:49.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:18:49.696 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:18:49.696 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:18:49.964 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:18:49.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:19:19.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:19:19.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:19:19.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:19:20.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:19:20.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:19:20.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:19:20.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-05-29T12:19:20.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:19:20.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-05-29T12:19:20.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:19:20.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:19:20.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:19:20.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-05-29T12:19: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-05-29T12:19:23.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:19:23.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:19:23.089 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:19:23.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:19:23.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:19:23.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:19:23.112 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:19:23.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:19:23.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:19:23.112 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:19:23.112 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:19:23.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:19:23.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:19:23.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:19:23.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:19:23.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:19:23.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:19:23.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:19:23.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:19:23.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:19:23.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:19:23.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:19:23.388 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:19:23.448 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:19:08
2026-05-29T12:19:23.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71818, datetime.datetime(2026, 5, 29, 12, 19, 8), datetime.datetime(2026, 5, 29, 12, 19, 8), 'salt', 12.8, 58.79, None, 18.84, 59.71, 7.85, 833.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:19:23.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:19:23.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:19:23.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:19:08, diff=15.454937s, valid=True
2026-05-29T12:19:23.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:19:23.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:19:23.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:19:12, diff=11.457826s, valid=True
2026-05-29T12:19:23.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:19:23.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:19:23.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:19:06, diff=17.464535s, valid=True
2026-05-29T12:19:23.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:19:23.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:19:23.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:19:23.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:19:23.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:19:23.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:19:23.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:19:12, diff=11.467599s, valid=True
2026-05-29T12:19:23.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:19:23.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:19:23.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:19:23.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982605.468261s, valid=True
2026-05-29T12:19:23.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:19:23.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:19:23.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:19:23.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:19:23.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:19:23.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:19:23.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:19:23.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:19:23.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:19:23.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:19:23.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:19:23.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:19:23.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:19:23.789 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:19:24.002 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:19:24.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:19:24.453 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:19:24.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:19:24.453 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:19:24.453 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:19:24.709 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:19:24.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:19:54.739 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:19:54.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:19:54.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:19:54.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:19:54.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:19:55.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:19:55.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T12:19:55.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:19: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-05-29T12:19:55.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:19:55.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:19:55.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:19:55.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-05-29T12:19:57.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-05-29T12:19:57.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:19:57.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:19:57.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:19:57.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:19:57.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:19:57.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:19:57.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:19:57.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:19:57.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:19:57.715 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:19:57.715 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:19:57.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:19:57.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:19:57.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:19:57.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:19:57.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:19:57.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:19:57.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:19:57.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:19:57.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:19:57.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:19:57.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:19:57.974 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:19:58.031 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:19:38
2026-05-29T12:19:58.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71819, datetime.datetime(2026, 5, 29, 12, 19, 38), datetime.datetime(2026, 5, 29, 12, 19, 38), 'salt', 12.6, 59.15, None, 16.83, 54.01, 7.75, 833.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:19:58.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:19:58.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:19:58.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:19:38, diff=20.03788s, valid=True
2026-05-29T12:19:58.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:19:58.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:19:58.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:20:12, diff=-13.959248s, valid=True
2026-05-29T12:19:58.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:19:58.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:19:58.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:19:37, diff=21.047451s, valid=True
2026-05-29T12:19:58.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:19:58.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:19:58.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:19:58.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:19:58.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:19:58.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:19:58.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:20:12, diff=-13.949485s, valid=True
2026-05-29T12:19:58.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:19:58.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:19:58.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:19:58.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982640.051195s, valid=True
2026-05-29T12:19:58.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:19:58.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:19:58.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:19:58.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:19:58.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:19:58.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:19:58.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:19:58.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:19:58.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:19:58.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:19:58.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:19:58.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:19:58.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:19:58.441 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:19:58.651 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:19:58.995 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:19:59.096 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:19:59.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:19:59.096 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:19:59.096 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:19:59.232 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:19:59.232 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:20:29.262 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:20:29.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:20:29.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:20:29.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:20:29.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:20:29.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:20:29.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-05-29T12:20:29.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:20:29.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-05-29T12:20:29.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:20:29.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:20:29.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:20:29.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-05-29T12:20:32.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-05-29T12:20:32.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:20:32.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:20:32.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:20:32.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:20:32.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:20:32.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:20:32.517 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:20:32.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:20:32.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:20:32.517 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:20:32.517 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:20:32.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:20:32.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:20:32.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:20:32.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:20:32.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:20:32.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:20:32.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:20:32.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:20:32.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:20:32.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:20:32.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:20:32.785 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:20:32.843 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:20:09
2026-05-29T12:20:32.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71820, datetime.datetime(2026, 5, 29, 12, 20, 9), datetime.datetime(2026, 5, 29, 12, 20, 8), 'salt', 12.67, 59.95, None, 15.24, 53.09, 7.56, 833.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:20:32.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:20:32.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:20:32.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:20:08, diff=24.849563s, valid=True
2026-05-29T12:20:32.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:20:32.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:20:32.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:20:12, diff=20.852482s, valid=True
2026-05-29T12:20:32.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:20:32.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:20:32.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:20:06, diff=26.859315s, valid=True
2026-05-29T12:20:32.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:20:32.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:20:32.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:20:32.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:20:32.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:20:32.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:20:32.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:20:12, diff=20.862401s, valid=True
2026-05-29T12:20:32.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:20:32.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:20:32.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:20:32.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982674.863082s, valid=True
2026-05-29T12:20:32.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:20:32.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:20:32.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:20:32.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:20:32.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:20:32.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:20:32.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:20:32.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:20:32.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:20:32.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:20:33.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:20:33.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:20:33.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:20:33.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:20:33.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:20:33.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:20:33.864 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:20:33.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:20:33.865 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:20:33.865 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:20:34.009 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:20:34.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:21:04.039 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:21:04.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:21:04.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:21:04.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:21:04.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:21:04.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:21:04.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-05-29T12:21:04.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:21:04.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-05-29T12:21:04.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:21:04.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:21:04.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:21:04.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-05-29T12:21:07.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-05-29T12:21:07.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:21:07.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:21:07.383 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:21:07.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:21:07.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:21:07.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:21:07.403 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:21:07.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:21:07.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:21:07.403 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:21:07.403 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:21:07.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:21:07.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:21:07.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:21:07.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:21:07.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:21:07.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:21:07.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:21:07.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:21:07.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:21:07.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:21:07.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:21:07.662 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:21:07.721 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:20:39
2026-05-29T12:21:07.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71821, datetime.datetime(2026, 5, 29, 12, 20, 39), datetime.datetime(2026, 5, 29, 12, 20, 38), 'salt', 12.37, 59.22, None, 18.38, 52.41, 7.72, 833.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:21:07.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:21:07.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:21:07.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:20:38, diff=29.729333s, valid=True
2026-05-29T12:21:07.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:21:07.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:21:07.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:21:12, diff=-4.267724s, valid=True
2026-05-29T12:21:07.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:21:07.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:21:07.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:20:36, diff=31.739037s, valid=True
2026-05-29T12:21:07.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:21:07.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:21:07.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:21:07.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:21:07.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:21:07.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:21:07.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:21:12, diff=-4.257847s, valid=True
2026-05-29T12:21:07.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:21:07.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:21:07.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:21:07.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982709.74282s, valid=True
2026-05-29T12:21:07.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:21:07.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:21:07.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:21:07.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:21:07.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:21:07.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:21:07.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:21:07.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:21:07.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:21:07.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:21:08.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:21:08.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:21:08.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:21:08.137 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:21:08.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:21:08.710 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:21:08.812 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:21:08.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:21:08.812 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:21:08.812 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:21:09.064 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:21:09.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:21:39.093 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:21:39.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:21:39.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:21:39.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:21:39.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:21:39.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:21:39.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-05-29T12:21:39.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:21:39.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-05-29T12:21:39.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:21:39.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:21:39.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:21:39.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-05-29T12:21:42.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-05-29T12:21:42.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:21:42.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:21:42.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:21:42.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:21:42.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:21:42.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:21:42.129 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:21:42.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:21:42.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:21:42.130 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:21:42.130 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:21:42.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:21:42.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:21:42.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:21:42.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:21:42.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:21:42.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:21:42.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:21:42.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:21:42.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:21:42.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:21:42.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:21:42.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:21:42.465 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:21:39
2026-05-29T12:21:42.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71823, datetime.datetime(2026, 5, 29, 12, 21, 39), datetime.datetime(2026, 5, 29, 12, 21, 39), 'salt', 12.14, 60.31, None, 16.2, 47.42, 7.45, 833.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:21:42.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:21:42.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:21:42.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:21:39, diff=3.471497s, valid=True
2026-05-29T12:21:42.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:21:42.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:21:42.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:22:12, diff=-29.52556s, valid=True
2026-05-29T12:21:42.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:21:42.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:21:42.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:21:37, diff=5.481176s, valid=True
2026-05-29T12:21:42.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:21:42.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:21:42.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:21:42.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:21:42.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:21:42.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:21:42.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:22:12, diff=-29.51574s, valid=True
2026-05-29T12:21:42.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:21:42.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:21:42.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:21:42.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982744.484935s, valid=True
2026-05-29T12:21:42.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:21:42.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:21:42.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:21:42.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:21:42.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:21:42.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:21:42.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:21:42.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:21:42.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:21:42.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:21:42.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:21:42.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:21:42.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:21:42.815 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:21:43.024 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:21:43.378 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:21:43.478 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:21:43.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:21:43.478 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:21:43.478 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:21:43.643 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:21:43.644 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:22:13.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:22:13.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:22:13.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:22:14.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:22:14.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:22:14.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:22:14.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-05-29T12:22:14.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:22:14.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-05-29T12:22:14.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:22:14.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:22:14.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:22:14.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-05-29T12:22:17.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-05-29T12:22:17.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:22:17.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:22:17.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:22:17.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:22:17.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:22:17.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:22:17.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:22:17.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:22:17.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:22:17.315 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:22:17.315 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:22:17.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:22:17.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:22:17.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:22:17.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:22:17.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:22:17.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:22:17.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:22:17.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:22:17.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:22:17.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:22:17.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:22:17.601 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:22:17.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:22:09
2026-05-29T12:22:17.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71824, datetime.datetime(2026, 5, 29, 12, 22, 9), datetime.datetime(2026, 5, 29, 12, 22, 9), 'salt', 12.44, 61.11, None, 16.9, 77.44, 7.28, 833.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:22:17.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:22:17.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:22:17.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:22:09, diff=8.672124s, valid=True
2026-05-29T12:22:17.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:22:17.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:22:17.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:22:12, diff=5.675138s, valid=True
2026-05-29T12:22:17.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:22:17.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:22:17.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:22:07, diff=10.681886s, valid=True
2026-05-29T12:22:17.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:22:17.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:22:17.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:22:17.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:22:17.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:22:17.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:22:17.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:22:12, diff=5.684929s, valid=True
2026-05-29T12:22:17.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:22:17.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:22:17.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:22:17.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982779.685602s, valid=True
2026-05-29T12:22:17.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:22:17.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:22:17.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:22:17.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:22:17.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:22:17.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:22:17.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:22:17.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:22:17.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:22:17.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:22:17.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:22:17.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:22:17.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:22:18.016 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:22:18.235 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:22:18.596 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:22:18.697 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:22:18.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:22:18.697 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:22:18.697 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:22:18.924 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:22:18.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:22:48.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:22:48.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:22:48.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:22:49.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:22:49.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:22:49.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:22:49.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-05-29T12:22:49.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:22:49.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-05-29T12:22:49.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:22:49.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:22:49.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:22:49.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-05-29T12:22:51.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-05-29T12:22:51.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:22:52.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:22:52.003 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:22:52.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:22:52.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:22:52.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:22:52.023 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:22:52.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:22:52.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:22:52.024 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:22:52.024 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:22:52.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:22:52.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:22:52.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:22:52.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:22:52.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:22:52.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:22:52.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:22:52.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:22:52.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:22:52.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:22:52.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:22:52.288 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:22:52.357 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:22:40
2026-05-29T12:22:52.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71825, datetime.datetime(2026, 5, 29, 12, 22, 40), datetime.datetime(2026, 5, 29, 12, 22, 39), 'salt', 12.5, 60.35, None, 22.87, 45.26, 7.46, 833.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:22:52.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:22:52.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:22:52.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:22:39, diff=13.363664s, valid=True
2026-05-29T12:22:52.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:22:52.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:22:52.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:23:12, diff=-19.633441s, valid=True
2026-05-29T12:22:52.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:22:52.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:22:52.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:22:37, diff=15.373353s, valid=True
2026-05-29T12:22:52.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:22:52.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:22:52.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:22:52.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:22:52.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:22:52.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:22:52.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:23:12, diff=-19.623508s, valid=True
2026-05-29T12:22:52.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:22:52.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:22:52.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:22:52.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982814.37717s, valid=True
2026-05-29T12:22:52.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:22:52.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:22:52.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:22:52.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:22:52.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:22:52.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:22:52.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:22:52.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:22:52.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:22:52.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:22:52.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:22:52.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:22:52.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:22:52.701 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:22:52.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:22:53.267 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:22:53.439 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:22:53.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:22:53.439 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:22:53.439 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:22:53.598 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:22:53.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:23:23.628 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:23:23.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:23:23.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:23:24.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:23:24.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:23:24.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:23: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-05-29T12:23:24.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:23:24.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-05-29T12:23:24.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:23:24.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:23:24.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:23:24.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-05-29T12:23:27.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-05-29T12:23:27.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:23:27.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:23:27.060 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:23:27.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:23:27.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:23:27.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:23:27.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:23:27.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:23:27.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:23:27.083 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:23:27.083 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:23:27.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:23:27.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:23:27.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:23:27.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:23:27.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:23:27.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:23:27.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:23:27.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:23:27.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:23:27.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:23:27.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:23:27.338 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:23:27.400 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:23:10
2026-05-29T12:23:27.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71826, datetime.datetime(2026, 5, 29, 12, 23, 10), datetime.datetime(2026, 5, 29, 12, 23, 10), 'salt', 12.83, 58.92, None, 18.24, 39.37, 7.82, 833.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:23:27.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:23:27.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:23:27.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:23:10, diff=17.406258s, valid=True
2026-05-29T12:23:27.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:23:27.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:23:27.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:23:12, diff=15.409161s, valid=True
2026-05-29T12:23:27.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:23:27.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:23:27.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:23:07, diff=20.415815s, valid=True
2026-05-29T12:23:27.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:23:27.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:23:27.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:23:27.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:23:27.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:23:27.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:23:27.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:23:12, diff=15.418838s, valid=True
2026-05-29T12:23:27.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:23:27.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:23:27.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:23:27.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982849.419488s, valid=True
2026-05-29T12:23:27.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:23:27.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:23:27.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:23:27.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:23:27.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:23:27.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:23:27.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:23:27.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:23:27.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:23:27.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:23:27.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:23:27.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:23:27.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:23:27.738 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:23:27.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:23:28.312 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:23:28.413 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:23:28.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:23:28.413 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:23:28.413 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:23:28.656 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:23:28.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:23:58.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:23:58.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:23:58.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:23:58.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:23:58.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:23:59.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:23:59.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-05-29T12:23:59.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:23:59.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-05-29T12:23:59.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:23:59.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:23:59.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:23:59.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-05-29T12:24:02.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-05-29T12:24:02.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:24:02.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:24:02.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:24:02.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:24:02.252 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:24:02.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:24:02.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:24:02.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:24:02.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:24:02.268 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:24:02.268 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:24:02.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:24:02.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:24:02.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:24:02.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:24:02.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:24:02.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:24:02.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:24:02.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:24:02.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:24:02.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:24:02.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:24:02.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:24:02.577 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:23:41
2026-05-29T12:24:02.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71827, datetime.datetime(2026, 5, 29, 12, 23, 41), datetime.datetime(2026, 5, 29, 12, 23, 40), 'salt', 12.87, 58.76, None, 18.91, 26.09, 7.87, 833.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:24:02.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:24:02.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:24:02.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:23:40, diff=22.583216s, valid=True
2026-05-29T12:24:02.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:24:02.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:24:02.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:24:12, diff=-9.413963s, valid=True
2026-05-29T12:24:02.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:24:02.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:24:02.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:23:39, diff=23.592575s, valid=True
2026-05-29T12:24:02.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:24:02.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:24:02.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:24:02.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:24:02.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:24:02.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:24:02.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:24:12, diff=-9.404404s, valid=True
2026-05-29T12:24:02.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:24:02.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:24:02.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:24:02.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982884.596256s, valid=True
2026-05-29T12:24:02.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:24:02.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:24:02.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:24:02.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:24:02.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:24:02.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:24:02.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:24:02.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:24:02.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:24:02.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:24:02.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:24:02.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:24:02.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:24:02.926 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:24:03.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:24:03.573 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:24:03.677 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:24:03.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:24:03.677 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:24:03.677 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:24:03.866 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:24:03.867 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:24:33.889 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:24:33.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:24:33.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:24:34.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:24:34.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:24:34.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:24:34.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-05-29T12:24:34.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:24:34.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-05-29T12:24:34.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:24:34.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:24:34.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:24:34.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-05-29T12:24:37.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-05-29T12:24:37.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:24:37.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:24:37.059 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:24:37.059 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:24:37.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:24:37.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:24:37.079 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:24:37.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:24:37.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:24:37.079 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:24:37.079 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:24:37.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:24:37.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:24:37.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:24:37.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:24:37.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:24:37.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:24:37.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:24:37.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:24:37.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:24:37.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:24:37.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:24:37.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:24:37.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:24:11
2026-05-29T12:24:37.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71828, datetime.datetime(2026, 5, 29, 12, 24, 11), datetime.datetime(2026, 5, 29, 12, 24, 10), 'salt', 13.07, 58.19, None, 18.74, 30.71, 8.02, 833.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:24:37.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:24:37.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:24:37.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:24:10, diff=27.414733s, valid=True
2026-05-29T12:24:37.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:24:37.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:24:37.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:24:12, diff=25.417549s, valid=True
2026-05-29T12:24:37.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:24:37.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:24:37.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:24:10, diff=27.424216s, valid=True
2026-05-29T12:24:37.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:24:37.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:24:37.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:24:37.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:24:37.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:24:37.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:24:37.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:24:12, diff=25.427235s, valid=True
2026-05-29T12:24:37.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:24:37.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:24:37.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:24:37.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982919.427894s, valid=True
2026-05-29T12:24:37.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:24:37.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:24:37.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:24:37.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:24:37.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:24:37.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:24:37.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:24:37.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:24:37.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:24:37.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:24:37.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:24:37.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:24:37.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:24:37.759 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:24:37.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:24:38.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:24:38.449 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:24:38.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:24:38.450 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:24:38.450 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:24:38.706 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:24:38.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:25:08.720 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:25:08.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:25:08.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:25:09.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:25:09.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:25:09.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:25:09.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-05-29T12:25:09.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:25:09.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-05-29T12:25:09.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:25:09.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:25:09.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:25:09.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-05-29T12:25:11.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-05-29T12:25:11.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:25:12.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:25:12.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:25:12.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:25:12.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:25:12.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:25:12.022 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:25:12.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:25:12.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:25:12.022 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:25:12.022 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:25:12.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:25:12.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:25:12.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:25:12.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:25:12.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:25:12.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:25:12.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:25:12.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:25:12.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:25:12.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:25:12.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:25:12.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:25:12.343 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:25:11
2026-05-29T12:25:12.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71830, datetime.datetime(2026, 5, 29, 12, 25, 11), datetime.datetime(2026, 5, 29, 12, 25, 11), 'salt', 13.0, 59.55, None, 19.27, 36.86, 7.68, 833.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:25:12.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:25:12.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:25:12.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:25:11, diff=1.349539s, valid=True
2026-05-29T12:25:12.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:25:12.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:25:12.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:25:12, diff=0.352369s, valid=True
2026-05-29T12:25:12.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:25:12.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:25:12.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:25:08, diff=4.358889s, valid=True
2026-05-29T12:25:12.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:25:12.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:25:12.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:25:12.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:25:12.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:25:12.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:25:12.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:25:12, diff=0.361925s, valid=True
2026-05-29T12:25:12.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:25:12.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:25:12.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:25:12.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982954.362574s, valid=True
2026-05-29T12:25:12.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:25:12.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:25:12.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:25:12.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:25:12.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:25:12.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:25:12.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:25:12.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:25:12.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:25:12.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:25:12.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:25:12.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:25:12.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:25:12.751 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:25:12.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:25:13.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:25:13.404 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:25:13.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:25:13.405 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:25:13.405 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:25:13.629 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:25:13.629 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:25:43.659 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:25:43.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:25:43.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:25:43.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:25:43.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:25:44.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:25:44.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T12:25:44.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:25:44.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-05-29T12:25:44.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:25:44.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:25:44.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:25:44.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T12:25:47.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-05-29T12:25:47.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:25:47.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:25:47.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:25:47.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:25:47.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:25:47.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:25:47.686 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:25:47.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:25:47.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:25:47.686 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:25:47.686 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:25:47.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:25:47.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:25:47.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:25:47.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:25:47.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:25:47.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:25:47.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:25:47.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:25:47.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:25:47.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:25:47.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:25:47.942 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:25:48.000 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:25:41
2026-05-29T12:25:48.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71831, datetime.datetime(2026, 5, 29, 12, 25, 41), datetime.datetime(2026, 5, 29, 12, 25, 41), 'salt', 13.13, 58.82, None, 17.11, 43.33, 7.86, 833.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:25:48.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:25:48.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:25:48.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:25:41, diff=7.007137s, valid=True
2026-05-29T12:25:48.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:25:48.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:25:48.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:26:12, diff=-23.989893s, valid=True
2026-05-29T12:25:48.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:25:48.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:25:48.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:25:39, diff=9.016922s, valid=True
2026-05-29T12:25:48.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:25:48.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:25:48.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:25:48.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:25:48.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:25:48.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:25:48.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:26:12, diff=-23.979977s, valid=True
2026-05-29T12:25:48.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:25:48.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:25:48.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:25:48.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=982990.020689s, valid=True
2026-05-29T12:25:48.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:25:48.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:25:48.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:25:48.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:25:48.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:25:48.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:25:48.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:25:48.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:25:48.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:25:48.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:25:48.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:25:48.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:25:48.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:25:48.341 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:25:48.551 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:25:48.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:25:48.996 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:25:48.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:25:48.996 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:25:48.996 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:25:49.064 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:25:49.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:26:19.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:26:19.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:26:19.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:26:19.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:26:19.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:26:19.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:26:19.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-05-29T12:26:19.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:26:19.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-05-29T12:26:19.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:26:19.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:26:19.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:26:19.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-05-29T12:26: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-05-29T12:26:22.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:26:22.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:26:22.332 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:26:22.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:26:22.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:26:22.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:26:22.356 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:26:22.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:26:22.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:26:22.356 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:26:22.356 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:26:22.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:26:22.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:26:22.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:26:22.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:26:22.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:26:22.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:26:22.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:26:22.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:26:22.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:26:22.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:26:22.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:26:22.627 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:26:22.686 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:26:11
2026-05-29T12:26:22.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71832, datetime.datetime(2026, 5, 29, 12, 26, 11), datetime.datetime(2026, 5, 29, 12, 26, 11), 'salt', 13.1, 57.79, None, 19.23, 27.73, 8.12, 833.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:26:22.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:26:22.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:26:22.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:26:11, diff=11.692663s, valid=True
2026-05-29T12:26:22.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:26:22.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:26:22.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:26:12, diff=10.695544s, valid=True
2026-05-29T12:26:22.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:26:22.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:26:22.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:26:09, diff=13.702161s, valid=True
2026-05-29T12:26:22.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:26:22.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:26:22.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:26:22.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:26:22.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:26:22.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:26:22.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:26:12, diff=10.705234s, valid=True
2026-05-29T12:26:22.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:26:22.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:26:22.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:26:22.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983024.705909s, valid=True
2026-05-29T12:26:22.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:26:22.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:26:22.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:26:22.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:26:22.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:26:22.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:26:22.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:26:22.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:26:22.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:26:22.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:26:22.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:26:23.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:26:23.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:26:23.092 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:26:23.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:26:23.647 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:26:23.748 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:26:23.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:26:23.748 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:26:23.748 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:26:23.986 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:26:23.986 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:26:53.988 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:26:53.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:26:53.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:26:54.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:26:54.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:26:54.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:26:54.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-05-29T12:26:54.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:26:54.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-05-29T12:26:54.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:26:54.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:26:54.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:26:54.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-05-29T12:26:57.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-05-29T12:26:57.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:26:57.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:26:57.109 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:26:57.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:26:57.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:26:57.131 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:26:57.131 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:26:57.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:26:57.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:26:57.131 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:26:57.131 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:26:57.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:26:57.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:26:57.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:26:57.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:26:57.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:26:57.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:26:57.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:26:57.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:26:57.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:26:57.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:26:57.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:26:57.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:26:57.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:26:42
2026-05-29T12:26:57.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71833, datetime.datetime(2026, 5, 29, 12, 26, 42), datetime.datetime(2026, 5, 29, 12, 26, 41), 'salt', 13.1, 57.93, None, 16.55, 22.64, 8.08, 833.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:26:57.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:26:57.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:26:57.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:26:41, diff=16.489779s, valid=True
2026-05-29T12:26:57.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:26:57.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:26:57.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:27:12, diff=-14.507358s, valid=True
2026-05-29T12:26:57.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:26:57.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:26:57.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:26:39, diff=18.499231s, valid=True
2026-05-29T12:26:57.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:26:57.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:26:57.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:26:57.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:26:57.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:26:57.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:26:57.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:27:12, diff=-14.497743s, valid=True
2026-05-29T12:26:57.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:26:57.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:26:57.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:26:57.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983059.502919s, valid=True
2026-05-29T12:26:57.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:26:57.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:26:57.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:26:57.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:26:57.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:26:57.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:26:57.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:26:57.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:26:57.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:26:57.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:26:57.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:26:57.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:26:57.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:26:57.839 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:26:58.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:26:58.425 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:26:58.535 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:26:58.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:26:58.535 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:26:58.535 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:26:58.699 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:26:58.699 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:27:28.720 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:27:28.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:27:28.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:27:29.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:27:29.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:27:29.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:27:29.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-05-29T12:27:29.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:27:29.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-05-29T12:27:29.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:27:29.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:27:29.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:27:29.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-05-29T12:27:31.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-05-29T12:27:31.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:27:31.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:27:31.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:27:31.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:27:31.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:27:31.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:27:31.990 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:27:31.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:27:31.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:27:31.990 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:27:31.990 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:27:31.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:27:32.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:27:32.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:27:32.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:27:32.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:27:32.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:27:32.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:27:32.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:27:32.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:27:32.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:27:32.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:27:32.248 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:27:32.307 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:27:12
2026-05-29T12:27:32.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71834, datetime.datetime(2026, 5, 29, 12, 27, 12), datetime.datetime(2026, 5, 29, 12, 27, 11), 'salt', 13.13, 56.9, None, 18.81, 42.63, 8.34, 833.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:27:32.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:27:32.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:27:32.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:27:11, diff=21.313187s, valid=True
2026-05-29T12:27:32.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:27:32.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:27:32.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:27:12, diff=20.316101s, valid=True
2026-05-29T12:27:32.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:27:32.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:27:32.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:27:09, diff=23.322824s, valid=True
2026-05-29T12:27:32.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:27:32.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:27:32.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:27:32.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:27:32.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:27:32.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:27:32.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:27:12, diff=20.325942s, valid=True
2026-05-29T12:27:32.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:27:32.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:27:32.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:27:32.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983094.326615s, valid=True
2026-05-29T12:27:32.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:27:32.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:27:32.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:27:32.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:27:32.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:27:32.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:27:32.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:27:32.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:27:32.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:27:32.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:27:32.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:27:32.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:27:32.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:27:32.712 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:27:32.923 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:27:33.269 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:27:33.371 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:27:33.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:27:33.372 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:27:33.372 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:27:33.614 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:27:33.615 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:28:03.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:28:03.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:28:03.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:28:03.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:28:03.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:28:04.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:28:04.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-05-29T12:28:04.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:28:04.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-05-29T12:28:04.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:28:04.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:28:04.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:28:04.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-05-29T12:28:06.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-05-29T12:28:06.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:28:06.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:28:06.662 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:28:06.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:28:06.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:28:06.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:28:06.684 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:28:06.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:28:06.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:28:06.685 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:28:06.686 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:28:06.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:28:06.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:28:06.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:28:06.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:28:06.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:28:06.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:28:06.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:28:06.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:28:06.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:28:06.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:28:06.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:28:06.991 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:28:07.053 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:27:42
2026-05-29T12:28:07.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71835, datetime.datetime(2026, 5, 29, 12, 27, 42), datetime.datetime(2026, 5, 29, 12, 27, 42), 'salt', 13.2, 56.5, None, 15.46, 45.09, 8.45, 833.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:28:07.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:28:07.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:28:07.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:27:42, diff=25.060344s, valid=True
2026-05-29T12:28:07.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:28:07.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:28:07.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:28:12, diff=-4.936731s, valid=True
2026-05-29T12:28:07.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:28:07.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:28:07.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:27:40, diff=27.071744s, valid=True
2026-05-29T12:28:07.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:28:07.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:28:07.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:28:07.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:28:07.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:28:07.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:28:07.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:28:12, diff=-4.92513s, valid=True
2026-05-29T12:28:07.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:28:07.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:28:07.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:28:07.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983129.075529s, valid=True
2026-05-29T12:28:07.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:28:07.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:28:07.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:28:07.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:28:07.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:28:07.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:28:07.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:28:07.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:28:07.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:28:07.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:28:07.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:28:07.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:28:07.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:28:07.414 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:28:07.632 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:28:07.977 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:28:08.077 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:28:08.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:28:08.078 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:28:08.078 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:28:08.249 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:28:08.249 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:28:38.256 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:28:38.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:28:38.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:28:38.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:28:38.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:28:38.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:28:38.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-05-29T12:28:38.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:28:38.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-05-29T12:28:38.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:28:38.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:28:38.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:28:38.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-05-29T12:28:41.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-05-29T12:28:41.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:28:41.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:28:41.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:28:41.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:28:41.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:28:41.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:28:41.610 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:28:41.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:28:41.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:28:41.611 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:28:41.611 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:28:41.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:28:41.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:28:41.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:28:41.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:28:41.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:28:41.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:28:41.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:28:41.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:28:41.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:28:41.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:28:41.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:28:41.873 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:28:41.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:28:12
2026-05-29T12:28:41.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71836, datetime.datetime(2026, 5, 29, 12, 28, 12), datetime.datetime(2026, 5, 29, 12, 28, 11), 'salt', 13.4, 57.4, None, 15.35, 40.24, 8.24, 833.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:28:41.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:28:41.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:28:41.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:28:11, diff=30.938088s, valid=True
2026-05-29T12:28:41.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:28:41.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:28:41.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:28:12, diff=29.940925s, valid=True
2026-05-29T12:28:41.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:28:41.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:28:41.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:28:11, diff=30.947504s, valid=True
2026-05-29T12:28:41.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:28:41.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:28:41.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:28:41.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:28:41.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:28:41.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:28:41.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:28:12, diff=29.950486s, valid=True
2026-05-29T12:28:41.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:28:41.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:28:41.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:28:41.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983163.951143s, valid=True
2026-05-29T12:28:41.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:28:41.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:28:41.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:28:41.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:28:41.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:28:42.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:28:42.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:28:42.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:28:42.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:28:42.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:28:42.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:28:42.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:28:42.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:28:42.269 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:28:42.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:28:42.827 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:28:42.928 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:28:42.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:28:42.928 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:28:42.928 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:28:43.092 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:28:43.092 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:29:13.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:29:13.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:29:13.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:29:13.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:29:13.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:29:13.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:29:13.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-05-29T12:29:13.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:29:13.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-05-29T12:29:13.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:29:13.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:29:13.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:29:13.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-05-29T12:29: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-05-29T12:29:16.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:29:16.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:29:16.096 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:29:16.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:29:16.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:29:16.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:29:16.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:29:16.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:29:16.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:29:16.117 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:29:16.117 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:29:16.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:29:16.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:29:16.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:29:16.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:29:16.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:29:16.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:29:16.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:29:16.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:29:16.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:29:16.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:29:16.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:29:16.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:29:16.440 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:29:13
2026-05-29T12:29:16.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71838, datetime.datetime(2026, 5, 29, 12, 29, 13), datetime.datetime(2026, 5, 29, 12, 29, 12), 'salt', 13.4, 56.86, None, 16.69, 40.96, 8.37, 833.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:29:16.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:29:16.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:29:16.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:29:12, diff=4.446287s, valid=True
2026-05-29T12:29:16.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:29:16.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:29:16.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:29:12, diff=4.449129s, valid=True
2026-05-29T12:29:16.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:29:16.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:29:16.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:29:10, diff=6.455752s, valid=True
2026-05-29T12:29:16.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:29:16.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:29:16.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:29:16.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:29:16.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:29:16.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:29:16.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:29:12, diff=4.458871s, valid=True
2026-05-29T12:29:16.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:29:16.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:29:16.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:29:16.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983198.459529s, valid=True
2026-05-29T12:29:16.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:29:16.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:29:16.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:29:16.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:29:16.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:29:16.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:29:16.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:29:16.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:29:16.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:29:16.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:29:16.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:29:16.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:29:16.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:29:16.796 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:29:17.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:29:17.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:29:17.542 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:29:17.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:29:17.542 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:29:17.542 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:29:17.796 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:29:17.796 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:29:47.825 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:29:47.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:29:47.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:29:48.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:29:48.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:29:48.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:29:48.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-05-29T12:29:48.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:29:48.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-05-29T12:29:48.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:29:48.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:29:48.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:29:48.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-05-29T12:29:51.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T12:29:51.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:29:51.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:29:51.111 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:29:51.112 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:29:51.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:29:51.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:29:51.135 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:29:51.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:29:51.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:29:51.135 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:29:51.135 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:29:51.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:29:51.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:29:51.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:29:51.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:29:51.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:29:51.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:29:51.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:29:51.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:29:51.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:29:51.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:29:51.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:29:51.406 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:29:51.505 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:29:43
2026-05-29T12:29:51.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71839, datetime.datetime(2026, 5, 29, 12, 29, 43), datetime.datetime(2026, 5, 29, 12, 29, 43), 'salt', 13.26, 56.96, None, 13.27, 41.67, 8.33, 833.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:29:51.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:29:51.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:29:51.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:29:43, diff=8.511762s, valid=True
2026-05-29T12:29:51.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:29:51.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:29:51.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:30:12, diff=-20.485345s, valid=True
2026-05-29T12:29:51.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:29:51.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:29:51.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:29:41, diff=10.521407s, valid=True
2026-05-29T12:29:51.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:29:51.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:29:51.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:29:51.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:29:51.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:29:51.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:29:51.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:30:12, diff=-20.475497s, valid=True
2026-05-29T12:29:51.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:29:51.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:29:51.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:29:51.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983233.525171s, valid=True
2026-05-29T12:29:51.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:29:51.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:29:51.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:29:51.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:29:51.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:29:51.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:29:51.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:29:51.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:29:51.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:29:51.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:29:51.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:29:51.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:29:51.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:29:51.859 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:29:52.082 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:29:52.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:29:52.538 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:29:52.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:29:52.539 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:29:52.539 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:29:52.733 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:29:52.733 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:30:22.763 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:30:22.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:30:22.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:30:23.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:30:23.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:30:23.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:30:23.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-05-29T12:30:23.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:30:23.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-05-29T12:30:23.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:30:23.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:30:23.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:30:23.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-05-29T12:30:25.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-05-29T12:30:25.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:30:25.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:30:25.903 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:30:25.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:30:25.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:30:25.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:30:25.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:30:25.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:30:25.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:30:25.924 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:30:25.924 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:30:25.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:30:26.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:30:26.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:30:26.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:30:26.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:30:26.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:30:26.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:30:26.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:30:26.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:30:26.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:30:26.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:30:26.193 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:30:26.259 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:30:13
2026-05-29T12:30:26.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71840, datetime.datetime(2026, 5, 29, 12, 30, 13), datetime.datetime(2026, 5, 29, 12, 30, 13), 'salt', 13.23, 58.32, None, 15.74, 50.89, 7.99, 833.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:30:26.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:30:26.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:30:26.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:30:13, diff=13.269074s, valid=True
2026-05-29T12:30:26.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:30:26.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:30:26.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:30:12, diff=14.271974s, valid=True
2026-05-29T12:30:26.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:30:26.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:30:26.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:30:11, diff=15.278736s, valid=True
2026-05-29T12:30:26.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:30:26.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:30:26.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:30:26.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:30:26.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:30:26.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:30:26.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:30:12, diff=14.28178s, valid=True
2026-05-29T12:30:26.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:30:26.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:30:26.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:30:26.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983268.282429s, valid=True
2026-05-29T12:30:26.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:30:26.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:30:26.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:30:26.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:30:26.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:30:26.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:30:26.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:30:26.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:30:26.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:30:26.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:30:26.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:30:26.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:30:26.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:30:26.616 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:30:26.914 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:30:27.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:30:27.381 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:30:27.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:30: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-05-29T12:30: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-05-29T12:30:27.551 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:30:27.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:30:57.581 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:30:57.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:30:57.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:30:58.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:30:58.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:30:58.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:30:58.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-05-29T12:30:58.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:30:58.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-05-29T12:30:58.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:30:58.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:30:58.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:30:58.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-05-29T12:31:00.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-05-29T12:31:00.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:31:00.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:31:00.964 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:31:00.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:31:00.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:31:00.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:31:00.985 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:31:00.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:31:00.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:31:00.986 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:31:00.986 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:31:00.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:31:01.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:31:01.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:31:01.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:31:01.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:31:01.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:31:01.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:31:01.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:31:01.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:31:01.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:31:01.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:31:01.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:31:01.303 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:30:44
2026-05-29T12:31:01.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71841, datetime.datetime(2026, 5, 29, 12, 30, 44), datetime.datetime(2026, 5, 29, 12, 30, 43), 'salt', 13.16, 58.56, None, 14.43, 48.94, 7.93, 833.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:31:01.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:31:01.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:31:01.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:30:43, diff=18.30981s, valid=True
2026-05-29T12:31:01.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:31:01.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:31:01.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:31:12, diff=-10.687331s, valid=True
2026-05-29T12:31:01.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:31:01.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:31:01.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:30:41, diff=20.319238s, valid=True
2026-05-29T12:31:01.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:31:01.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:31:01.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:31:01.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:31:01.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:31:01.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:31:01.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:31:12, diff=-10.677717s, valid=True
2026-05-29T12:31:01.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:31:01.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:31:01.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:31:01.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983303.322953s, valid=True
2026-05-29T12:31:01.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:31:01.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:31:01.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:31:01.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:31:01.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:31:01.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:31:01.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:31:01.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:31:01.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:31:01.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:31:01.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:31:01.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:31:01.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:31:01.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:31:01.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:31:02.261 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:31:02.364 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:31:02.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:31:02.364 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:31:02.365 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:31:02.526 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:31:02.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:31:32.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:31:32.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:31:32.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:31:32.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:31:32.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:31:33.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:31:33.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-05-29T12:31:33.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:31:33.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-05-29T12:31:33.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:31:33.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:31:33.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:31:33.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-05-29T12:31:36.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-05-29T12:31:36.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:31:36.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:31:36.507 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:31:36.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:31:36.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:31:36.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:31:36.526 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:31:36.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:31:36.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:31:36.527 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:31:36.527 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:31:36.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:31:36.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:31:36.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:31:36.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:31:36.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:31:36.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:31:36.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:31:36.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:31:36.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:31:36.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:31:36.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:31:36.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:31:36.854 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:31:14
2026-05-29T12:31:36.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71842, datetime.datetime(2026, 5, 29, 12, 31, 14), datetime.datetime(2026, 5, 29, 12, 31, 13), 'salt', 13.26, 60.31, None, 17.54, 45.16, 7.51, 833.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:31:36.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:31:36.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:31:36.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:31:13, diff=23.860225s, valid=True
2026-05-29T12:31:36.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:31:36.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:31:36.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:31:12, diff=24.863113s, valid=True
2026-05-29T12:31:36.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:31:36.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:31:36.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:31:12, diff=24.86982s, valid=True
2026-05-29T12:31:36.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:31:36.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:31:36.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:31:36.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:31:36.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:31:36.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:31:36.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:31:12, diff=24.872882s, valid=True
2026-05-29T12:31:36.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:31:36.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:31:36.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:31:36.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983338.873525s, valid=True
2026-05-29T12:31:36.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:31:36.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:31:36.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:31:36.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:31:36.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:31:36.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:31:36.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:31:36.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:31:36.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:31:37.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:31:37.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:31:37.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:31:37.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:31:37.189 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:31:37.470 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:31:37.813 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:31:37.913 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:31:37.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:31:37.913 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:31:37.913 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:31:38.087 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:31:38.087 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:32:08.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:32:08.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:32:08.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:32:08.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:32:08.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:32:08.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:32:08.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-05-29T12:32:08.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:32:08.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-05-29T12:32:08.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:32:08.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:32:08.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:32:08.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-05-29T12:32:11.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-05-29T12:32:11.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:32:11.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:32:11.594 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:32:11.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:32:11.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:32:11.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:32:11.615 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:32:11.615 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:32:11.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:32:11.615 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:32:11.616 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:32:11.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:32:11.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:32:11.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:32:11.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:32:11.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:32:11.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:32:11.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:32:11.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:32:11.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:32:11.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:32:11.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:32:11.886 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:32:11.947 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:31:44
2026-05-29T12:32:11.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71843, datetime.datetime(2026, 5, 29, 12, 31, 44), datetime.datetime(2026, 5, 29, 12, 31, 44), 'salt', 13.33, 59.78, None, 18.46, 44.46, 7.64, 833.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:32:11.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:32:11.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:32:11.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:31:44, diff=27.956474s, valid=True
2026-05-29T12:32:11.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:32:11.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:32:11.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:32:12, diff=-0.040594s, valid=True
2026-05-29T12:32:11.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:32:11.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:32:11.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:31:42, diff=29.969877s, valid=True
2026-05-29T12:32:11.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:32:11.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:32:11.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:32:11.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:32:11.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:32:11.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:32:11.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:32:12, diff=-0.026941s, valid=True
2026-05-29T12:32:11.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:32:11.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:32:11.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:32:11.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983373.973743s, valid=True
2026-05-29T12:32:11.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:32:11.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:32:11.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:32:11.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:32:11.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:32:12.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:32:12.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:32:12.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:32:12.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:32:12.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:32:12.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:32:12.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:32:12.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:32:12.308 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:32:12.532 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:32:12.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:32:12.996 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:32:12.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:32:12.997 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:32:12.997 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:32:13.247 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:32:13.247 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:32:43.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:32:43.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:32:43.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:32:43.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:32:43.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:32:43.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:32:43.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-05-29T12:32:43.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:32:43.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-05-29T12:32:43.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:32:43.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:32:43.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:32:43.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-05-29T12:32:46.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-05-29T12:32:46.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:32:46.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:32:46.441 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:32:46.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:32:46.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:32:46.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:32:46.461 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:32:46.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:32:46.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:32:46.461 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:32:46.461 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:32:46.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:32:46.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:32:46.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:32:46.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:32:46.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:32:46.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:32:46.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:32:46.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:32:46.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:32:46.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:32:46.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:32:46.728 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:32:46.790 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:32:44
2026-05-29T12:32:46.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71845, datetime.datetime(2026, 5, 29, 12, 32, 44), datetime.datetime(2026, 5, 29, 12, 32, 44), 'salt', 13.63, 59.48, None, 16.97, 47.91, 7.73, 833.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:32:46.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:32:46.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:32:46.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:32:44, diff=2.797087s, valid=True
2026-05-29T12:32:46.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:32:46.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:32:46.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:33:12, diff=-25.200056s, valid=True
2026-05-29T12:32:46.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:32:46.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:32:46.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:32:44, diff=2.806596s, valid=True
2026-05-29T12:32:46.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:32:46.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:32:46.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:32:46.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:32:46.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:32:46.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:32:46.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:33:12, diff=-25.190361s, valid=True
2026-05-29T12:32:46.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:32:46.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:32:46.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:32:46.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983408.810292s, valid=True
2026-05-29T12:32:46.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:32:46.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:32:46.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:32:46.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:32:46.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:32:46.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:32:46.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:32:46.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:32:46.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:32:46.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:32:47.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:32:47.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:32:47.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:32:47.214 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:32:47.431 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:32:47.779 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:32:47.884 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:32:47.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:32:47.885 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:32:47.885 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:32:47.957 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:32:47.957 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:33:17.982 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:33:17.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:33:17.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:33:18.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:33:18.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:33:18.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:33:18.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T12:33:18.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:33:18.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-05-29T12:33:18.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:33:18.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:33:18.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:33:18.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-05-29T12:33:21.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-05-29T12:33:21.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:33:21.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:33:21.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:33:21.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:33:21.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:33:21.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:33:21.603 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:33:21.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:33:21.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:33:21.603 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:33:21.603 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:33:21.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:33:21.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:33:21.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:33:21.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:33:21.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:33:21.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:33:21.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:33:21.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:33:21.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:33:21.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:33:21.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:33:21.870 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:33:21.930 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:33:15
2026-05-29T12:33:21.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71846, datetime.datetime(2026, 5, 29, 12, 33, 15), datetime.datetime(2026, 5, 29, 12, 33, 14), 'salt', 13.59, 58.89, None, 19.2, 51.59, 7.87, 833.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:33:21.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:33:21.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:33:21.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:33:14, diff=7.936808s, valid=True
2026-05-29T12:33:21.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:33:21.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:33:21.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:33:12, diff=9.939721s, valid=True
2026-05-29T12:33:21.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:33:21.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:33:21.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:33:13, diff=8.946552s, valid=True
2026-05-29T12:33:21.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:33:21.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:33:21.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:33:21.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:33:21.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:33:21.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:33:21.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:33:12, diff=9.949818s, valid=True
2026-05-29T12:33:21.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:33:21.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:33:21.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:33:21.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983443.950515s, valid=True
2026-05-29T12:33:21.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:33:21.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:33:21.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:33:21.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:33:21.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:33:22.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:33:22.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:33:22.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:33:22.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:33:22.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:33:22.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:33:22.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:33:22.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:33:22.288 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:33:22.572 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:33:22.953 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:33:23.055 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:33:23.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:33:23.055 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:33:23.055 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:33:23.302 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:33:23.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:33:53.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:33:53.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:33:53.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:33:53.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:33:53.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:33:53.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:33:53.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-05-29T12:33:53.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:33:53.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-05-29T12:33:53.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:33:53.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:33:53.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:33:53.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-05-29T12:33:56.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-05-29T12:33:56.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:33:56.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:33:56.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:33:56.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:33:56.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:33:56.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:33:56.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:33:56.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:33:56.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:33:56.441 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:33:56.441 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:33:56.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:33:56.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:33:56.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:33:56.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:33:56.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:33:56.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:33:56.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:33:56.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:33:56.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:33:56.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:33:56.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:33:56.699 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:33:56.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:33:45
2026-05-29T12:33:56.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71847, datetime.datetime(2026, 5, 29, 12, 33, 45), datetime.datetime(2026, 5, 29, 12, 33, 44), 'salt', 13.56, 58.42, None, 17.93, 44.22, 7.99, 833.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:33:56.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:33:56.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:33:56.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:33:44, diff=12.764595s, valid=True
2026-05-29T12:33:56.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:33:56.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:33:56.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:34:12, diff=-15.232549s, valid=True
2026-05-29T12:33:56.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:33:56.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:33:56.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:33:43, diff=13.774164s, valid=True
2026-05-29T12:33:56.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:33:56.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:33:56.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:33:56.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:33:56.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:33:56.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:33:56.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:34:12, diff=-15.222756s, valid=True
2026-05-29T12:33:56.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:33:56.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:33:56.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:33:56.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983478.777909s, valid=True
2026-05-29T12:33:56.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:33:56.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:33:56.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:33:56.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:33:56.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:33:56.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:33:56.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:33:56.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:33:56.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:33:56.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:33:57.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:33:57.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:33:57.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:33:57.169 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:33:57.386 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:33:57.733 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:33:57.837 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:33:57.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:33:57.837 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:33:57.837 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:33:58.069 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:33:58.069 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:34:28.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:34:28.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:34:28.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:34:28.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:34:28.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:34:28.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:34:28.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-05-29T12:34:28.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:34:28.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T12:34:28.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:34:28.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:34:28.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:34:28.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-05-29T12:34:31.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-05-29T12:34:31.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:34:31.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:34:31.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:34:31.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:34:31.306 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:34:31.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:34:31.318 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:34:31.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:34:31.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:34:31.318 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:34:31.318 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:34:31.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:34:31.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:34:31.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:34:31.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:34:31.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:34:31.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:34:31.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:34:31.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:34:31.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:34:31.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:34:31.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:34:31.580 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:34:31.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:34:15
2026-05-29T12:34:31.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71848, datetime.datetime(2026, 5, 29, 12, 34, 15), datetime.datetime(2026, 5, 29, 12, 34, 15), 'salt', 13.33, 57.16, None, 23.04, 48.02, 8.29, 833.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:34:31.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:34:31.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:34:31.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:34:15, diff=16.644449s, valid=True
2026-05-29T12:34:31.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:34:31.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:34:31.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:34:12, diff=19.647375s, valid=True
2026-05-29T12:34:31.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:34:31.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:34:31.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:34:13, diff=18.654142s, valid=True
2026-05-29T12:34:31.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:34:31.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:34:31.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:34:31.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:34:31.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:34:31.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:34:31.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:34:12, diff=19.657222s, valid=True
2026-05-29T12:34:31.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:34:31.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:34:31.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:34:31.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983513.657895s, valid=True
2026-05-29T12:34:31.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:34:31.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:34:31.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:34:31.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:34:31.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:34:31.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:34:31.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:34:31.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:34:31.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:34:31.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:34:31.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:34:31.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:34:31.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:34:31.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:34:32.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:34:32.538 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:34:32.641 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:34:32.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:34:32.641 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:34:32.641 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:34:32.857 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:34:32.857 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:35:02.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:35:02.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:35:02.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:35:02.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:35:03.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:35:03.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:35:03.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-05-29T12:35:03.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:35:03.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-05-29T12:35:03.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:35:03.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:35:03.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:35:03.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-05-29T12:35: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-05-29T12:35:06.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:35:06.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:35:06.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:35:06.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:35:06.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:35:06.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:35:06.777 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:35:06.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:35:06.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:35:06.777 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:35:06.777 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:35:06.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:35:06.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:35:06.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:35:06.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:35:06.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:35:06.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:35:06.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:35:07.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:35:07.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:35:07.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:35:07.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:35:07.034 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:35:07.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:34:45
2026-05-29T12:35:07.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71849, datetime.datetime(2026, 5, 29, 12, 34, 45), datetime.datetime(2026, 5, 29, 12, 34, 45), 'salt', 13.26, 57.06, None, 23.64, 48.47, 8.31, 833.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:35:07.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:35:07.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:35:07.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:34:45, diff=22.102796s, valid=True
2026-05-29T12:35:07.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:35:07.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:35:07.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:35:12, diff=-4.894429s, valid=True
2026-05-29T12:35:07.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:35:07.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:35:07.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:34:44, diff=23.11206s, valid=True
2026-05-29T12:35:07.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:35:07.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:35:07.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:35:07.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:35:07.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:35:07.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:35:07.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:35:12, diff=-4.884969s, valid=True
2026-05-29T12:35:07.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:35:07.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:35:07.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:35:07.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983549.115673s, valid=True
2026-05-29T12:35:07.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:35:07.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:35:07.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:35:07.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:35:07.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:35:07.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:35:07.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:35:07.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:35:07.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:35:07.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:35:07.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:35:07.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:35:07.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:35:07.442 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:35:07.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:35:08.020 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:35:08.122 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:35:08.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:35:08.122 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:35:08.122 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:35:08.274 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:35:08.274 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:35:38.283 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:35:38.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:35:38.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:35:39.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:35:39.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:35:39.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:35:39.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-05-29T12:35:39.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:35:39.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-05-29T12:35:39.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:35:39.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:35:39.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:35:39.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-05-29T12:35:41.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-05-29T12:35:41.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:35:41.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:35:41.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:35:41.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:35:41.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:35:41.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:35:41.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:35:41.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:35:41.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:35:41.915 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:35:41.915 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:35:41.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:35:42.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:35:42.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:35:42.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:35:42.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:35:42.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:35:42.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:35:42.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:35:42.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:35:42.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:35:42.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:35:42.168 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:35:42.229 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:35:15
2026-05-29T12:35:42.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71850, datetime.datetime(2026, 5, 29, 12, 35, 15), datetime.datetime(2026, 5, 29, 12, 35, 15), 'salt', 13.0, 58.26, None, 17.68, 44.55, 8.0, 833.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:35:42.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:35:42.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:35:42.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:35:15, diff=27.23578s, valid=True
2026-05-29T12:35:42.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:35:42.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:35:42.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:35:12, diff=30.238653s, valid=True
2026-05-29T12:35:42.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:35:42.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:35:42.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:35:14, diff=28.245266s, valid=True
2026-05-29T12:35:42.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:35:42.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:35:42.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:35:42.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:35:42.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:35:42.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:35:42.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:35:12, diff=30.248276s, valid=True
2026-05-29T12:35:42.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:35:42.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:35:42.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:35:42.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983584.248939s, valid=True
2026-05-29T12:35:42.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:35:42.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:35:42.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:35:42.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:35:42.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:35:42.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:35:42.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:35:42.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:35:42.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:35:42.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:35:42.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:35:42.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:35:42.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:35:42.564 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:35:42.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:35:43.120 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:35:43.219 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:35:43.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:35:43.219 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:35:43.219 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:35:43.389 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:35:43.389 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:36:13.419 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:36:13.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:36:13.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:36:13.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:36:13.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:36:14.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:36:14.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-05-29T12:36:14.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:36:14.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-05-29T12:36:14.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:36:14.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:36:14.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:36:14.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-05-29T12:36:16.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-05-29T12:36:16.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:36:16.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:36:16.789 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:36:16.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:36:16.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:36:16.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:36:16.810 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:36:16.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:36:16.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:36:16.811 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:36:16.811 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:36:16.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:36:16.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:36:16.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:36:17.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:36:17.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:36:17.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:36:17.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:36:17.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:36:17.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:36:17.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:36:17.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:36:17.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:36:17.167 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:36:16
2026-05-29T12:36:17.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71852, datetime.datetime(2026, 5, 29, 12, 36, 16), datetime.datetime(2026, 5, 29, 12, 36, 16), 'salt', 13.03, 59.32, None, 16.8, 43.14, 7.74, 833.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:36:17.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:36:17.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:36:17.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:36:16, diff=1.173906s, valid=True
2026-05-29T12:36:17.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:36:17.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:36:17.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:36:12, diff=5.176756s, valid=True
2026-05-29T12:36:17.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:36:17.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:36:17.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:36:15, diff=2.183324s, valid=True
2026-05-29T12:36:17.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:36:17.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:36:17.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:36:17.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:36:17.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:36:17.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:36:17.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:36:12, diff=5.186343s, valid=True
2026-05-29T12:36:17.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:36:17.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:36:17.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:36:17.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983619.186997s, valid=True
2026-05-29T12:36:17.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:36:17.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:36:17.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:36:17.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:36:17.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:36:17.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:36:17.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:36:17.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:36:17.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:36:17.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:36:17.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:36:17.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:36:17.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:36:17.511 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:36:17.743 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:36:18.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:36:18.212 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:36:18.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:36:18.212 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:36:18.212 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:36:18.463 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:36:18.463 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:36:48.469 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:36:48.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:36:48.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:36:48.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:36:48.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:36:48.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:36:48.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-05-29T12:36:48.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:36:48.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T12:36:48.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:36:48.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:36:48.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:36:48.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-05-29T12:36:51.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-05-29T12:36:51.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:36:51.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:36:51.594 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:36:51.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:36:51.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:36:51.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:36:51.676 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:36:51.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:36:51.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:36:51.677 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:36:51.677 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:36:51.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:36:51.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:36:51.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:36:51.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:36:51.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:36:51.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:36:51.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:36:51.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:36:51.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:36:51.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:36:51.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:36:51.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:36:51.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:36:46
2026-05-29T12:36:51.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71853, datetime.datetime(2026, 5, 29, 12, 36, 46), datetime.datetime(2026, 5, 29, 12, 36, 46), 'salt', 13.0, 57.86, None, 13.69, 40.71, 8.1, 833.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:36:51.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:36:51.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:36:52.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:36:46, diff=6.001997s, valid=True
2026-05-29T12:36:52.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:36:52.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:36:52.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:37:12, diff=-19.995109s, valid=True
2026-05-29T12:36:52.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:36:52.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:36:52.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:36:45, diff=7.011441s, valid=True
2026-05-29T12:36:52.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:36:52.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:36:52.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:36:52.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:36:52.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:36:52.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:36:52.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:37:12, diff=-19.985495s, valid=True
2026-05-29T12:36:52.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:36:52.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:36:52.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:36:52.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983654.015162s, valid=True
2026-05-29T12:36:52.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:36:52.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:36:52.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:36:52.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:36:52.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:36:52.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:36:52.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:36:52.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:36:52.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:36:52.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:36:52.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:36:52.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:36:52.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:36:52.331 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:36:52.562 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:36:52.966 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:36:53.067 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:36:53.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:36:53.067 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:36:53.067 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:36:53.310 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:36:53.310 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:37:23.341 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:37:23.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:37:23.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:37:23.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:37:23.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:37:23.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:37:23.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-05-29T12:37:23.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:37:23.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-05-29T12:37:23.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:37:23.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:37:23.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:37:23.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-05-29T12:37:26.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-05-29T12:37:26.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:37:26.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:37:26.509 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:37:26.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:37:26.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:37:26.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:37:26.530 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:37:26.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:37:26.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:37:26.530 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:37:26.530 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:37:26.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:37:26.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:37:26.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:37:26.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:37:26.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:37:26.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:37:26.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:37:26.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:37:26.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:37:26.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:37:26.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:37:26.814 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:37:26.876 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:37:16
2026-05-29T12:37:26.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71854, datetime.datetime(2026, 5, 29, 12, 37, 16), datetime.datetime(2026, 5, 29, 12, 37, 16), 'salt', 12.86, 57.99, None, 12.77, 29.75, 8.05, 833.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:37:26.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:37:26.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:37:26.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:37:16, diff=10.882528s, valid=True
2026-05-29T12:37:26.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:37:26.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:37:26.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:37:12, diff=14.885419s, valid=True
2026-05-29T12:37:26.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:37:26.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:37:26.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:37:16, diff=10.892085s, valid=True
2026-05-29T12:37:26.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:37:26.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:37:26.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:37:26.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:37:26.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:37:26.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:37:26.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:37:12, diff=14.895181s, valid=True
2026-05-29T12:37:26.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:37:26.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:37:26.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:37:26.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983688.895857s, valid=True
2026-05-29T12:37:26.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:37:26.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:37:26.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:37:26.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:37:26.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:37:26.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:37:26.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:37:26.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:37:26.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:37:27.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:37:27.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:37:27.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:37:27.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:37:27.211 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:37:27.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:37:27.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:37:27.845 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:37:27.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:37:27.845 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:37:27.845 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:37:28.103 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:37:28.103 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:37:58.106 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:37:58.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:37:58.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:37:58.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:37:58.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:37:58.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:37:58.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-05-29T12:37:58.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:37:58.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-05-29T12:37:58.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:37:58.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:37:58.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:37:58.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-05-29T12:38:01.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-05-29T12:38:01.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:38:01.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:38:01.094 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:38:01.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:38:01.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:38:01.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:38:01.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:38:01.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:38:01.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:38:01.116 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:38:01.116 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:38:01.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:38:01.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:38:01.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:38:01.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:38:01.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:38:01.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:38:01.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:38:01.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:38:01.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:38:01.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:38:01.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:38:01.375 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:38:01.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:37:47
2026-05-29T12:38:01.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71855, datetime.datetime(2026, 5, 29, 12, 37, 47), datetime.datetime(2026, 5, 29, 12, 37, 46), 'salt', 13.13, 60.31, None, 15.95, 73.76, 7.5, 833.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:38:01.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:38:01.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:38:01.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:37:46, diff=15.442569s, valid=True
2026-05-29T12:38:01.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:38:01.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:38:01.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:38:12, diff=-10.554576s, valid=True
2026-05-29T12:38:01.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:38:01.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:38:01.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:37:45, diff=16.452014s, valid=True
2026-05-29T12:38:01.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:38:01.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:38:01.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:38:01.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:38:01.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:38:01.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:38:01.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:38:12, diff=-10.54497s, valid=True
2026-05-29T12:38:01.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:38:01.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:38:01.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:38:01.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983723.455706s, valid=True
2026-05-29T12:38:01.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:38:01.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:38:01.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:38:01.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:38:01.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:38:01.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:38:01.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:38:01.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:38:01.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:38:01.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:38:01.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:38:01.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:38:01.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:38:01.828 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:38:02.115 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:38:02.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:38:02.563 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:38:02.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:38: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-05-29T12:38: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-05-29T12:38:02.816 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:38:02.817 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:38:32.847 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:38:32.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:38:32.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:38:33.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:38:33.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:38:33.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:38:33.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-05-29T12:38:33.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:38:33.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-05-29T12:38:33.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:38:33.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:38:33.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:38:33.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-05-29T12:38:36.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-05-29T12:38:36.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:38:36.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:38:36.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:38:36.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:38:36.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:38:36.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:38:36.109 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:38:36.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:38:36.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:38:36.110 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:38:36.110 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:38:36.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:38:36.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:38:36.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:38:36.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:38:36.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:38:36.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:38:36.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:38:36.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:38:36.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:38:36.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:38:36.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:38:36.366 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:38:36.425 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:38:17
2026-05-29T12:38:36.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71856, datetime.datetime(2026, 5, 29, 12, 38, 17), datetime.datetime(2026, 5, 29, 12, 38, 16), 'salt', 13.16, 59.55, None, 19.87, 55.3, 7.69, 833.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:38:36.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:38:36.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:38:36.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:38:16, diff=20.431538s, valid=True
2026-05-29T12:38:36.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:38:36.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:38:36.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:38:12, diff=24.4344s, valid=True
2026-05-29T12:38:36.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:38:36.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:38:36.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:38:16, diff=20.441054s, valid=True
2026-05-29T12:38:36.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:38:36.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:38:36.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:38:36.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:38:36.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:38:36.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:38:36.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:38:12, diff=24.444117s, valid=True
2026-05-29T12:38:36.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:38:36.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:38:36.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:38:36.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983758.444793s, valid=True
2026-05-29T12:38:36.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:38:36.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:38:36.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:38:36.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:38:36.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:38:36.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:38:36.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:38:36.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:38:36.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:38:36.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:38:36.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:38:36.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:38:36.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:38:36.762 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:38:36.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:38:37.308 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:38:37.404 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:38:37.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:38:37.404 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:38:37.404 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:38:37.604 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:38:37.604 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:39:07.615 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:39:07.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:39:07.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:39:08.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:39:08.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:39:08.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:39:08.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T12:39:08.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:39: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-05-29T12:39:08.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:39:08.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:39:08.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:39:08.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-05-29T12:39:11.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-05-29T12:39:11.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:39:11.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:39:11.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:39:11.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:39:11.018 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:39:11.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:39:11.030 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:39:11.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:39:11.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:39:11.030 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:39:11.030 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:39:11.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:39:11.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:39:11.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:39:11.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:39:11.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:39:11.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:39:11.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:39:11.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:39:11.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:39:11.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:39:11.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:39:11.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:39:11.343 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:38:47
2026-05-29T12:39:11.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71857, datetime.datetime(2026, 5, 29, 12, 38, 47), datetime.datetime(2026, 5, 29, 12, 38, 47), 'salt', 13.03, 58.65, None, 15.99, 39.63, 7.9, 833.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:39:11.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:39:11.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:39:11.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:38:47, diff=24.349151s, valid=True
2026-05-29T12:39:11.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:39:11.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:39:11.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:39:12, diff=-0.647975s, valid=True
2026-05-29T12:39:11.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:39:11.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:39:11.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:38:46, diff=25.358691s, valid=True
2026-05-29T12:39:11.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:39:11.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:39:11.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:39:11.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:39:11.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:39:11.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:39:11.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:39:12, diff=-0.638238s, valid=True
2026-05-29T12:39:11.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:39:11.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:39:11.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:39:11.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983793.362416s, valid=True
2026-05-29T12:39:11.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:39:11.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:39:11.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:39:11.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:39:11.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:39:11.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:39:11.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:39:11.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:39:11.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:39:11.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:39:11.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:39:11.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:39:11.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:39:11.757 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:39:11.964 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:39:12.302 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:39:12.405 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:39:12.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:39:12.405 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:39:12.405 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:39:12.573 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:39:12.573 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:39:42.576 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:39:42.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:39:42.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:39:43.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:39:43.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:39:43.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:39:43.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-05-29T12:39:43.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:39:43.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-05-29T12:39:43.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:39:43.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:39:43.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:39:43.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-05-29T12:39:45.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-05-29T12:39:45.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:39:45.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:39:45.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:39:45.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:39:45.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:39:45.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:39:45.935 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:39:45.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:39:45.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:39:45.936 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:39:45.936 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:39:45.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:39:46.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:39:46.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:39:46.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:39:46.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:39:46.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:39:46.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:39:46.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:39:46.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:39:46.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:39:46.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:39:46.209 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:39:46.267 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:39:17
2026-05-29T12:39:46.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71858, datetime.datetime(2026, 5, 29, 12, 39, 17), datetime.datetime(2026, 5, 29, 12, 39, 17), 'salt', 13.2, 59.08, None, 17.11, 38.85, 7.81, 833.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:39:46.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:39:46.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:39:46.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:39:17, diff=29.274173s, valid=True
2026-05-29T12:39:46.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:39:46.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:39:46.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:39:12, diff=34.277031s, valid=True
2026-05-29T12:39:46.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:39:46.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:39:46.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:39:16, diff=30.283681s, valid=True
2026-05-29T12:39:46.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:39:46.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:39:46.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:39:46.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:39:46.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:39:46.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:39:46.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:39:12, diff=34.28675s, valid=True
2026-05-29T12:39:46.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:39:46.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:39:46.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:39:46.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983828.287407s, valid=True
2026-05-29T12:39:46.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:39:46.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:39:46.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:39:46.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:39:46.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:39:46.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:39:46.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:39:46.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:39:46.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:39:46.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:39:46.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:39:46.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:39:46.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:39:46.624 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:39:46.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:39:47.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:39:47.289 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:39:47.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:39:47.289 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:39:47.289 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:39:47.458 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:39:47.458 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:40:17.488 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:40:17.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:40:17.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:40:17.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:40:17.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:40:18.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:40: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-05-29T12:40:18.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:40:18.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-05-29T12:40:18.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:40:18.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:40:18.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:40:18.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T12:40:20.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-05-29T12:40:20.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:40:20.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:40:20.851 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:40:20.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:40:20.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:40:20.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:40:20.872 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:40:20.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:40:20.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:40:20.872 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:40:20.872 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:40:20.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:40:20.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:40:20.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:40:21.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:40:21.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:40:21.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:40:21.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:40:21.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:40:21.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:40:21.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:40:21.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:40:21.126 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:40:21.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:40:18
2026-05-29T12:40:21.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71860, datetime.datetime(2026, 5, 29, 12, 40, 18), datetime.datetime(2026, 5, 29, 12, 40, 17), 'salt', 13.46, 58.62, None, 21.21, 60.46, 7.93, 832.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:40:21.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:40:21.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:40:21.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:40:17, diff=4.194857s, valid=True
2026-05-29T12:40:21.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:40:21.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:40:21.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:40:12, diff=9.197772s, valid=True
2026-05-29T12:40:21.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:40:21.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:40:21.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:40:16, diff=5.204489s, valid=True
2026-05-29T12:40:21.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:40:21.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:40:21.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:40:21.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:40:21.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:40:21.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:40:21.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:40:12, diff=9.207646s, valid=True
2026-05-29T12:40:21.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:40:21.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:40:21.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:40:21.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983863.208306s, valid=True
2026-05-29T12:40:21.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:40:21.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:40:21.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:40:21.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:40:21.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:40:21.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:40:21.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:40:21.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:40:21.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:40:21.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:40:21.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:40:21.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:40:21.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:40:21.608 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:40:21.831 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:40:22.186 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:40:22.287 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:40:22.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:40:22.287 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:40:22.287 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:40:22.459 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:40:22.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:40:52.469 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:40:52.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:40:52.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:40:52.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:40:52.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:40:52.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:40:52.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-05-29T12:40:52.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:40:52.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T12:40:52.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:40:52.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:40:52.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:40:52.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-05-29T12:40:55.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T12:40:55.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:40:55.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:40:55.539 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:40:55.539 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:40:55.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:40:55.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:40:55.560 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:40:55.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:40:55.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:40:55.560 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:40:55.560 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:40:55.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:40:55.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:40:55.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:40:55.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:40:55.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:40:55.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:40:55.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:40:55.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:40:55.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:40:55.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:40:55.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:40:55.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:40:55.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:40:48
2026-05-29T12:40:55.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71861, datetime.datetime(2026, 5, 29, 12, 40, 48), datetime.datetime(2026, 5, 29, 12, 40, 47), 'salt', 13.2, 57.03, None, 19.8, 59.61, 8.32, 833.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:40:55.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:40:55.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:40:55.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:40:47, diff=8.891522s, valid=True
2026-05-29T12:40:55.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:40:55.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:40:55.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:41:12, diff=-16.105594s, valid=True
2026-05-29T12:40:55.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:40:55.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:40:55.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:40:47, diff=8.901112s, valid=True
2026-05-29T12:40:55.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:40:55.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:40:55.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:40:55.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:40:55.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:40:55.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:40:55.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:41:12, diff=-16.095755s, valid=True
2026-05-29T12:40:55.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:40:55.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:40:55.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:40:55.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983897.904919s, valid=True
2026-05-29T12:40:55.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:40:55.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:40:55.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:40:55.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:40:55.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:40:55.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:40:55.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:40:55.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:40:55.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:40:56.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:40:56.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:40:56.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:40:56.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:40:56.238 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:40:56.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:40:56.802 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:40:56.902 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:40:56.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:40:56.903 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:40:56.903 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:40:57.057 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:40:57.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:41:27.087 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:41:27.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:41:27.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:41:27.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:41:27.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:41:27.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:41:27.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-05-29T12:41:27.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:41:27.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-05-29T12:41:27.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:41:27.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:41:27.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:41:27.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-05-29T12:41:30.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-05-29T12:41:30.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:41:30.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:41:30.070 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:41:30.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:41:30.078 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:41:30.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:41:30.090 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:41:30.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:41:30.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:41:30.090 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:41:30.090 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:41:30.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:41:30.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:41:30.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:41:30.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:41:30.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:41:30.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:41:30.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:41:30.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:41:30.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:41:30.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:41:30.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:41:30.361 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:41:30.422 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:41:18
2026-05-29T12:41:30.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71862, datetime.datetime(2026, 5, 29, 12, 41, 18), datetime.datetime(2026, 5, 29, 12, 41, 17), 'salt', 13.26, 57.82, None, 21.59, 47.88, 8.12, 833.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:41:30.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:41:30.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:41:30.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:41:17, diff=13.428776s, valid=True
2026-05-29T12:41:30.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:41:30.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:41:30.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:41:12, diff=18.431693s, valid=True
2026-05-29T12:41:30.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:41:30.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:41:30.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:41:17, diff=13.438453s, valid=True
2026-05-29T12:41:30.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:41:30.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:41:30.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:41:30.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:41:30.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:41:30.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:41:30.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:41:12, diff=18.441513s, valid=True
2026-05-29T12:41:30.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:41:30.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:41:30.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:41:30.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983932.442188s, valid=True
2026-05-29T12:41:30.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:41:30.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:41:30.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:41:30.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:41:30.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:41:30.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:41:30.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:41:30.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:41:30.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:41:30.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:41:30.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:41:30.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:41:30.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:41:30.831 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:41:31.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:41:31.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:41:31.492 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:41:31.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:41:31.492 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:41:31.492 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:41:31.755 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:41:31.755 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:42:01.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:42:01.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:42:01.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:42:02.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:42:02.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:42:02.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:42:02.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-05-29T12:42:02.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:42:02.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T12:42:02.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:42:02.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:42:02.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:42:02.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-05-29T12:42:05.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-05-29T12:42:05.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:42:05.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:42:05.021 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:42:05.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:42:05.031 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:42:05.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:42:05.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:42:05.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:42:05.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:42:05.045 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:42:05.045 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:42:05.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:42:05.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:42:05.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:42:05.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:42:05.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:42:05.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:42:05.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:42:05.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:42:05.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:42:05.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:42:05.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:42:05.330 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:42:05.389 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:41:48
2026-05-29T12:42:05.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71863, datetime.datetime(2026, 5, 29, 12, 41, 48), datetime.datetime(2026, 5, 29, 12, 41, 48), 'salt', 13.03, 56.63, None, 17.71, 56.91, 8.4, 833.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:42:05.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:42:05.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:42:05.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:41:48, diff=17.395501s, valid=True
2026-05-29T12:42:05.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:42:05.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:42:05.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:42:12, diff=-6.601644s, valid=True
2026-05-29T12:42:05.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:42:05.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:42:05.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:41:47, diff=18.404973s, valid=True
2026-05-29T12:42:05.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:42:05.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:42:05.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:42:05.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:42:05.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:42:05.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:42:05.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:42:12, diff=-6.591997s, valid=True
2026-05-29T12:42:05.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:42:05.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:42:05.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:42:05.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=983967.408662s, valid=True
2026-05-29T12:42:05.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:42:05.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:42:05.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:42:05.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:42:05.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:42:05.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:42:05.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:42:05.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:42:05.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:42:05.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:42:05.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:42:05.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:42:05.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:42:05.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:42:05.955 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:42:06.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:42:06.387 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:42:06.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:42:06.387 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:42:06.387 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:42:06.560 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:42:06.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:42:36.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:42:36.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:42:36.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:42:37.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:42:37.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:42:37.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:42:37.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-05-29T12:42:37.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:42:37.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-05-29T12:42:37.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:42:37.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:42:37.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:42:37.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-05-29T12:42:39.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-05-29T12:42:39.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:42:39.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:42:39.957 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:42:39.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:42:39.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:42:39.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:42:39.978 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:42:39.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:42:39.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:42:39.979 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:42:39.979 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:42:39.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:42:40.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:42:40.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:42:40.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:42:40.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:42:40.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:42:40.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:42:40.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:42:40.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:42:40.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:42:40.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:42:40.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:42:40.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:42:18
2026-05-29T12:42:40.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71864, datetime.datetime(2026, 5, 29, 12, 42, 18), datetime.datetime(2026, 5, 29, 12, 42, 18), 'salt', 12.83, 57.72, None, 19.9, 51.1, 8.11, 832.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:42:40.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:42:40.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:42:40.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:42:18, diff=22.318665s, valid=True
2026-05-29T12:42:40.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:42:40.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:42:40.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:42:12, diff=28.321554s, valid=True
2026-05-29T12:42:40.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:42:40.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:42:40.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:42:17, diff=23.328203s, valid=True
2026-05-29T12:42:40.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:42:40.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:42:40.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:42:40.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:42:40.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:42:40.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:42:40.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:42:12, diff=28.331259s, valid=True
2026-05-29T12:42:40.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:42:40.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:42:40.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:42:40.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984002.331924s, valid=True
2026-05-29T12:42:40.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:42:40.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:42:40.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:42:40.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:42:40.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:42:40.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:42:40.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:42:40.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:42:40.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:42:40.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:42:40.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:42:40.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:42:40.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:42:40.713 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:42:40.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:42:41.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:42:41.358 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:42:41.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:42:41.358 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:42:41.359 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:42:41.511 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:42:41.511 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:43:11.541 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:43:11.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:43:11.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:43:11.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:43:11.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:43:11.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:43:11.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-05-29T12:43:11.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:43:11.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-05-29T12:43:11.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:43:11.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:43:11.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:43:11.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-05-29T12:43:14.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-05-29T12:43:14.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:43:14.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:43:14.479 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:43:14.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:43:14.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:43:14.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:43:14.500 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:43:14.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:43:14.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:43:14.500 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:43:14.500 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:43:14.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:43:14.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:43:14.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:43:14.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:43:14.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:43:14.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:43:14.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:43:14.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:43:14.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:43:14.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:43:14.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:43:14.768 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:43:14.825 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:42:49
2026-05-29T12:43:14.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71865, datetime.datetime(2026, 5, 29, 12, 42, 49), datetime.datetime(2026, 5, 29, 12, 42, 48), 'salt', 12.66, 58.95, None, 20.4, 58.77, 7.8, 833.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:43:14.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:43:14.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:43:14.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:42:48, diff=26.832187s, valid=True
2026-05-29T12:43:14.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:43:14.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:43:14.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:43:12, diff=2.835755s, valid=True
2026-05-29T12:43:14.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:43:14.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:43:14.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:42:48, diff=26.842368s, valid=True
2026-05-29T12:43:14.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:43:14.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:43:14.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:43:14.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:43:14.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:43:14.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:43:14.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:43:12, diff=2.845479s, valid=True
2026-05-29T12:43:14.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:43:14.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:43:14.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:43:14.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984036.846168s, valid=True
2026-05-29T12:43:14.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:43:14.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:43:14.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:43:14.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:43:14.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:43:14.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:43:14.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:43:14.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:43:14.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:43:14.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:43:15.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:43:15.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:43:15.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:43:15.182 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:43:15.394 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:43:15.739 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:43:15.840 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:43:15.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:43:15.840 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:43:15.840 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:43:16.098 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:43:16.098 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:43:46.128 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:43:46.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:43:46.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:43:46.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:43:46.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:43:46.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:43:46.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-05-29T12:43:46.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:43:46.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-05-29T12:43:46.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:43:46.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:43:46.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:43:46.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-05-29T12:43: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-05-29T12:43:49.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:43:49.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:43:49.345 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:43:49.345 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:43:49.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:43:49.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:43:49.364 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:43:49.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:43:49.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:43:49.364 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:43:49.364 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:43:49.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:43:49.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:43:49.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:43:49.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:43:49.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:43:49.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:43:49.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:43:49.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:43:49.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:43:49.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:43:49.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:43:49.627 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:43:49.686 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:43:49
2026-05-29T12:43:49.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71867, datetime.datetime(2026, 5, 29, 12, 43, 49), datetime.datetime(2026, 5, 29, 12, 43, 49), 'salt', 12.37, 60.58, None, 15.1, 67.91, 7.4, 833.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:43:49.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:43:49.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:43:49.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:43:49, diff=0.692563s, valid=True
2026-05-29T12:43:49.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:43:49.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:43:49.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:44:12, diff=-22.304625s, valid=True
2026-05-29T12:43:49.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:43:49.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:43:49.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:43:48, diff=1.701951s, valid=True
2026-05-29T12:43:49.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:43:49.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:43:49.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:43:49.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:43:49.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:43:49.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:43:49.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:44:12, diff=-22.295037s, valid=True
2026-05-29T12:43:49.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:43:49.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:43:49.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:43:49.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984071.705608s, valid=True
2026-05-29T12:43:49.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:43:49.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:43:49.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:43:49.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:43:49.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:43:49.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:43:49.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:43:49.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:43:49.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:43:49.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:43:49.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:43:49.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:43:50.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:43:50.045 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:43:50.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:43:50.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:43:50.717 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:43:50.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:43:50.717 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:43: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-05-29T12:43:50.949 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:43:50.949 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:44:20.955 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:44:20.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:44:20.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:44:21.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:44:21.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:44:21.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:44:21.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-05-29T12:44:21.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:44:21.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-05-29T12:44:21.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:44:21.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:44:21.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:44:21.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-05-29T12:44:24.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-05-29T12:44:24.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:44:24.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:44:24.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:44:24.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:44:24.126 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:44:24.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:44:24.139 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:44:24.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:44:24.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:44:24.139 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:44:24.139 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:44:24.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:44:24.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:44:24.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:44:24.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:44:24.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:44:24.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:44:24.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:44:24.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:44:24.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:44:24.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:44:24.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:44:24.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:44:24.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:44:19
2026-05-29T12:44:24.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71868, datetime.datetime(2026, 5, 29, 12, 44, 19), datetime.datetime(2026, 5, 29, 12, 44, 19), 'salt', 12.5, 61.44, None, 16.41, 54.15, 7.2, 833.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:44:24.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:44:24.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:44:24.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:44:19, diff=5.474108s, valid=True
2026-05-29T12:44:24.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:44:24.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:44:24.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:44:12, diff=12.477501s, valid=True
2026-05-29T12:44:24.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:44:24.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:44:24.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:44:18, diff=6.487971s, valid=True
2026-05-29T12:44:24.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:44:24.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:44:24.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:44:24.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:44:24.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:44:24.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:44:24.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:44:12, diff=12.491063s, valid=True
2026-05-29T12:44:24.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:44:24.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:44:24.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:44:24.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984106.491738s, valid=True
2026-05-29T12:44:24.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:44:24.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:44:24.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:44:24.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:44:24.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:44:24.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:44:24.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:44:24.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:44:24.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:44:24.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:44:24.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:44:24.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:44:24.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:44:24.814 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:44:25.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:44:25.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:44:25.534 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:44:25.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:44:25.535 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:44:25.535 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:44:25.791 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:44:25.792 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:44:55.796 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:44:55.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:44:55.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:44:56.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:44:56.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:44:56.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:44:56.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-05-29T12:44:56.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:44:56.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-05-29T12:44:56.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:44:56.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:44:56.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:44:56.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-05-29T12:44: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-05-29T12:44:58.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:44:58.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:44:58.814 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:44:58.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:44:58.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:44:58.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:44:58.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:44:58.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:44:58.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:44:58.835 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:44:58.835 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:44:58.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:44:58.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:44:58.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:44:59.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:44:59.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:44:59.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:44:59.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:44:59.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:44:59.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:44:59.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:44:59.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:44:59.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:44:59.164 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:44:49
2026-05-29T12:44:59.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71869, datetime.datetime(2026, 5, 29, 12, 44, 49), datetime.datetime(2026, 5, 29, 12, 44, 49), 'salt', 12.7, 61.34, None, 17.33, 42.51, 7.24, 833.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:44:59.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:44:59.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:44:59.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:44:49, diff=10.170496s, valid=True
2026-05-29T12:44:59.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:44:59.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:44:59.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:45:12, diff=-12.826619s, valid=True
2026-05-29T12:44:59.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:44:59.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:44:59.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:44:48, diff=11.180049s, valid=True
2026-05-29T12:44:59.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:44:59.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:44:59.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:44:59.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:44:59.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:44:59.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:44:59.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:45:12, diff=-12.816896s, valid=True
2026-05-29T12:44:59.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:44:59.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:44:59.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:44:59.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984141.183765s, valid=True
2026-05-29T12:44:59.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:44:59.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:44:59.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:44:59.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:44:59.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:44:59.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:44:59.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:44:59.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:44:59.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:44:59.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:44:59.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:44:59.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:44:59.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:44:59.500 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:44:59.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:45:00.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:45:00.156 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:45:00.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:45: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-05-29T12:45: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-05-29T12:45:00.306 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:45:00.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:45:30.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:45:30.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:45:30.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:45:30.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:45:30.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:45:30.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:45: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-05-29T12:45:30.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:45:30.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-05-29T12:45:30.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:45:30.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:45:30.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:45:30.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-05-29T12:45:32.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-05-29T12:45:32.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:45:32.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:45:32.941 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:45:32.941 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:45:32.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:45:32.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:45:32.962 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:45:32.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:45:32.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:45:32.963 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:45:32.963 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:45:32.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:45:33.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:45:33.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:45:33.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:45:33.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:45:33.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:45:33.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:45:33.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:45:33.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:45:33.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:45:33.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:45:33.225 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:45:33.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:45:20
2026-05-29T12:45:33.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71870, datetime.datetime(2026, 5, 29, 12, 45, 20), datetime.datetime(2026, 5, 29, 12, 45, 19), 'salt', 12.73, 61.47, None, 13.13, 51.54, 7.21, 833.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:45:33.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:45:33.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:45:33.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:45:19, diff=14.291609s, valid=True
2026-05-29T12:45:33.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:45:33.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:45:33.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:45:12, diff=21.29448s, valid=True
2026-05-29T12:45:33.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:45:33.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:45:33.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:45:19, diff=14.301162s, valid=True
2026-05-29T12:45:33.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:45:33.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:45:33.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:45:33.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:45:33.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:45:33.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:45:33.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:45:12, diff=21.304159s, valid=True
2026-05-29T12:45:33.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:45:33.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:45:33.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:45:33.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984175.304812s, valid=True
2026-05-29T12:45:33.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:45:33.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:45:33.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:45:33.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:45:33.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:45:33.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:45:33.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:45:33.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:45:33.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:45:33.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:45:33.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:45:33.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:45:33.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:45:33.647 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:45:33.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:45:34.286 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:45:34.392 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:45:34.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:45:34.392 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:45:34.393 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:45:34.460 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:45:34.460 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:46:04.474 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:46:04.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:46:04.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:46:04.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:46:04.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:46:05.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:46:05.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-05-29T12:46:05.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:46:05.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-05-29T12:46:05.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:46:05.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:46:05.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:46:05.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-05-29T12:46:07.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-05-29T12:46:07.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:46:07.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:46:07.557 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:46:07.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:46:07.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:46:07.577 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:46:07.577 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:46:07.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:46:07.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:46:07.577 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:46:07.577 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:46:07.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:46:07.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:46:07.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:46:07.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:46:07.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:46:07.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:46:07.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:46:07.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:46:07.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:46:07.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:46:07.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:46:07.831 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:46:07.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:45:50
2026-05-29T12:46:07.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71871, datetime.datetime(2026, 5, 29, 12, 45, 50), datetime.datetime(2026, 5, 29, 12, 45, 50), 'salt', 12.76, 61.57, None, 16.69, 38.52, 7.18, 833.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:46:07.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:46:07.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:46:07.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:45:50, diff=17.895129s, valid=True
2026-05-29T12:46:07.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:46:07.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:46:07.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:46:12, diff=-4.102005s, valid=True
2026-05-29T12:46:07.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:46:07.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:46:07.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:45:41, diff=26.904763s, valid=True
2026-05-29T12:46:07.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:46:07.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:46:07.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:46:07.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:46:07.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:46:07.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:46:07.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:46:12, diff=-4.092181s, valid=True
2026-05-29T12:46:07.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:46:07.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:46:07.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:46:07.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984209.908468s, valid=True
2026-05-29T12:46:07.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:46:07.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:46:07.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:46:07.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:46:07.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:46:07.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:46:07.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:46:07.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:46:07.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:46:08.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:46:08.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:46:08.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:46:08.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:46:08.224 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:46:08.427 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:46:08.761 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:46:08.859 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:46:08.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:46:08.859 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:46:08.859 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:46:09.057 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:46:09.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:46:39.087 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:46:39.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:46:39.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:46:39.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:46:39.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:46:39.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:46:39.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-05-29T12:46:39.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:46:39.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-05-29T12:46:39.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:46:39.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:46:39.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:46:39.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-05-29T12:46:42.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-05-29T12:46:42.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:46:42.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:46:42.188 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:46:42.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:46:42.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:46:42.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:46:42.207 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:46:42.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:46:42.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:46:42.208 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:46:42.208 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:46:42.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:46:42.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:46:42.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:46:42.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:46:42.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:46:42.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:46:42.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:46:42.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:46:42.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:46:42.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:46:42.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:46:42.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:46:42.526 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:46:20
2026-05-29T12:46:42.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71872, datetime.datetime(2026, 5, 29, 12, 46, 20), datetime.datetime(2026, 5, 29, 12, 46, 20), 'salt', 12.7, 61.24, None, 12.21, 36.39, 7.26, 833.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:46:42.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:46:42.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:46:42.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:46:20, diff=22.533234s, valid=True
2026-05-29T12:46:42.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:46:42.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:46:42.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:46:12, diff=30.536829s, valid=True
2026-05-29T12:46:42.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:46:42.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:46:42.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:46:15, diff=27.548148s, valid=True
2026-05-29T12:46:42.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:46:42.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:46:42.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:46:42.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:46:42.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:46:42.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:46:42.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:46:12, diff=30.552877s, valid=True
2026-05-29T12:46:42.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:46:42.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:46:42.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:46:42.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984244.553649s, valid=True
2026-05-29T12:46:42.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:46:42.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:46:42.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:46:42.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:46:42.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:46:42.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:46:42.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:46:42.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:46:42.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:46:42.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:46:42.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:46:42.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:46:42.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:46:42.891 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:46:43.192 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:46:43.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:46:43.660 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:46:43.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:46:43.660 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:46:43.660 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:46:43.827 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:46:43.827 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:47:13.857 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:47:13.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:47:13.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:47:13.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:47:14.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:47:14.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:47:14.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-05-29T12:47:14.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:47:14.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-05-29T12:47:14.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:47:14.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:47:14.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:47:14.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T12:47:16.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-05-29T12:47:16.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:47:16.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:47:16.869 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:47:16.869 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:47:16.877 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:47:16.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:47:16.888 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:47:16.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:47:16.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:47:16.889 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:47:16.889 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:47:16.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:47:16.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:47:16.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:47:17.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:47:17.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:47:17.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:47:17.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:47:17.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:47:17.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:47:17.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:47:17.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:47:17.155 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:47:17.213 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:46:50
2026-05-29T12:47:17.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71873, datetime.datetime(2026, 5, 29, 12, 46, 50), datetime.datetime(2026, 5, 29, 12, 46, 50), 'salt', 12.83, 60.87, None, 20.57, 59.54, 7.35, 833.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:47:17.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:47:17.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:47:17.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:46:50, diff=27.22361s, valid=True
2026-05-29T12:47:17.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:47:17.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:47:17.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:47:12, diff=5.228583s, valid=True
2026-05-29T12:47:17.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:47:17.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:47:17.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:46:46, diff=31.235821s, valid=True
2026-05-29T12:47:17.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:47:17.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:47:17.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:47:17.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:47:17.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:47:17.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:47:17.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:47:12, diff=5.238969s, valid=True
2026-05-29T12:47:17.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:47:17.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:47:17.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:47:17.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984279.239639s, valid=True
2026-05-29T12:47:17.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:47:17.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:47:17.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:47:17.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:47:17.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:47:17.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:47:17.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:47:17.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:47:17.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:47:17.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:47:17.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:47:17.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:47:17.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:47:17.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:47:17.782 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:47:18.139 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:47:18.248 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:47:18.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:47:18.248 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:47:18.248 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:47:18.420 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:47:18.420 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:47:48.449 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:47:48.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:47:48.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:47:48.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:47:48.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:47:48.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:47:48.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-05-29T12:47:48.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:47:48.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-05-29T12:47:48.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:47:48.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:47:48.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:47:48.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-05-29T12:47:51.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-05-29T12:47:51.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:47:51.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:47:51.156 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:47:51.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:47:51.164 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:47:51.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:47:51.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:47:51.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:47:51.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:47:51.176 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:47:51.176 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:47:51.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:47:51.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:47:51.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:47:51.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:47:51.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:47:51.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:47:51.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:47:51.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:47:51.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:47:51.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:47:51.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:47:51.428 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:47:51.489 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:47:51
2026-05-29T12:47:51.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71875, datetime.datetime(2026, 5, 29, 12, 47, 51), datetime.datetime(2026, 5, 29, 12, 47, 50), 'salt', 12.83, 59.31, None, 20.25, 61.67, 7.73, 833.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:47:51.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:47:51.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:47:51.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:47:50, diff=1.49589s, valid=True
2026-05-29T12:47:51.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:47:51.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:47:51.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:48:12, diff=-20.501256s, valid=True
2026-05-29T12:47:51.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:47:51.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:47:51.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:47:49, diff=2.505265s, valid=True
2026-05-29T12:47:51.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:47:51.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:47:51.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:47:51.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:47:51.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:47:51.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:47:51.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:48:12, diff=-20.49171s, valid=True
2026-05-29T12:47:51.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:47:51.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:47:51.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:47:51.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984313.508942s, valid=True
2026-05-29T12:47:51.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:47:51.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:47:51.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:47:51.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:47:51.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:47:51.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:47:51.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:47:51.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:47:51.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:47:51.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:47:51.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:47:51.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:47:51.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:47:51.902 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:47:52.104 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:47:52.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:47:52.536 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:47:52.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:47:52.536 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:47:52.536 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:47:52.789 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:47:52.789 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:48:22.803 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:48:22.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:48:22.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:48:23.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:48:23.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:48:23.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:48:23.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-05-29T12:48:23.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:48:23.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-05-29T12:48:23.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:48:23.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:48:23.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:48:23.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-05-29T12:48:26.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-05-29T12:48:26.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:48:26.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:48:26.138 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:48:26.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:48:26.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:48:26.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:48:26.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:48:26.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:48:26.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:48:26.158 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:48:26.158 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:48:26.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:48:26.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:48:26.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:48:26.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:48:26.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:48:26.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:48:26.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:48:26.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:48:26.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:48:26.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:48:26.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:48:26.413 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:48:26.479 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:48:21
2026-05-29T12:48:26.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71876, datetime.datetime(2026, 5, 29, 12, 48, 21), datetime.datetime(2026, 5, 29, 12, 48, 20), 'salt', 12.7, 59.61, None, 20.4, 60.31, 7.65, 832.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:48:26.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:48:26.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:48:26.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:48:20, diff=6.485355s, valid=True
2026-05-29T12:48:26.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:48:26.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:48:26.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:48:12, diff=14.488174s, valid=True
2026-05-29T12:48:26.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:48:26.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:48:26.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:48:21, diff=5.494825s, valid=True
2026-05-29T12:48:26.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:48:26.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:48:26.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:48:26.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:48:26.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:48:26.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:48:26.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:48:12, diff=14.497858s, valid=True
2026-05-29T12:48:26.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:48:26.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:48:26.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:48:26.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984348.498518s, valid=True
2026-05-29T12:48:26.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:48:26.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:48:26.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:48:26.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:48:26.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:48:26.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:48:26.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:48:26.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:48:26.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:48:26.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:48:26.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:48:26.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:48:26.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:48:26.815 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:48:27.022 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:48:27.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:48:27.453 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:48:27.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:48:27.454 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:48:27.454 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:48:27.732 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:48:27.732 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:48:57.739 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:48:57.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:48:57.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:48:58.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:48:58.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:48:58.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:48:58.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-05-29T12:48:58.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:48:58.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-05-29T12:48:58.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:48:58.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:48:58.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:48:58.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-05-29T12:49:01.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-05-29T12:49:01.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:49:01.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:49:01.305 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:49:01.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:49:01.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:49:01.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:49:01.325 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:49:01.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:49:01.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:49:01.326 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:49:01.326 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:49:01.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:49:01.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:49:01.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:49:01.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:49:01.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:49:01.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:49:01.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:49:01.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:49:01.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:49:01.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:49:01.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:49:01.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:49:01.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:48:51
2026-05-29T12:49:01.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71877, datetime.datetime(2026, 5, 29, 12, 48, 51), datetime.datetime(2026, 5, 29, 12, 48, 51), 'salt', 12.83, 59.61, None, 19.69, 43.43, 7.65, 832.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:49:01.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:49:01.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:49:01.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:48:51, diff=10.649751s, valid=True
2026-05-29T12:49:01.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:49:01.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:49:01.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:49:12, diff=-10.347397s, valid=True
2026-05-29T12:49:01.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:49:01.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:49:01.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:48:45, diff=16.659298s, valid=True
2026-05-29T12:49:01.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:49:01.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:49:01.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:49:01.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:49:01.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:49:01.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:49:01.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:49:12, diff=-10.337552s, valid=True
2026-05-29T12:49:01.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:49:01.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:49:01.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:49:01.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984383.66316s, valid=True
2026-05-29T12:49:01.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:49:01.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:49:01.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:49:01.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:49:01.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:49:01.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:49:01.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:49:01.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:49:01.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:49:01.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:49:01.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:49:01.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:49:02.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:49:02.066 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:49:02.278 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:49:02.632 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:49:02.742 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:49:02.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:49:02.742 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:49:02.742 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:49:03.004 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:49:03.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:49:33.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:49:33.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:49:33.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:49:33.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:49:33.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:49:33.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:49:33.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-05-29T12:49:33.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:49:33.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-05-29T12:49:33.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:49:33.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:49:33.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:49:33.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-05-29T12:49:36.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-05-29T12:49:36.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:49:36.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:49:36.378 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:49:36.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:49:36.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:49:36.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:49:36.399 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:49:36.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:49:36.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:49:36.399 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:49:36.399 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:49:36.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:49:36.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:49:36.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:49:36.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:49:36.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:49:36.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:49:36.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:49:36.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:49:36.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:49:36.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:49:36.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:49:36.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:49:36.716 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:49:22
2026-05-29T12:49:36.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71878, datetime.datetime(2026, 5, 29, 12, 49, 22), datetime.datetime(2026, 5, 29, 12, 49, 21), 'salt', 12.73, 59.88, None, 17.4, 38.5, 7.58, 832.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:49:36.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:49:36.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:49:36.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:49:21, diff=15.722277s, valid=True
2026-05-29T12:49:36.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:49:36.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:49:36.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:49:12, diff=24.725124s, valid=True
2026-05-29T12:49:36.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:49:36.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:49:36.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:49:15, diff=21.731889s, valid=True
2026-05-29T12:49:36.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:49:36.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:49:36.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:49:36.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:49:36.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:49:36.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:49:36.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:49:12, diff=24.734905s, valid=True
2026-05-29T12:49:36.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:49:36.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:49:36.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:49:36.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984418.735566s, valid=True
2026-05-29T12:49:36.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:49:36.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:49:36.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:49:36.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:49:36.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:49:36.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:49:36.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:49:36.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:49:36.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:49:36.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:49:36.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:49:36.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:49:37.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:49:37.051 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:49:37.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:49:37.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:49:37.692 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:49:37.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:49:37.692 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:49:37.692 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:49:37.854 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:49:37.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:50:07.881 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:50:07.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:50:07.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:50:08.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:50:08.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:50:08.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:50:08.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-05-29T12:50:08.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:50:08.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-05-29T12:50:08.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:50:08.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:50:08.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:50:08.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-05-29T12:50:10.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-05-29T12:50:10.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:50:10.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:50:10.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:50:10.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:50:10.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:50:10.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:50:10.962 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:50:10.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:50:10.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:50:10.963 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:50:10.963 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:50:10.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:50:11.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:50:11.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:50:11.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:50:11.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:50:11.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:50:11.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:50:11.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:50:11.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:50:11.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:50:11.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:50:11.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:50:11.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:49:52
2026-05-29T12:50:11.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71879, datetime.datetime(2026, 5, 29, 12, 49, 52), datetime.datetime(2026, 5, 29, 12, 49, 51), 'salt', 12.66, 59.51, None, 12.88, 56.75, 7.66, 832.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:50:11.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:50:11.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:50:11.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:49:51, diff=20.355612s, valid=True
2026-05-29T12:50:11.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:50:11.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:50:11.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:50:12, diff=-0.641547s, valid=True
2026-05-29T12:50:11.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:50:11.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:50:11.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:49:46, diff=25.365161s, valid=True
2026-05-29T12:50:11.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:50:11.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:50:11.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:50:11.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:50:11.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:50:11.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:50:11.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:50:12, diff=-0.631789s, valid=True
2026-05-29T12:50:11.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:50:11.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:50:11.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:50:11.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984453.3689s, valid=True
2026-05-29T12:50:11.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:50:11.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:50:11.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:50:11.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:50:11.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:50:11.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:50:11.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:50:11.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:50:11.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:50:11.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:50:11.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:50:11.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:50:11.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:50:11.688 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:50:11.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:50:12.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:50:12.356 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:50:12.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:50:12.356 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:50:12.356 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:50:12.623 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:50:12.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:50:42.653 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:50:42.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:50:42.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:50:42.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:50:42.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:50:43.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:50:43.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-05-29T12:50:43.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:50:43.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T12:50:43.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:50:43.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:50:43.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:50:43.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-05-29T12:50:45.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T12:50:45.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:50:45.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:50:45.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:50:45.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:50:45.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:50:45.630 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:50:45.630 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:50:45.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:50:45.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:50:45.630 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:50:45.630 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:50:45.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:50:45.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:50:45.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:50:45.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:50:45.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:50:45.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:50:45.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:50:45.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:50:45.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:50:45.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:50:45.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:50:45.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:50:45.950 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:50:22
2026-05-29T12:50:45.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71880, datetime.datetime(2026, 5, 29, 12, 50, 22), datetime.datetime(2026, 5, 29, 12, 50, 21), 'salt', 12.63, 59.35, None, 20.68, 33.15, 7.71, 833.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:50:45.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:50:45.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:50:45.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:50:21, diff=24.956531s, valid=True
2026-05-29T12:50:45.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:50:45.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:50:45.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:50:12, diff=33.959397s, valid=True
2026-05-29T12:50:45.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:50:45.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:50:45.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:50:16, diff=29.965972s, valid=True
2026-05-29T12:50:45.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:50:45.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:50:45.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:50:45.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:50:45.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:50:45.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:50:45.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:50:12, diff=33.969007s, valid=True
2026-05-29T12:50:45.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:50:45.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:50:45.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:50:45.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984487.969671s, valid=True
2026-05-29T12:50:45.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:50:45.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:50:45.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:50:45.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:50:45.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:50:46.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:50:46.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:50:46.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:50:46.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:50:46.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:50:46.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:50:46.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:50:46.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:50:46.287 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:50:46.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:50:46.845 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:50:47.004 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:50:47.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:50:47.005 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:50:47.005 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:50:47.166 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:50:47.167 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:51:17.197 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:51:17.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:51:17.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:51:17.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:51:17.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:51:17.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:51:17.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-05-29T12:51:17.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:51:17.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-05-29T12:51:17.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:51:17.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:51:17.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:51:17.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-05-29T12:51:20.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-05-29T12:51:20.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:51:20.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:51:20.103 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:51:20.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:51:20.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:51:20.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:51:20.125 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:51:20.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:51:20.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:51:20.126 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:51:20.126 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:51:20.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:51:20.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:51:20.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:51:20.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:51:20.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:51:20.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:51:20.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:51:20.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:51:20.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:51:20.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:51:20.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:51:20.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:51:20.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:50:52
2026-05-29T12:51:20.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71881, datetime.datetime(2026, 5, 29, 12, 50, 52), datetime.datetime(2026, 5, 29, 12, 50, 51), 'salt', 12.9, 60.28, None, 21.59, 46.01, 7.5, 832.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:51:20.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:51:20.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:51:20.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:50:51, diff=29.44226s, valid=True
2026-05-29T12:51:20.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:51:20.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:51:20.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:51:12, diff=8.44507s, valid=True
2026-05-29T12:51:20.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:51:20.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:51:20.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:50:47, diff=33.451582s, valid=True
2026-05-29T12:51:20.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:51:20.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:51:20.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:51:20.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:51:20.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:51:20.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:51:20.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:51:12, diff=8.454592s, valid=True
2026-05-29T12:51:20.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:51:20.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:51:20.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:51:20.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984522.45537s, valid=True
2026-05-29T12:51:20.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:51:20.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:51:20.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:51:20.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:51:20.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:51:20.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:51:20.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:51:20.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:51:20.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:51:20.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:51:20.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:51:20.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:51:20.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:51:20.770 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:51:20.981 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:51:21.323 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:51:21.423 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:51:21.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:51:21.424 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:51:21.424 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:51:21.689 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:51:21.689 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:51:51.719 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:51:51.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:51:51.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:51:51.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:51:51.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:51:52.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:51:52.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-05-29T12:51:52.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:51:52.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-05-29T12:51:52.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:51:52.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:51:52.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:51:52.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-05-29T12:51:54.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-05-29T12:51:54.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:51:54.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:51:54.560 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:51:54.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:51:54.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:51:54.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:51:54.581 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:51:54.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:51:54.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:51:54.582 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:51:54.582 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:51:54.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:51:54.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:51:54.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:51:54.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:51:54.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:51:54.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:51:54.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:51:54.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:51:54.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:51:54.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:51:54.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:51:54.833 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:51:54.892 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:51:53
2026-05-29T12:51:54.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71883, datetime.datetime(2026, 5, 29, 12, 51, 53), datetime.datetime(2026, 5, 29, 12, 51, 52), 'salt', 13.13, 58.05, None, 17.5, 36.67, 8.05, 832.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:51:54.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:51:54.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:51:54.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:51:52, diff=2.898141s, valid=True
2026-05-29T12:51:54.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:51:54.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:51:54.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:52:12, diff=-17.099073s, valid=True
2026-05-29T12:51:54.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:51:54.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:51:54.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:51:50, diff=4.907487s, valid=True
2026-05-29T12:51:54.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:51:54.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:51:54.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:51:54.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:51:54.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:51:54.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:51:54.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:52:12, diff=-17.089522s, valid=True
2026-05-29T12:51:54.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:51:54.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:51:54.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:51:54.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984556.911143s, valid=True
2026-05-29T12:51:54.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:51:54.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:51:54.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:51:54.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:51:54.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:51:54.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:51:54.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:51:54.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:51:54.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:51:55.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:51:55.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:51:55.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:51:55.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:51:55.226 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:51:55.510 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:51:55.852 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:51:55.951 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:51:55.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:51:55.952 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:51:55.952 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:51:56.120 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:51:56.120 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:52:26.149 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:52:26.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:52:26.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:52:26.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:52:26.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:52:26.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:52:26.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-05-29T12:52:26.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:52:26.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-05-29T12:52:26.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:52:26.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:52:26.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:52:26.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-05-29T12:52:29.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-05-29T12:52:29.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:52:29.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:52:29.241 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:52:29.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:52:29.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:52:29.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:52:29.261 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:52:29.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:52:29.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:52:29.261 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:52:29.261 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:52:29.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:52:29.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:52:29.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:52:29.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:52:29.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:52:29.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:52:29.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:52:29.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:52:29.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:52:29.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:52:29.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:52:29.523 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:52:29.584 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:52:23
2026-05-29T12:52:29.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71884, datetime.datetime(2026, 5, 29, 12, 52, 23), datetime.datetime(2026, 5, 29, 12, 52, 23), 'salt', 13.06, 56.79, None, 18.14, 37.65, 8.36, 832.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:52:29.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:52:29.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:52:29.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:52:23, diff=6.590652s, valid=True
2026-05-29T12:52:29.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:52:29.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:52:29.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:52:12, diff=17.59357s, valid=True
2026-05-29T12:52:29.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:52:29.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:52:29.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:52:22, diff=7.600367s, valid=True
2026-05-29T12:52:29.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:52:29.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:52:29.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:52:29.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:52:29.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:52:29.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:52:29.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:52:12, diff=17.603488s, valid=True
2026-05-29T12:52:29.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:52:29.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:52:29.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:52:29.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984591.604166s, valid=True
2026-05-29T12:52:29.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:52:29.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:52:29.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:52:29.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:52:29.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:52:29.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:52:29.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:52:29.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:52:29.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:52:29.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:52:29.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:52:29.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:52:29.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:52:29.942 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:52:30.176 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:52:30.533 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:52:30.649 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:52:30.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:52:30.649 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:52:30.649 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:52:30.911 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:52:30.911 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:53:00.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:53:00.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:53:00.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:53:01.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:53:01.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:53:01.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:53:01.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-05-29T12:53:01.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:53:01.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-05-29T12:53:01.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:53:01.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:53:01.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:53:01.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-05-29T12:53:03.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T12:53:03.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:53:03.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:53:03.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:53:03.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:53:03.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:53:03.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:53:03.999 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:53:03.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:53:03.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:53:03.999 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:53:03.999 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:53:04.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:53:04.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:53:04.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:53:04.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:53:04.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:53:04.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:53:04.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:53:04.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:53:04.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:53:04.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:53:04.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:53:04.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:53:04.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:52:53
2026-05-29T12:53:04.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71885, datetime.datetime(2026, 5, 29, 12, 52, 53), datetime.datetime(2026, 5, 29, 12, 52, 53), 'salt', 13.19, 57.09, None, 18.98, 46.99, 8.29, 833.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:53:04.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:53:04.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:53:04.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:52:53, diff=11.358686s, valid=True
2026-05-29T12:53:04.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:53:04.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:53:04.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:53:12, diff=-7.635724s, valid=True
2026-05-29T12:53:04.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:53:04.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:53:04.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:52:47, diff=17.377424s, valid=True
2026-05-29T12:53:04.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:53:04.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:53:04.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:53:04.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:53:04.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:53:04.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:53:04.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:53:12, diff=-7.616715s, valid=True
2026-05-29T12:53:04.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:53:04.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:53:04.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:53:04.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984626.384437s, valid=True
2026-05-29T12:53:04.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:53:04.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:53:04.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:53:04.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:53:04.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:53:04.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:53:04.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:53:04.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:53:04.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:53:04.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:53:04.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:53:04.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:53:04.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:53:04.793 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:53:05.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:53:05.361 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:53:05.462 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:53:05.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:53:05.462 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:53:05.462 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:53:05.617 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:53:05.617 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:53:35.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:53:35.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:53:35.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:53:36.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:53:36.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:53:36.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:53:36.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-05-29T12:53:36.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:53:36.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-05-29T12:53:36.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:53:36.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:53:36.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:53:36.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T12:53:38.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-05-29T12:53:38.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:53:38.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:53:38.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:53:38.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:53:38.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:53:38.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:53:38.789 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:53:38.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:53:38.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:53:38.790 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:53:38.790 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:53:38.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:53:38.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:53:38.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:53:38.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:53:38.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:53:39.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:53:39.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:53:39.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:53:39.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:53:39.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:53:39.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:53:39.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:53:39.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:53:23
2026-05-29T12:53:39.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71886, datetime.datetime(2026, 5, 29, 12, 53, 23), datetime.datetime(2026, 5, 29, 12, 53, 23), 'salt', 13.09, 56.66, None, 15.95, 32.66, 8.39, 832.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:53:39.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:53:39.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:53:39.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:53:23, diff=16.111833s, valid=True
2026-05-29T12:53:39.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:53:39.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:53:39.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:53:12, diff=27.114685s, valid=True
2026-05-29T12:53:39.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:53:39.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:53:39.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:53:17, diff=22.121294s, valid=True
2026-05-29T12:53:39.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:53:39.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:53:39.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:53:39.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:53:39.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:53:39.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:53:39.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:53:12, diff=27.124287s, valid=True
2026-05-29T12:53:39.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:53:39.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:53:39.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:53:39.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984661.124966s, valid=True
2026-05-29T12:53:39.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:53:39.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:53:39.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:53:39.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:53:39.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:53:39.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:53:39.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:53:39.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:53:39.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:53:39.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:53:39.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:53:39.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:53:39.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:53:39.440 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:53:39.651 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:53:40.019 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:53:40.124 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:53:40.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:53:40.125 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:53:40.125 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:53:40.395 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:53:40.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:54:10.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:54:10.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:54:10.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:54:10.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:54:10.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:54:10.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:54:10.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-05-29T12:54:10.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:54:10.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-05-29T12:54:10.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:54:10.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:54:10.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:54:10.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-05-29T12:54:13.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T12:54:13.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:54:13.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:54:13.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:54:13.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:54:13.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:54:13.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:54:13.432 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:54:13.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:54:13.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:54:13.432 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:54:13.432 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:54:13.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:54:13.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:54:13.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:54:13.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:54:13.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:54:13.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:54:13.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:54:13.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:54:13.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:54:13.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:54:13.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:54:13.681 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:54:13.739 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:53:54
2026-05-29T12:54:13.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71887, datetime.datetime(2026, 5, 29, 12, 53, 54), datetime.datetime(2026, 5, 29, 12, 53, 53), 'salt', 13.29, 58.05, None, 20.04, 33.5, 8.06, 832.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:54:13.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:54:13.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:54:13.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:53:53, diff=20.745931s, valid=True
2026-05-29T12:54:13.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:54:13.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:54:13.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:54:12, diff=1.748862s, valid=True
2026-05-29T12:54:13.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:54:13.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:54:13.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:53:47, diff=26.755798s, valid=True
2026-05-29T12:54:13.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:54:13.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:54:13.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:54:13.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:54:13.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:54:13.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:54:13.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:54:12, diff=1.759066s, valid=True
2026-05-29T12:54:13.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:54:13.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:54:13.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:54:13.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984695.759748s, valid=True
2026-05-29T12:54:13.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:54:13.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:54:13.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:54:13.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:54:13.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:54:13.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:54:13.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:54:13.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:54:13.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:54:13.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:54:14.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:54:14.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:54:14.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:54:14.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:54:14.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:54:14.711 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:54:14.817 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:54:14.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:54:14.818 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:54:14.818 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:54:15.017 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:54:15.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:54:45.045 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:54:45.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:54:45.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:54:45.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:54:45.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:54:45.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:54:45.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T12:54:45.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:54:45.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T12:54:45.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:54:45.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:54:45.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:54:45.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-05-29T12:54:48.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-05-29T12:54:48.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:54:48.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:54:48.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:54:48.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:54:48.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:54:48.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:54:48.057 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:54:48.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:54:48.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:54:48.057 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:54:48.057 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:54:48.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:54:48.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:54:48.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:54:48.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:54:48.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:54:48.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:54:48.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:54:48.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:54:48.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:54:48.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:54:48.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:54:48.311 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:54:48.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:54:24
2026-05-29T12:54:48.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71888, datetime.datetime(2026, 5, 29, 12, 54, 24), datetime.datetime(2026, 5, 29, 12, 54, 24), 'salt', 13.33, 57.29, None, 20.08, 36.34, 8.26, 832.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:54:48.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:54:48.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:54:48.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:54:24, diff=24.375865s, valid=True
2026-05-29T12:54:48.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:54:48.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:54:48.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:54:12, diff=36.378781s, valid=True
2026-05-29T12:54:48.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:54:48.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:54:48.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:54:18, diff=30.3855s, valid=True
2026-05-29T12:54:48.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:54:48.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:54:48.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:54:48.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:54:48.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:54:48.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:54:48.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:54:12, diff=36.388603s, valid=True
2026-05-29T12:54:48.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:54:48.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:54:48.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:54:48.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984730.389274s, valid=True
2026-05-29T12:54:48.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:54:48.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:54:48.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:54:48.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:54:48.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:54:48.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:54:48.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:54:48.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:54:48.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:54:48.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:54:48.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:54:48.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:54:48.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:54:48.710 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:54:48.922 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:54:49.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:54:49.369 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:54:49.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:54:49.369 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:54:49.369 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:54:49.535 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:54:49.535 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:55:19.566 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:55:19.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:55:19.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:55:19.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:55:19.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:55:19.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:55:19.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-05-29T12:55:19.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:55:19.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-05-29T12:55:19.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:55:19.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:55:19.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:55:19.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-05-29T12:55:22.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-05-29T12:55:22.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:55:22.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:55:22.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:55:22.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:55:22.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:55:22.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:55:22.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:55:22.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:55:22.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:55:22.317 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:55:22.317 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:55:22.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:55:22.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:55:22.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:55:22.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:55:22.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:55:22.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:55:22.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:55:22.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:55:22.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:55:22.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:55:22.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:55:22.575 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:55:22.635 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:54:54
2026-05-29T12:55:22.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71889, datetime.datetime(2026, 5, 29, 12, 54, 54), datetime.datetime(2026, 5, 29, 12, 54, 54), 'salt', 13.29, 56.53, None, 19.44, 45.09, 8.44, 832.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:55:22.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:55:22.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:55:22.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:54:54, diff=28.641598s, valid=True
2026-05-29T12:55:22.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:55:22.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:55:22.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:55:12, diff=10.644425s, valid=True
2026-05-29T12:55:22.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:55:22.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:55:22.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:54:49, diff=33.651041s, valid=True
2026-05-29T12:55:22.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:55:22.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:55:22.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:55:22.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:55:22.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:55:22.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:55:22.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:55:12, diff=10.65414s, valid=True
2026-05-29T12:55:22.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:55:22.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:55:22.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:55:22.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984764.654808s, valid=True
2026-05-29T12:55:22.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:55:22.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:55:22.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:55:22.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:55:22.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:55:22.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:55:22.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:55:22.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:55:22.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:55:22.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:55:22.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:55:22.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:55:22.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:55:23.039 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:55:23.254 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:55:23.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:55:23.701 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:55:23.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:55:23.701 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:55:23.701 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:55:23.877 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:55:23.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:55:53.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:55:53.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:55:53.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:55:54.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:55:54.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:55:54.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:55:54.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-05-29T12:55:54.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:55:54.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-05-29T12:55:54.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:55:54.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:55:54.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:55:54.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-05-29T12:55:56.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-05-29T12:55:56.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:55:56.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:55:56.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:55:56.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:55:56.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:55:56.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:55:56.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:55:56.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:55:56.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:55:56.966 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:55:56.966 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:55:56.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:55:57.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:55:57.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:55:57.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:55:57.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:55:57.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:55:57.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:55:57.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:55:57.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:55:57.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:55:57.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:55:57.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:55:57.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:55:55
2026-05-29T12:55:57.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71891, datetime.datetime(2026, 5, 29, 12, 55, 55), datetime.datetime(2026, 5, 29, 12, 55, 54), 'salt', 12.86, 57.56, None, 20.29, 25.5, 8.16, 832.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:55:57.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:55:57.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:55:57.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:55:54, diff=3.291125s, valid=True
2026-05-29T12:55:57.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:55:57.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:55:57.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:56:12, diff=-14.705963s, valid=True
2026-05-29T12:55:57.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:55:57.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:55:57.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:55:52, diff=5.300788s, valid=True
2026-05-29T12:55:57.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:55:57.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:55:57.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:55:57.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:55:57.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:55:57.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:55:57.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:56:12, diff=-14.696115s, valid=True
2026-05-29T12:55:57.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:55:57.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:55:57.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:55:57.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984799.30455s, valid=True
2026-05-29T12:55:57.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:55:57.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:55:57.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:55:57.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:55:57.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:55:57.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:55:57.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:55:57.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:55:57.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:55:57.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:55:57.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:55:57.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:55:57.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:55:57.628 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:55:57.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:55:58.186 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:55:58.288 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:55:58.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:55:58.289 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:55:58.289 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:55:58.542 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:55:58.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:56:28.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:56:28.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:56:28.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:56:28.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:56:28.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:56:28.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:56:28.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-05-29T12:56:28.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:56:28.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-05-29T12:56:28.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:56:28.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:56:28.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:56:28.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-05-29T12:56:31.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-05-29T12:56:31.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:56:31.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:56:31.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:56:31.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:56:31.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:56:31.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:56:31.741 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:56:31.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:56:31.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:56:31.741 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:56:31.741 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:56:31.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:56:31.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:56:31.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:56:31.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:56:31.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:56:31.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:56:31.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:56:31.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-29T12:56:31.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:56:32.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:56:32.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:56:32.252 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:56:32.317 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:56:25
2026-05-29T12:56:32.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71892, datetime.datetime(2026, 5, 29, 12, 56, 25), datetime.datetime(2026, 5, 29, 12, 56, 25), 'salt', 13.06, 58.25, None, 21.56, 36.27, 8.0, 832.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:56:32.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:56:32.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:56:32.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:56:25, diff=7.323325s, valid=True
2026-05-29T12:56:32.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:56:32.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:56:32.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:56:12, diff=20.326239s, valid=True
2026-05-29T12:56:32.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:56:32.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:56:32.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:56:23, diff=9.332831s, valid=True
2026-05-29T12:56:32.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:56:32.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:56:32.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:56:32.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:56:32.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:56:32.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-29T12:56:32.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:56:12, diff=20.335934s, valid=True
2026-05-29T12:56:32.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:56:32.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:56:32.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:56:32.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984834.336577s, valid=True
2026-05-29T12:56:32.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:56:32.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:56:32.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:56:32.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:56:32.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:56:32.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:56:32.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:56:32.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:56:32.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:56:32.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:56:32.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:56:32.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:56:32.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:56:32.654 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:56:32.871 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:56:33.217 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:56:33.319 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:56:33.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:56:33.319 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:56:33.320 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:56:33.408 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:56:33.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:57:03.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:57:03.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:57:03.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:57:03.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:57:03.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:57:03.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:57:03.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T12:57:03.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:57:03.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-05-29T12:57:03.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:57:03.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:57:03.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:57:03.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-05-29T12:57:06.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-05-29T12:57:06.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:57:06.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:57:06.185 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:57:06.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:57:06.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:57:06.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:57:06.205 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:57:06.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:57:06.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:57:06.205 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:57:06.205 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:57:06.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:57:06.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:57:06.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:57:06.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:57:06.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:57:06.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:57:06.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:57:06.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:57:06.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:57:06.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:57:06.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:57:06.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:57:06.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:56:55
2026-05-29T12:57:06.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71893, datetime.datetime(2026, 5, 29, 12, 56, 55), datetime.datetime(2026, 5, 29, 12, 56, 55), 'salt', 13.16, 58.05, None, 20.4, 30.27, 8.05, 832.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:57:06.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:57:06.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:57:06.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:56:55, diff=11.536293s, valid=True
2026-05-29T12:57:06.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:57:06.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:57:06.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:57:12, diff=-5.460851s, valid=True
2026-05-29T12:57:06.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:57:06.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:57:06.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:56:55, diff=11.545728s, valid=True
2026-05-29T12:57:06.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:57:06.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:57:06.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:57:06.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:57:06.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:57:06.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:57:06.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:57:12, diff=-5.451249s, valid=True
2026-05-29T12:57:06.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:57:06.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:57:06.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:57:06.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984868.549408s, valid=True
2026-05-29T12:57:06.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:57:06.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:57:06.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:57:06.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:57:06.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:57:06.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:57:06.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:57:06.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:57:06.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:57:06.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:57:06.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:57:06.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:57:06.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:57:06.867 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:57:07.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:57:07.429 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:57:07.530 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:57:07.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:57:07.530 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:57:07.530 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:57:07.597 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:57:07.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:57:37.625 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:57:37.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:57:37.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:57:37.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:57:37.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:57:38.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:57:38.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-05-29T12:57:38.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:57:38.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-05-29T12:57:38.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:57:38.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:57:38.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:57:38.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-05-29T12:57:40.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-05-29T12:57:40.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:57:40.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:57:40.537 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:57:40.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:57:40.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:57:40.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:57:40.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:57:40.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:57:40.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:57:40.558 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:57:40.558 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:57:40.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:57:40.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:57:40.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:57:40.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:57:40.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:57:40.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:57:40.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:57:40.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:57:40.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:57:40.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:57:40.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:57:40.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:57:40.884 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:57:25
2026-05-29T12:57:40.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71894, datetime.datetime(2026, 5, 29, 12, 57, 25), datetime.datetime(2026, 5, 29, 12, 57, 25), 'salt', 13.36, 58.42, None, 20.47, 35.12, 7.98, 832.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:57:40.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:57:40.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:57:40.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:57:25, diff=15.890694s, valid=True
2026-05-29T12:57:40.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:57:40.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:57:40.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:57:12, diff=28.893507s, valid=True
2026-05-29T12:57:40.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:57:40.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:57:40.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:57:19, diff=21.900156s, valid=True
2026-05-29T12:57:40.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:57:40.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:57:40.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:57:40.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:57:40.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:57:40.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:57:40.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:57:12, diff=28.903228s, valid=True
2026-05-29T12:57:40.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:57:40.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:57:40.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:57:40.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984902.90389s, valid=True
2026-05-29T12:57:40.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:57:40.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:57:40.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:57:40.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:57:40.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:57:40.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:57:40.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:57:40.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:57:40.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:57:41.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:57:41.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:57:41.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:57:41.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:57:41.235 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:57:41.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:57:41.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:57:42.001 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:57:42.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:57:42.002 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:57:42.002 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:57:42.085 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:57:42.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:58:12.100 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:58:12.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:58:12.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:58:12.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:58:12.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:58:12.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:58:12.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-05-29T12:58:12.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:58:12.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-05-29T12:58:12.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:58:12.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:58:12.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:58:12.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-05-29T12:58:15.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-05-29T12:58:15.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:58:15.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:58:15.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:58:15.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:58:15.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:58:15.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:58:15.578 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:58:15.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:58:15.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:58:15.579 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:58:15.579 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:58:15.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:58:15.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:58:15.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:58:15.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:58:15.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:58:15.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:58:15.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:58:15.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:58:15.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:58:15.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:58:15.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:58:15.838 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:58:15.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:57:56
2026-05-29T12:58:15.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71895, datetime.datetime(2026, 5, 29, 12, 57, 56), datetime.datetime(2026, 5, 29, 12, 57, 55), 'salt', 13.39, 57.59, None, 22.34, 37.05, 8.18, 832.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:58:15.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:58:15.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:58:15.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:57:55, diff=20.90556s, valid=True
2026-05-29T12:58:15.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:58:15.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:58:15.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:58:12, diff=3.908419s, valid=True
2026-05-29T12:58:15.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:58:15.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:58:15.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:57:49, diff=26.915121s, valid=True
2026-05-29T12:58:15.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:58:15.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:58:15.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:58:15.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:58:15.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:58:15.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:58:15.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:58:12, diff=3.91811s, valid=True
2026-05-29T12:58:15.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:58:15.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:58:15.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:58:15.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984937.918768s, valid=True
2026-05-29T12:58:15.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:58:15.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:58:15.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:58:15.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:58:15.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:58:15.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:58:15.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:58:15.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:58:15.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:58:16.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:58:16.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:58:16.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:58:16.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:58:16.243 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:58:16.464 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:58:16.884 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:58:16.984 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:58:16.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:58:16.984 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:58:16.984 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:58:17.084 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:58:17.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:58:47.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:58:47.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:58:47.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:58:47.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:58:47.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:58:47.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:58:47.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-05-29T12:58:47.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:58:47.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-05-29T12:58:47.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:58:47.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:58:47.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:58:47.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-05-29T12:58:49.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-05-29T12:58:49.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:58:49.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:58:49.926 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:58:49.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:58:49.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:58:49.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:58:49.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:58:49.947 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:58:49.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:58:49.947 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:58:49.948 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:58:49.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:58:50.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:58:50.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:58:50.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:58:50.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:58:50.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:58:50.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:58:50.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:58:50.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:58:50.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:58:50.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:58:50.205 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:58:50.262 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:58:26
2026-05-29T12:58:50.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71896, datetime.datetime(2026, 5, 29, 12, 58, 26), datetime.datetime(2026, 5, 29, 12, 58, 25), 'salt', 13.39, 56.83, None, 24.88, 42.46, 8.37, 832.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:58:50.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:58:50.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:58:50.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:58:25, diff=25.268693s, valid=True
2026-05-29T12:58:50.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:58:50.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:58:50.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:58:12, diff=38.271543s, valid=True
2026-05-29T12:58:50.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:58:50.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:58:50.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:58:19, diff=31.27818s, valid=True
2026-05-29T12:58:50.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:58:50.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:58:50.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:58:50.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:58:50.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:58:50.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:58:50.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:58:12, diff=38.281231s, valid=True
2026-05-29T12:58:50.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:58:50.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:58:50.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:58:50.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=984972.281899s, valid=True
2026-05-29T12:58:50.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:58:50.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:58:50.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:58:50.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:58:50.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:58:50.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:58:50.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:58:50.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:58:50.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:58:50.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:58:50.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:58:50.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:58:50.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:58:50.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:58:50.831 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:58:51.170 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:58:51.267 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:58:51.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:58:51.268 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:58:51.268 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:58:51.351 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:58:51.351 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:59:21.355 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:59:21.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:59:21.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:59:21.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:59:21.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:59:21.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:59:21.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-05-29T12:59:21.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:59: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-05-29T12:59:21.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:59:21.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:59:21.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:59:21.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-05-29T12:59:24.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-05-29T12:59:24.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:59:24.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:59:24.673 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:59:24.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:59:24.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:59:24.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:59:24.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:59:24.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:59:24.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:59:24.695 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:59:24.696 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:59:24.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:59:24.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T12:59:24.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:59:24.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T12:59:24.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:59:24.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:59:24.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:59:24.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T12:59:24.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:59:24.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:59:24.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:59:24.947 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:59:25.006 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:58:56
2026-05-29T12:59:25.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71897, datetime.datetime(2026, 5, 29, 12, 58, 56), datetime.datetime(2026, 5, 29, 12, 58, 55), 'salt', 13.42, 56.43, None, 24.28, 30.55, 8.47, 832.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:59:25.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:59:25.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T12:59:25.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:58:55, diff=30.012407s, valid=True
2026-05-29T12:59:25.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:59:25.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:59:25.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:59:12, diff=13.015328s, valid=True
2026-05-29T12:59:25.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:59:25.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T12:59:25.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:58:50, diff=35.022079s, valid=True
2026-05-29T12:59:25.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:59:25.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:59:25.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:59:25.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:59:25.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:59:25.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T12:59:25.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:59:12, diff=13.02519s, valid=True
2026-05-29T12:59:25.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:59:25.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:59:25.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:59:25.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985007.025856s, valid=True
2026-05-29T12:59:25.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:59:25.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:59:25.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:59:25.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:59:25.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:59:25.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:59:25.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:59:25.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:59:25.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:59:25.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:59:25.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:59:25.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:59:25.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:59:25.343 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T12:59:25.645 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:59:25.990 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T12:59:26.090 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T12:59:26.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T12:59:26.091 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T12:59:26.091 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T12:59:26.189 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T12:59:26.190 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T12:59:56.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T12:59:56.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T12:59:56.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T12:59:56.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T12:59:56.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T12:59:56.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T12:59:56.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-05-29T12:59:56.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T12:59:56.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-05-29T12:59:56.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T12:59:56.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T12:59:56.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T12:59:56.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-05-29T12:59:59.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T12:59:59.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T12:59:59.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T12:59:59.112 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T12:59:59.112 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T12:59:59.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T12:59:59.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T12:59:59.134 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T12:59:59.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T12:59:59.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T12:59:59.134 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T12:59:59.134 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T12:59:59.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T12:59:59.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T12:59:59.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T12:59:59.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T12:59:59.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:59:59.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:59:59.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T12:59:59.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T12:59:59.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T12:59:59.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T12:59:59.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T12:59:59.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T12:59:59.441 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 12:59:56
2026-05-29T12:59:59.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71899, datetime.datetime(2026, 5, 29, 12, 59, 56), datetime.datetime(2026, 5, 29, 12, 59, 56), 'salt', 13.52, 55.9, None, 21.74, 34.77, 8.62, 833.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T12:59:59.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T12:59:59.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T12:59:59.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:59:56, diff=3.447154s, valid=True
2026-05-29T12:59:59.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T12:59:59.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:59:59.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:00:12, diff=-12.549943s, valid=True
2026-05-29T12:59:59.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T12:59:59.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T12:59:59.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 12:59:53, diff=6.456685s, valid=True
2026-05-29T12:59:59.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T12:59:59.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:59:59.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T12:59:59.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T12:59:59.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T12:59:59.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T12:59:59.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:00:12, diff=-12.540234s, valid=True
2026-05-29T12:59:59.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T12:59:59.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T12:59:59.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T12:59:59.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985041.460424s, valid=True
2026-05-29T12:59:59.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T12:59:59.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T12:59:59.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T12:59:59.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T12:59:59.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T12:59:59.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T12:59:59.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T12:59:59.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T12:59:59.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T12:59:59.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T12:59:59.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T12:59:59.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T12:59:59.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T12:59:59.779 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:00:00.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:00:00.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:00:00.506 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:00:00.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:00:00.507 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:00:00.507 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:00:00.595 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:00:00.595 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:00:30.625 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:00:30.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:00:30.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:00:30.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:00:31.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:00:31.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:00:31.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-05-29T13:00:31.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:00:31.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-05-29T13:00:31.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:00:31.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:00:31.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:00:31.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-05-29T13:00:33.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-05-29T13:00:33.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:00:33.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:00:33.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:00:33.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:00:33.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:00:33.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:00:33.656 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:00:33.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:00:33.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:00:33.656 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:00:33.656 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:00:33.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:00:33.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:00:33.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:00:33.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:00:33.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:00:33.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:00:33.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:00:33.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:00:33.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:00:33.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:00:33.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:00:33.920 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:00:33.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:00:27
2026-05-29T13:00:33.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71900, datetime.datetime(2026, 5, 29, 13, 0, 27), datetime.datetime(2026, 5, 29, 13, 0, 26), 'salt', 13.62, 55.5, None, 25.62, 34.0, 8.73, 832.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:00:33.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:00:33.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:00:33.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:00:26, diff=7.986506s, valid=True
2026-05-29T13:00:33.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:00:33.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:00:33.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:00:12, diff=21.989366s, valid=True
2026-05-29T13:00:33.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:00:33.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:00:33.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:00:25, diff=8.996028s, valid=True
2026-05-29T13:00:33.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:00:33.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:00:33.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:00:33.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:00:33.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:00:33.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:00:33.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:00:12, diff=21.999058s, valid=True
2026-05-29T13:00:33.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:00:33.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:00:33.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:00:33.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985075.999735s, valid=True
2026-05-29T13:00:34.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:00:34.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:00:34.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:00:34.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:00:34.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:00:34.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:00:34.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:00:34.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:00:34.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:00:34.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:00:34.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:00:34.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:00:34.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:00:34.316 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:00:34.596 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:00:34.939 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:00:35.040 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:00:35.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:00:35.040 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:00:35.040 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:00:35.329 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:00:35.329 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:01:05.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:01:05.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:01:05.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:01:05.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:01:05.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:01:06.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:01:06.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-05-29T13:01:06.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:01:06.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-05-29T13:01:06.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:01:06.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:01:06.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:01:06.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-05-29T13:01:08.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-05-29T13:01:08.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:01:08.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:01:08.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:01:08.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:01:08.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:01:08.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:01:08.684 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:01:08.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:01:08.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:01:08.684 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:01:08.684 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:01:08.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:01:08.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:01:08.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:01:08.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:01:08.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:01:08.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:01:08.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:01:08.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:01:08.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:01:08.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:01:08.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:01:08.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:01:08.993 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:00:57
2026-05-29T13:01:08.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71901, datetime.datetime(2026, 5, 29, 13, 0, 57), datetime.datetime(2026, 5, 29, 13, 0, 56), 'salt', 13.66, 56.0, None, 24.52, 40.19, 8.61, 833.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:01:08.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:01:08.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:01:09.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:00:56, diff=13.000031s, valid=True
2026-05-29T13:01:09.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:01:09.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:01:09.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:01:12, diff=-2.997126s, valid=True
2026-05-29T13:01:09.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:01:09.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:01:09.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:00:57, diff=12.009644s, valid=True
2026-05-29T13:01:09.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:01:09.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:01:09.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:01:09.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:01:09.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:01:09.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:01:09.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:01:12, diff=-2.987305s, valid=True
2026-05-29T13:01:09.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:01:09.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:01:09.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:01:09.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985111.013359s, valid=True
2026-05-29T13:01:09.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:01:09.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:01:09.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:01:09.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:01:09.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:01:09.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:01:09.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:01:09.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:01:09.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:01:09.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:01:09.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:01:09.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:01:09.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:01:09.328 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:01:09.565 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:01:09.927 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:01:10.033 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:01:10.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:01:10.034 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:01:10.034 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:01:10.205 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:01:10.205 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:01:40.235 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:01:40.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:01:40.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:01:40.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:01:40.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:01:40.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:01:40.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-05-29T13:01:40.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:01:40.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-05-29T13:01:40.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:01:40.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:01:40.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:01:40.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-05-29T13:01:44.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-05-29T13:01:44.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:01:44.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:01:44.180 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:01:44.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:01:44.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:01:44.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:01:44.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:01:44.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:01:44.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:01:44.202 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:01:44.203 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:01:44.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:01:44.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:01:44.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:01:44.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:01:44.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:01:44.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:01:44.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:01:44.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:01:44.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:01:44.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:01:44.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:01:44.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:01:44.512 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:01:27
2026-05-29T13:01:44.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71902, datetime.datetime(2026, 5, 29, 13, 1, 27), datetime.datetime(2026, 5, 29, 13, 1, 27), 'salt', 13.76, 56.5, None, 20.89, 32.42, 8.49, 832.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:01:44.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:01:44.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:01:44.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:01:27, diff=17.518597s, valid=True
2026-05-29T13:01:44.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:01:44.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:01:44.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:01:12, diff=32.521467s, valid=True
2026-05-29T13:01:44.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:01:44.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:01:44.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:01:21, diff=23.528058s, valid=True
2026-05-29T13:01:44.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:01:44.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:01:44.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:01:44.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:01:44.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:01:44.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:01:44.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:01:12, diff=32.531082s, valid=True
2026-05-29T13:01:44.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:01:44.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:01:44.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:01:44.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985146.53174s, valid=True
2026-05-29T13:01:44.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:01:44.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:01:44.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:01:44.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:01:44.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:01:44.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:01:44.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:01:44.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:01:44.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:01:44.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:01:44.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:01:44.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:01:44.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:01:44.922 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:01:45.152 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:01:45.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:01:45.603 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:01:45.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:01:45.603 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:01:45.603 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:01:45.775 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:01:45.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:02:15.805 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:02:15.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:02:15.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:02:16.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:02:16.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:02:16.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:02:16.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T13:02:16.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:02:16.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-05-29T13:02:16.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:02:16.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:02:16.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:02:16.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-05-29T13:02:19.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-05-29T13:02:19.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:02:19.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:02:19.270 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:02:19.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:02:19.280 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:02:19.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:02:19.292 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:02:19.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:02:19.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:02:19.292 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:02:19.292 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:02:19.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:02:19.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:02:19.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:02:19.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:02:19.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:02:19.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:02:19.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:02:19.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:02:19.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:02:19.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:02:19.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:02:19.563 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:02:19.620 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:01:57
2026-05-29T13:02:19.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71903, datetime.datetime(2026, 5, 29, 13, 1, 57), datetime.datetime(2026, 5, 29, 13, 1, 57), 'salt', 13.82, 56.16, None, 18.91, 32.85, 8.57, 832.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:02:19.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:02:19.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:02:19.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:01:57, diff=22.626312s, valid=True
2026-05-29T13:02:19.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:02:19.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:02:19.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:02:12, diff=7.629173s, valid=True
2026-05-29T13:02:19.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:02:19.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:02:19.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:01:51, diff=28.635813s, valid=True
2026-05-29T13:02:19.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:02:19.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:02:19.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:02:19.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:02:19.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:02:19.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:02:19.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:02:12, diff=7.638863s, valid=True
2026-05-29T13:02:19.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:02:19.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:02:19.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:02:19.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985181.639509s, valid=True
2026-05-29T13:02:19.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:02:19.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:02:19.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:02:19.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:02:19.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:02:19.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:02:19.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:02:19.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:02:19.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:02:19.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:02:19.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:02:19.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:02:19.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:02:19.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:02:20.211 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:02:20.554 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:02:20.660 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:02:20.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:02:20.661 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:02:20.661 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:02:20.843 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:02:20.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:02:50.855 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:02:50.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:02:50.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:02:51.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:02:51.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:02:51.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:02:51.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-05-29T13:02:51.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:02:51.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-05-29T13:02:51.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:02:51.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:02:51.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:02:51.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-05-29T13:02:54.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-05-29T13:02:54.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:02:54.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:02:54.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:02:54.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:02:54.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:02:54.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:02:54.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:02:54.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:02:54.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:02:54.056 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:02:54.056 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:02:54.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:02:54.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:02:54.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:02:54.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:02:54.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:02:54.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:02:54.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:02:54.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:02:54.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:02:54.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:02:54.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:02:54.319 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:02:54.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:02:28
2026-05-29T13:02:54.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71904, datetime.datetime(2026, 5, 29, 13, 2, 28), datetime.datetime(2026, 5, 29, 13, 2, 27), 'salt', 13.76, 56.43, None, 18.81, 41.53, 8.5, 832.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:02:54.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:02:54.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:02:54.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:02:27, diff=27.386899s, valid=True
2026-05-29T13:02:54.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:02:54.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:02:54.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:02:12, diff=42.389782s, valid=True
2026-05-29T13:02:54.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:02:54.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:02:54.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:02:21, diff=33.396413s, valid=True
2026-05-29T13:02:54.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:02:54.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:02:54.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:02:54.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:02:54.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:02:54.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:02:54.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:02:12, diff=42.399437s, valid=True
2026-05-29T13:02:54.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:02:54.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:02:54.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:02:54.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985216.400102s, valid=True
2026-05-29T13:02:54.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:02:54.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:02:54.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:02:54.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:02:54.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:02:54.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:02:54.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:02:54.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:02:54.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:02:54.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:02:54.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:02:54.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:02:54.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:02:54.785 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:02:55.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:02:55.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:02:55.449 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:02:55.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:02:55.449 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:02:55.449 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:02:55.608 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:02:55.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:03:25.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:03:25.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:03:25.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:03:26.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:03:26.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:03:26.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:03:26.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-05-29T13:03:26.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:03:26.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-05-29T13:03:26.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:03:26.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:03:26.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:03:26.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-05-29T13:03:28.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-05-29T13:03:28.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:03:28.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:03:28.678 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:03:28.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:03:28.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:03:28.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:03:28.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:03:28.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:03:28.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:03:28.702 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:03:28.702 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:03:28.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:03:28.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:03:28.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:03:28.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:03:28.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:03:28.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:03:28.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:03:29.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:03:29.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:03:29.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:03:29.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:03:29.024 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:03:29.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:03:28
2026-05-29T13:03:29.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71906, datetime.datetime(2026, 5, 29, 13, 3, 28), datetime.datetime(2026, 5, 29, 13, 3, 28), 'salt', 13.79, 57.32, None, 16.66, 15.3, 8.28, 832.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:03:29.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:03:29.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:03:29.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:03:28, diff=1.092942s, valid=True
2026-05-29T13:03:29.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:03:29.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:03:29.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:03:12, diff=17.095846s, valid=True
2026-05-29T13:03:29.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:03:29.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:03:29.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:03:23, diff=6.102587s, valid=True
2026-05-29T13:03:29.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:03:29.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:03:29.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:03:29.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:03:29.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:03:29.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:03:29.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:03:12, diff=17.105639s, valid=True
2026-05-29T13:03:29.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:03:29.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:03:29.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:03:29.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985251.106297s, valid=True
2026-05-29T13:03:29.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:03:29.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:03:29.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:03:29.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:03:29.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:03:29.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:03:29.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:03:29.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:03:29.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:03:29.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:03:29.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:03:29.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:03:29.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:03:29.424 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:03:29.637 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:03:29.999 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:03:30.106 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:03:30.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:03:30.107 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:03:30.107 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:03:30.343 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:03:30.343 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:04:00.373 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:04:00.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:04:00.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:04:00.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:04:00.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:04:01.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:04:01.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-05-29T13:04:01.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:04:01.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-05-29T13:04:01.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:04:01.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:04:01.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:04:01.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-05-29T13:04:03.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-05-29T13:04:03.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:04:03.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:04:03.784 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:04:03.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:04:03.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:04:03.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:04:03.805 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:04:03.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:04:03.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:04:03.805 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:04:03.806 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:04:03.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:04:03.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:04:03.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:04:03.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:04:03.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:04:04.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T13:04:04.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:04:04.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T13:04:04.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:04:04.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:04:04.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:04:04.063 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:04:04.124 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:03:58
2026-05-29T13:04:04.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71907, datetime.datetime(2026, 5, 29, 13, 3, 58), datetime.datetime(2026, 5, 29, 13, 3, 58), 'salt', 13.89, 56.96, None, 15.91, 44.55, 8.37, 832.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:04:04.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:04:04.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:04:04.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:03:58, diff=6.131535s, valid=True
2026-05-29T13:04:04.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:04:04.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T13:04:04.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:04:12, diff=-7.865647s, valid=True
2026-05-29T13:04:04.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:04:04.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:04:04.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:03:55, diff=9.140893s, valid=True
2026-05-29T13:04:04.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:04:04.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:04:04.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:04:04.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:04:04.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:04:04.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T13:04:04.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:04:12, diff=-7.856086s, valid=True
2026-05-29T13:04:04.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:04:04.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:04:04.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:04:04.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985286.144556s, valid=True
2026-05-29T13:04:04.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:04:04.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:04:04.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:04:04.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:04:04.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:04:04.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:04:04.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:04:04.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:04:04.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:04:04.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:04:04.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:04:04.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:04:04.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:04:04.482 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:04:04.696 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:04:05.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:04:05.138 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:04:05.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:04:05.138 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:04:05.138 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:04:05.289 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:04:05.289 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:04:35.319 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:04:35.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:04:35.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:04:35.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:04:35.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:04:35.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:04:35.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-05-29T13:04:36.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:04:36.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-05-29T13:04:36.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:04:36.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:04:36.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:04:36.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T13:04:38.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-05-29T13:04:38.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:04:38.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:04:38.408 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:04:38.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:04:38.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:04:38.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:04:38.429 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:04:38.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:04:38.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:04:38.430 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:04:38.430 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:04:38.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:04:38.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:04:38.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:04:38.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:04:38.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:04:38.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:04:38.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:04:38.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:04:38.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:04:38.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:04:38.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:04:38.683 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:04:38.750 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:04:28
2026-05-29T13:04:38.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71908, datetime.datetime(2026, 5, 29, 13, 4, 28), datetime.datetime(2026, 5, 29, 13, 4, 28), 'salt', 13.95, 57.56, None, 20.5, 30.97, 8.22, 832.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:04:38.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:04:38.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:04:38.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:04:28, diff=10.757037s, valid=True
2026-05-29T13:04:38.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:04:38.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:04:38.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:04:12, diff=26.759901s, valid=True
2026-05-29T13:04:38.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:04:38.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:04:38.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:04:26, diff=12.766692s, valid=True
2026-05-29T13:04:38.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:04:38.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:04:38.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:04:38.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:04:38.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:04:38.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:04:38.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:04:12, diff=26.769732s, valid=True
2026-05-29T13:04:38.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:04:38.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:04:38.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:04:38.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985320.770405s, valid=True
2026-05-29T13:04:38.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:04:38.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:04:38.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:04:38.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:04:38.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:04:38.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:04:38.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:04:38.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:04:38.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:04:38.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:04:38.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:04:38.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:04:39.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:04:39.088 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:04:39.300 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:04:39.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:04:39.834 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:04:39.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:04:39.834 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:04:39.834 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:04:39.986 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:04:39.986 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:05:10.015 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:05:10.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:05:10.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:05:10.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:05:10.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:05:10.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:05:10.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-05-29T13:05:10.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:05:10.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-05-29T13:05:10.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:05:10.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:05:10.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:05:10.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-05-29T13:05:13.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-05-29T13:05:13.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:05:13.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:05:13.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:05:13.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:05:13.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:05:13.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:05:13.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:05:13.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:05:13.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:05:13.086 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:05:13.086 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:05:13.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:05:13.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:05:13.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:05:13.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:05:13.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:05:13.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:05:13.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:05:13.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:05:13.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:05:13.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:05:13.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:05:13.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:05:13.415 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:04:59
2026-05-29T13:05:13.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71909, datetime.datetime(2026, 5, 29, 13, 4, 59), datetime.datetime(2026, 5, 29, 13, 4, 58), 'salt', 14.09, 58.05, None, 16.76, 26.42, 8.11, 832.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:05:13.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:05:13.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:05:13.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:04:58, diff=15.422009s, valid=True
2026-05-29T13:05:13.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:05:13.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:05:13.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:05:12, diff=1.424874s, valid=True
2026-05-29T13:05:13.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:05:13.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:05:13.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:04:58, diff=15.431558s, valid=True
2026-05-29T13:05:13.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:05:13.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:05:13.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:05:13.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:05:13.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:05:13.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:05:13.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:05:12, diff=1.434638s, valid=True
2026-05-29T13:05:13.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:05:13.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:05:13.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:05:13.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985355.435291s, valid=True
2026-05-29T13:05:13.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:05:13.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:05:13.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:05:13.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:05:13.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:05:13.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:05:13.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:05:13.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:05:13.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:05:13.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:05:13.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:05:13.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:05:13.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:05:13.751 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:05:13.983 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:05:14.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:05:14.440 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:05:14.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:05:14.440 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:05:14.441 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:05:14.940 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:05:14.940 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:05:44.966 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:05:44.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:05:44.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:05:45.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:05:45.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:05:45.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:05:45.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-05-29T13:05:45.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:05:45.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-05-29T13:05:45.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:05:45.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:05:45.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:05:45.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-05-29T13:05:47.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-05-29T13:05:47.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:05:47.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:05:47.835 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:05:47.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:05:47.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:05:47.853 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:05:47.853 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:05:47.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:05:47.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:05:47.854 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:05:47.854 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:05:47.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:05:47.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:05:47.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:05:48.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:05:48.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:05:48.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:05:48.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:05:48.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:05:48.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:05:48.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:05:48.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:05:48.136 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:05:48.205 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:05:29
2026-05-29T13:05:48.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71910, datetime.datetime(2026, 5, 29, 13, 5, 29), datetime.datetime(2026, 5, 29, 13, 5, 29), 'salt', 14.25, 57.42, None, 16.62, 31.91, 8.28, 832.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:05:48.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:05:48.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:05:48.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:05:29, diff=19.212108s, valid=True
2026-05-29T13:05:48.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:05:48.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:05:48.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:05:12, diff=36.215045s, valid=True
2026-05-29T13:05:48.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:05:48.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:05:48.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:05:23, diff=25.221736s, valid=True
2026-05-29T13:05:48.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:05:48.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:05:48.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:05:48.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:05:48.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:05:48.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:05:48.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:05:12, diff=36.224847s, valid=True
2026-05-29T13:05:48.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:05:48.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:05:48.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:05:48.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985390.225518s, valid=True
2026-05-29T13:05:48.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:05:48.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:05:48.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:05:48.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:05:48.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:05:48.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:05:48.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:05:48.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:05:48.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:05:48.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:05:48.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:05:48.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:05:48.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:05:48.544 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:05:48.853 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:05:49.201 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:05:49.302 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:05:49.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:05: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-05-29T13:05: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-05-29T13:05:49.556 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:05:49.557 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:06:19.587 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:06:19.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:06:19.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:06:19.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:06:19.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:06:20.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:06:20.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-05-29T13:06:20.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:06:20.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-05-29T13:06:20.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:06:20.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:06:20.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:06:20.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-05-29T13:06:22.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-05-29T13:06:22.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:06:22.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:06:22.535 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:06:22.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:06:22.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:06:22.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:06:22.556 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:06:22.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:06:22.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:06:22.556 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:06:22.557 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:06:22.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:06:22.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:06:22.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:06:22.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:06:22.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:06:22.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:06:22.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:06:22.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:06:22.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:06:22.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:06:22.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:06:22.825 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:06:22.884 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:05:59
2026-05-29T13:06:22.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71911, datetime.datetime(2026, 5, 29, 13, 5, 59), datetime.datetime(2026, 5, 29, 13, 5, 59), 'salt', 14.35, 57.13, None, 17.68, 19.85, 8.36, 832.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:06:22.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:06:22.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:06:22.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:05:59, diff=23.890388s, valid=True
2026-05-29T13:06:22.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:06:22.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:06:22.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:06:12, diff=10.893281s, valid=True
2026-05-29T13:06:22.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:06:22.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:06:22.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:05:54, diff=28.89994s, valid=True
2026-05-29T13:06:22.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:06:22.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:06:22.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:06:22.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:06:22.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:06:22.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:06:22.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:06:12, diff=10.903053s, valid=True
2026-05-29T13:06:22.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:06:22.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:06:22.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:06:22.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985424.903724s, valid=True
2026-05-29T13:06:22.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:06:22.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:06:22.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:06:22.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:06:22.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:06:22.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:06:22.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:06:22.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:06:22.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:06:23.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:06:23.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:06:23.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:06:23.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:06:23.223 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:06:23.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:06:23.779 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:06:23.877 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:06:23.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:06:23.877 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:06:23.877 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:06:24.052 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:06:24.052 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:06:54.083 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:06:54.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:06:54.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:06:54.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:06:54.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:06:54.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:06:54.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-05-29T13:06:54.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:06:54.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-05-29T13:06:54.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:06:54.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:06:54.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:06:54.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-05-29T13:06:57.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T13:06:57.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:06:57.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:06:57.494 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:06:57.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:06:57.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:06:57.514 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:06:57.514 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:06:57.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:06:57.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:06:57.515 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:06:57.515 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:06:57.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:06:57.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:06:57.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:06:57.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:06:57.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:06:57.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:06:57.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:06:57.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:06:57.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:06:57.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:06:57.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:06:57.782 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:06:57.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:06:29
2026-05-29T13:06:57.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71912, datetime.datetime(2026, 5, 29, 13, 6, 29), datetime.datetime(2026, 5, 29, 13, 6, 29), 'salt', 14.52, 56.06, None, 17.22, 26.65, 8.64, 832.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:06:57.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:06:57.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:06:57.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:06:29, diff=28.846964s, valid=True
2026-05-29T13:06:57.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:06:57.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:06:57.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:06:12, diff=45.849793s, valid=True
2026-05-29T13:06:57.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:06:57.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:06:57.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:06:24, diff=33.856449s, valid=True
2026-05-29T13:06:57.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:06:57.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:06:57.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:06:57.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:06:57.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:06:57.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:06:57.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:06:12, diff=45.85947s, valid=True
2026-05-29T13:06:57.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:06:57.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:06:57.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:06:57.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985459.860152s, valid=True
2026-05-29T13:06:57.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:06:57.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:06:57.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:06:57.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:06:57.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:06:57.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:06:57.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:06:57.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:06:57.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:06:57.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:06:58.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:06:58.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:06:58.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:06:58.249 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:06:58.482 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:06:58.834 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:06:58.934 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:06:58.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:06:58.935 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:06:58.935 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:06:59.195 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:06:59.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:07:29.226 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:07:29.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:07:29.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:07:29.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:07:29.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:07:29.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:07:29.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-05-29T13:07:29.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:07:29.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-05-29T13:07:29.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:07:29.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:07:29.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:07:29.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-05-29T13:07:32.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-05-29T13:07:32.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:07:32.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:07:32.418 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:07:32.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:07:32.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:07:32.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:07:32.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:07:32.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:07:32.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:07:32.438 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:07:32.438 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:07:32.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:07:32.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:07:32.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:07:32.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:07:32.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:07:32.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:07:32.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:07:32.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:07:32.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:07:32.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:07:32.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:07:32.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:07:32.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:07:30
2026-05-29T13:07:32.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71914, datetime.datetime(2026, 5, 29, 13, 7, 30), datetime.datetime(2026, 5, 29, 13, 7, 29), 'salt', 14.32, 53.64, None, 25.02, 37.68, 9.27, 832.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:07:32.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:07:32.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:07:32.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:07:29, diff=3.764874s, valid=True
2026-05-29T13:07:32.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:07:32.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:07:32.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:07:12, diff=20.767695s, valid=True
2026-05-29T13:07:32.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:07:32.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:07:32.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:07:25, diff=7.774279s, valid=True
2026-05-29T13:07:32.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:07:32.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:07:32.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:07:32.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:07:32.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:07:32.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:07:32.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:07:12, diff=20.777305s, valid=True
2026-05-29T13:07:32.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:07:32.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:07:32.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:07:32.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985494.777956s, valid=True
2026-05-29T13:07:32.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:07:32.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:07:32.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:07:32.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:07:32.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:07:32.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:07:32.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:07:32.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:07:32.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:07:32.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:07:32.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:07:33.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:07:33.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:07:33.112 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:07:33.336 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:07:33.688 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:07:33.798 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:07:33.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:07:33.798 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:07:33.798 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:07:34.058 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:07:34.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:08:04.070 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:08:04.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:08:04.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:08:04.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:08:04.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:08:04.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:08:04.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-05-29T13:08:04.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:08:04.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-05-29T13:08:04.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:08:04.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:08:04.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:08:04.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-05-29T13:08:07.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-05-29T13:08:07.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:08:07.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:08:07.526 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:08:07.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:08:07.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:08:07.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:08:07.546 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:08:07.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:08:07.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:08:07.546 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:08:07.546 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:08:07.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:08:07.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:08:07.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:08:07.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:08:07.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:08:07.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T13:08:07.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:08:07.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T13:08:07.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:08:07.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:08:07.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:08:07.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:08:07.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:08:00
2026-05-29T13:08:07.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71915, datetime.datetime(2026, 5, 29, 13, 8), datetime.datetime(2026, 5, 29, 13, 8), 'salt', 14.22, 54.34, None, 23.61, 28.04, 9.07, 832.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:08:07.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:08:07.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:08:07.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:08:00, diff=7.897552s, valid=True
2026-05-29T13:08:07.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:08:07.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T13:08:07.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:08:12, diff=-4.099533s, valid=True
2026-05-29T13:08:07.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:08:07.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:08:07.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:07:56, diff=11.90802s, valid=True
2026-05-29T13:08:07.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:08:07.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:08:07.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:08:07.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:08:07.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:08:07.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T13:08:07.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:08:12, diff=-4.088466s, valid=True
2026-05-29T13:08:07.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:08:07.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:08:07.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:08:07.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985529.912227s, valid=True
2026-05-29T13:08:07.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:08:07.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:08:07.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:08:07.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:08:07.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:08:07.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:08:07.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:08:07.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:08:07.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:08:08.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:08:08.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:08:08.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:08:08.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:08:08.299 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:08:08.534 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:08:08.881 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:08:08.982 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:08:08.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:08:08.982 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:08:08.982 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:08:09.050 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:08:09.050 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:08:39.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:08:39.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:08:39.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:08:39.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:08:39.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:08:40.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:08:40.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-05-29T13:08:40.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:08:40.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-05-29T13:08:40.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:08:40.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:08:40.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:08: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-05-29T13:08:42.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-05-29T13:08:42.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:08:42.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:08:42.587 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:08:42.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:08:42.595 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:08:42.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:08:42.607 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:08:42.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:08:42.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:08:42.607 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:08:42.607 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:08:42.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:08:42.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:08:42.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:08:42.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:08:42.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:08:42.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:08:42.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:08:42.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:08:42.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:08:42.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:08:42.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:08:42.867 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:08:42.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:08:30
2026-05-29T13:08:42.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71916, datetime.datetime(2026, 5, 29, 13, 8, 30), datetime.datetime(2026, 5, 29, 13, 8, 30), 'salt', 14.12, 53.31, None, 19.97, 24.4, 9.34, 832.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:08:42.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:08:42.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:08:42.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:08:30, diff=12.930448s, valid=True
2026-05-29T13:08:42.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:08:42.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:08:42.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:08:12, diff=30.933301s, valid=True
2026-05-29T13:08:42.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:08:42.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:08:42.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:08:28, diff=14.93995s, valid=True
2026-05-29T13:08:42.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:08:42.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:08:42.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:08:42.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:08:42.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:08:42.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:08:42.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:08:12, diff=30.943002s, valid=True
2026-05-29T13:08:42.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:08:42.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:08:42.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:08:42.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985564.943674s, valid=True
2026-05-29T13:08:42.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:08:42.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:08:42.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:08:42.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:08:42.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:08:43.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:08:43.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:08:43.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:08:43.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:08:43.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:08:43.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:08:43.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:08:43.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:08:43.261 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:08:43.473 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:08:43.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:08:43.919 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:08:43.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:08:43.920 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:08:43.920 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:08:44.083 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:08:44.083 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:09:14.113 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:09:14.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:09:14.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:09:14.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:09:14.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:09:14.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:09:14.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T13:09:14.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:09:14.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-05-29T13:09:14.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:09:14.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:09:14.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:09:14.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-05-29T13:09:17.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-05-29T13:09:17.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:09:17.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:09:17.066 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:09:17.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:09:17.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:09:17.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:09:17.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:09:17.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:09:17.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:09:17.086 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:09:17.086 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:09:17.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:09:17.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:09:17.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:09:17.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:09:17.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:09:17.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:09:17.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:09:17.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:09:17.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:09:17.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:09:17.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:09:17.337 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:09:17.396 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:09:01
2026-05-29T13:09:17.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71917, datetime.datetime(2026, 5, 29, 13, 9, 1), datetime.datetime(2026, 5, 29, 13, 9), 'salt', 14.12, 53.74, None, 18.31, 46.15, 9.22, 832.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:09:17.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:09:17.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:09:17.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:09:00, diff=17.402549s, valid=True
2026-05-29T13:09:17.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:09:17.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:09:17.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:09:12, diff=5.405364s, valid=True
2026-05-29T13:09:17.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:09:17.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:09:17.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:08:59, diff=18.411972s, valid=True
2026-05-29T13:09:17.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:09:17.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:09:17.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:09:17.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:09:17.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:09:17.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:09:17.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:09:12, diff=5.414975s, valid=True
2026-05-29T13:09:17.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:09:17.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:09:17.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:09:17.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985599.415645s, valid=True
2026-05-29T13:09:17.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:09:17.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:09:17.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:09:17.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:09:17.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:09:17.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:09:17.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:09:17.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:09:17.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:09:17.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:09:17.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:09:17.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:09:17.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:09:17.801 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:09:18.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:09:18.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:09:18.463 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:09:18.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:09:18.463 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:09:18.463 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:09:18.631 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:09:18.631 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:09:48.631 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:09:48.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:09:48.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:09:48.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:09:48.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:09:49.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:09:49.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-05-29T13:09:49.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:09:49.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-05-29T13:09:49.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:09:49.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:09:49.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:09:49.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-05-29T13:09:51.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-05-29T13:09:51.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:09:51.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:09:51.747 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:09:51.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:09:51.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:09:51.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:09:51.768 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:09:51.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:09:51.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:09:51.769 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:09:51.769 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:09:51.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:09:51.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:09:51.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:09:51.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:09:51.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:09:51.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:09:51.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:09:52.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:09:52.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:09:52.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:09:52.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:09:52.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:09:52.104 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:09:31
2026-05-29T13:09:52.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71918, datetime.datetime(2026, 5, 29, 13, 9, 31), datetime.datetime(2026, 5, 29, 13, 9, 30), 'salt', 14.29, 54.47, None, 26.99, 33.76, 9.05, 832.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:09:52.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:09:52.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:09:52.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:09:30, diff=22.111234s, valid=True
2026-05-29T13:09:52.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:09:52.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:09:52.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:09:12, diff=40.11408s, valid=True
2026-05-29T13:09:52.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:09:52.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:09:52.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:09:26, diff=26.120625s, valid=True
2026-05-29T13:09:52.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:09:52.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:09:52.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:09:52.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:09:52.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:09:52.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:09:52.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:09:12, diff=40.123647s, valid=True
2026-05-29T13:09:52.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:09:52.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:09:52.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:09:52.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985634.1243s, valid=True
2026-05-29T13:09:52.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:09:52.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:09:52.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:09:52.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:09:52.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:09:52.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:09:52.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:09:52.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:09:52.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:09:52.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:09:52.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:09:52.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:09:52.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:09:52.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:09:52.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:09:53.035 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:09:53.152 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:09:53.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:09:53.152 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:09:53.153 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:09:53.367 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:09:53.368 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:10:23.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:10:23.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:10:23.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:10:23.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:10:23.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:10:23.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:10:23.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-05-29T13:10:23.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:10:23.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-05-29T13:10:23.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:10:23.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:10:23.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:10:23.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-05-29T13:10:26.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-05-29T13:10:26.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:10:26.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:10:26.312 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:10:26.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:10:26.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:10:26.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:10:26.333 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:10:26.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:10:26.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:10:26.333 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:10:26.333 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:10:26.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:10:26.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:10:26.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:10:26.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:10:26.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:10:26.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:10:26.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:10:26.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:10:26.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:10:26.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:10:26.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:10:26.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:10:26.705 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:10:01
2026-05-29T13:10:26.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71919, datetime.datetime(2026, 5, 29, 13, 10, 1), datetime.datetime(2026, 5, 29, 13, 10, 1), 'salt', 14.29, 53.78, None, 22.3, 36.79, 9.23, 832.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:10:26.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:10:26.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:10:26.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:01, diff=25.712036s, valid=True
2026-05-29T13:10:26.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:10:26.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:10:26.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=14.714876s, valid=True
2026-05-29T13:10:26.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:10:26.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:10:26.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:09:56, diff=30.72145s, valid=True
2026-05-29T13:10:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:10:26.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:10:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:10:26.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:10:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:10:26.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:10:26.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=14.724457s, valid=True
2026-05-29T13:10:26.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:10:26.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:10:26.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:10:26.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985668.725119s, valid=True
2026-05-29T13:10:26.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:10:26.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:10:26.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:10:26.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:10:26.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:10:26.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:10:26.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:10:26.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:10:26.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:10:26.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:10:26.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:10:26.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:10:27.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:10:27.043 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:10:27.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:10:27.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:10:27.710 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:10:27.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:10:27.710 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:10:27.710 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:10:27.880 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:10:27.880 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:10:57.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:10:57.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:10:57.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:10:58.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:10:58.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:10:58.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:10:58.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-05-29T13:10:58.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:10:58.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-05-29T13:10:58.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:10:58.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:10:58.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:10:58.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-05-29T13:11:00.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-05-29T13:11:00.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:11:00.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:11:00.982 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:11:00.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:11:00.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:11:01.002 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:11:01.002 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:11:01.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:11:01.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:11:01.002 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:11:01.002 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:11:01.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:11:01.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:11:01.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:11:01.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:11:01.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:11:01.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:11:01.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:11:01.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:11:01.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:11:01.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:11:01.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:11:01.271 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:11:01.334 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:10:31
2026-05-29T13:11:01.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71920, datetime.datetime(2026, 5, 29, 13, 10, 31), datetime.datetime(2026, 5, 29, 13, 10, 31), 'salt', 14.35, 53.64, None, 23.64, 37.02, 9.27, 832.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:11:01.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:11:01.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:11:01.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:31, diff=30.340507s, valid=True
2026-05-29T13:11:01.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:11:01.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:11:01.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=49.343411s, valid=True
2026-05-29T13:11:01.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:11:01.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:11:01.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:26, diff=35.350119s, valid=True
2026-05-29T13:11:01.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:11:01.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:11:01.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:11:01.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:11:01.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:11:01.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:11:01.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=49.35326s, valid=True
2026-05-29T13:11:01.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:11:01.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:11:01.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:11:01.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985703.353941s, valid=True
2026-05-29T13:11:01.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:11:01.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:11:01.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:11:01.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:11:01.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:11:01.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:11:01.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:11:01.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:11:01.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:11:01.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:11:01.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:11:01.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:11:01.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:11:01.681 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:11:01.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:11:02.299 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:11:02.464 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:11:02.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:11:02.464 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:11:02.465 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:11:02.637 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:11:02.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:11:32.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:11:32.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:11:32.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:11:33.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:11:33.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:11:33.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:11:33.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-05-29T13:11:33.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:11:33.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-05-29T13:11:33.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:11:33.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:11:33.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:11:33.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-05-29T13:11:36.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-05-29T13:11:36.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:11:36.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:11:36.085 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:11:36.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:11:36.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:11:36.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:11:36.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:11:36.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:11:36.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:11:36.106 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:11:36.106 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:11:36.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:11:36.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:11:36.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:11:36.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:11:36.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:11:36.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:11:36.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:11:36.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:11:36.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:11:36.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:11:36.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:11:36.430 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:11:36.542 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:11:32
2026-05-29T13:11:36.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71922, datetime.datetime(2026, 5, 29, 13, 11, 32), datetime.datetime(2026, 5, 29, 13, 11, 31), 'salt', 14.35, 53.31, None, 20.82, 38.08, 9.35, 832.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:11:36.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:11:36.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:11:36.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:11:31, diff=5.548848s, valid=True
2026-05-29T13:11:36.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:11:36.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:11:36.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=84.551696s, valid=True
2026-05-29T13:11:36.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:11:36.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:11:36.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:11:27, diff=9.558324s, valid=True
2026-05-29T13:11:36.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:11:36.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:11:36.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:11:36.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:11:36.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:11:36.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:11:36.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=84.561355s, valid=True
2026-05-29T13:11:36.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:11:36.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:11:36.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:11:36.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985738.562029s, valid=True
2026-05-29T13:11:36.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:11:36.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:11:36.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:11:36.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:11:36.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:11:36.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:11:36.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:11:36.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:11:36.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:11:36.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:11:36.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:11:36.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:11:36.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:11:36.876 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:11:37.092 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:11:37.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:11:37.537 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:11:37.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:11:37.538 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:11:37.538 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:11:37.796 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:11:37.796 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:12:07.826 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:12:07.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:12:07.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:12:07.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:12:07.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:12:08.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:12:08.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-05-29T13:12:08.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:12:08.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T13:12:08.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:12:08.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:12:08.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:12:08.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-05-29T13:12:10.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-05-29T13:12:10.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:12:10.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:12:10.792 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:12:10.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:12:10.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:12:10.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:12:10.813 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:12:10.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:12:10.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:12:10.814 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:12:10.814 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:12:10.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:12:10.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:12:10.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:12:10.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:12:10.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:12:11.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:12:11.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:12:11.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:12:11.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:12:11.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:12:11.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:12:11.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:12:11.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:12:02
2026-05-29T13:12:11.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71923, datetime.datetime(2026, 5, 29, 13, 12, 2), datetime.datetime(2026, 5, 29, 13, 12, 1), 'salt', 14.15, 53.05, None, 22.72, 40.68, 9.41, 832.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:12:11.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:12:11.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:12:11.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:12:01, diff=10.146762s, valid=True
2026-05-29T13:12:11.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:12:11.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:12:11.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=119.149692s, valid=True
2026-05-29T13:12:11.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:12:11.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:12:11.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:11:58, diff=13.156376s, valid=True
2026-05-29T13:12:11.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:12:11.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:12:11.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:12:11.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:12:11.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:12:11.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:12:11.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=119.159446s, valid=True
2026-05-29T13:12:11.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:12:11.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:12:11.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:12:11.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985773.16013s, valid=True
2026-05-29T13:12:11.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:12:11.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:12:11.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:12:11.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:12:11.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:12:11.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:12:11.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:12:11.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:12:11.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:12:11.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:12:11.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:12:11.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:12:11.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:12:11.480 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:12:11.770 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:12:12.140 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:12:12.240 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:12:12.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:12:12.240 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:12:12.240 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:12:12.394 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:12:12.394 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:12:42.398 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:12:42.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:12:42.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:12:42.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:12:42.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:12:42.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:12:42.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-05-29T13:12:42.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:12:42.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-05-29T13:12:42.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:12:42.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:12:42.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:12:42.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-05-29T13:12:45.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-05-29T13:12:45.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:12:45.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:12:45.587 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:12:45.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:12:45.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:12:45.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:12:45.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:12:45.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:12:45.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:12:45.609 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:12:45.609 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:12:45.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:12:45.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:12:45.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:12:45.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:12:45.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:12:45.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:12:45.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:12:45.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:12:45.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:12:45.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:12:45.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:12:45.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:12:45.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:12:32
2026-05-29T13:12:45.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71924, datetime.datetime(2026, 5, 29, 13, 12, 32), datetime.datetime(2026, 5, 29, 13, 12, 32), 'salt', 13.95, 53.91, None, 21.77, 53.42, 9.17, 832.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:12:45.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:12:45.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:12:45.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:12:32, diff=13.957729s, valid=True
2026-05-29T13:12:45.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:12:45.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:12:45.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=153.960703s, valid=True
2026-05-29T13:12:45.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:12:45.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:12:45.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:12:30, diff=15.967465s, valid=True
2026-05-29T13:12:45.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:12:45.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:12:45.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:12:45.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:12:45.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:12:45.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:12:45.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=153.970562s, valid=True
2026-05-29T13:12:45.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:12:45.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:12:45.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:12:45.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985807.97123s, valid=True
2026-05-29T13:12:45.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:12:45.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:12:45.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:12:45.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:12:45.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:12:46.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:12:46.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:12:46.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:12:46.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:12:46.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:12:46.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:12:46.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:12:46.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:12:46.290 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:12:46.503 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:12:46.852 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:12:46.954 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:12:46.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:12:46.954 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:12:46.954 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:12:47.169 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:12:47.169 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:13:17.190 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:13:17.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:13:17.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:13:17.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:13:17.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:13:17.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:13:17.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-05-29T13:13:17.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:13:17.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-05-29T13:13:17.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:13:17.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:13:17.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:13: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-05-29T13:13:20.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-05-29T13:13:20.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:13:20.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:13:20.547 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:13:20.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:13:20.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:13:20.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:13:20.567 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:13:20.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:13:20.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:13:20.568 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:13:20.568 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:13:20.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:13:20.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:13:20.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:13:20.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:13:20.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:13:20.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:13:20.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:13:20.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:13:20.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:13:20.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:13:20.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:13:20.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:13:20.887 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:13:02
2026-05-29T13:13:20.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71925, datetime.datetime(2026, 5, 29, 13, 13, 2), datetime.datetime(2026, 5, 29, 13, 13, 2), 'salt', 13.95, 53.41, None, 23.85, 43.94, 9.3, 832.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:13:20.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:13:20.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:13:20.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:13:02, diff=18.893301s, valid=True
2026-05-29T13:13:20.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:13:20.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:13:20.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=188.896161s, valid=True
2026-05-29T13:13:20.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:13:20.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:13:20.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:13:01, diff=19.902825s, valid=True
2026-05-29T13:13:20.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:13:20.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:13:20.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:13:20.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:13:20.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:13:20.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:13:20.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=188.905863s, valid=True
2026-05-29T13:13:20.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:13:20.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:13:20.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:13:20.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985842.906505s, valid=True
2026-05-29T13:13:20.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:13:20.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:13:20.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:13:20.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:13:20.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:13:20.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:13:20.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:13:20.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:13:21.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:13:21.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:13:21.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:13:21.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:13:21.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:13:21.313 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:13:21.534 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:13:21.886 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:13:21.998 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:13:21.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:13:21.998 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:13:21.998 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:13:22.154 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:13:22.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:13:52.183 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:13:52.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:13:52.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:13:52.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:13:52.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:13:52.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:13:52.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-05-29T13:13:52.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:13:52.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-05-29T13:13:52.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:13:52.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:13:52.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:13:52.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-05-29T13:13:55.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-05-29T13:13:55.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:13:55.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:13:55.145 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:13:55.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:13:55.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:13:55.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:13:55.177 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:13:55.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:13:55.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:13:55.178 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:13:55.178 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:13:55.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:13:55.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:13:55.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:13:55.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:13:55.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:13:55.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:13:55.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:13:55.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:13:55.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:13:55.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:13:55.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:13:55.434 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:13:55.492 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:13:33
2026-05-29T13:13:55.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71926, datetime.datetime(2026, 5, 29, 13, 13, 33), datetime.datetime(2026, 5, 29, 13, 13, 32), 'salt', 13.75, 53.78, None, 25.02, 35.54, 9.19, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:13:55.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:13:55.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:13:55.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:13:32, diff=23.498988s, valid=True
2026-05-29T13:13:55.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:13:55.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:13:55.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=223.501822s, valid=True
2026-05-29T13:13:55.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:13:55.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:13:55.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:13:28, diff=27.508408s, valid=True
2026-05-29T13:13:55.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:13:55.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:13:55.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:13:55.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:13:55.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:13:55.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:13:55.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=223.511424s, valid=True
2026-05-29T13:13:55.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:13:55.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:13:55.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:13:55.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985877.512081s, valid=True
2026-05-29T13:13:55.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:13:55.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:13:55.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:13:55.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:13:55.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:13:55.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:13:55.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:13:55.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:13:55.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:13:55.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:13:55.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:13:55.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:13:55.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:13:55.827 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:13:56.038 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:13:56.379 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:13:56.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:13:56.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:13:56.479 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:13:56.479 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:13:56.653 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:13:56.653 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:14:26.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:14:26.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:14:26.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:14:27.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:14:27.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:14:27.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:14:27.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-05-29T13:14:27.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:14:27.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-05-29T13:14:27.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:14:27.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:14:27.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:14:27.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-05-29T13:14:29.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T13:14:29.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:14:29.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:14:29.873 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:14:29.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:14:29.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:14:29.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:14:29.893 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:14:29.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:14:29.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:14:29.894 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:14:29.894 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:14:29.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:14:29.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:14:29.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:14:30.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:14:30.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:14:30.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:14:30.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:14:30.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:14:30.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:14:30.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:14:30.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:14:30.184 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:14:30.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:14:03
2026-05-29T13:14:30.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71927, datetime.datetime(2026, 5, 29, 13, 14, 3), datetime.datetime(2026, 5, 29, 13, 14, 2), 'salt', 13.82, 53.68, None, 27.66, 43.24, 9.22, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:14:30.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:14:30.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:14:30.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:14:02, diff=28.252642s, valid=True
2026-05-29T13:14:30.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:14:30.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:14:30.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=258.255487s, valid=True
2026-05-29T13:14:30.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:14:30.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:14:30.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:13:58, diff=32.262168s, valid=True
2026-05-29T13:14:30.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:14:30.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:14:30.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:14:30.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:14:30.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:14:30.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:14:30.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=258.265162s, valid=True
2026-05-29T13:14:30.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:14:30.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:14:30.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:14:30.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985912.265825s, valid=True
2026-05-29T13:14:30.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:14:30.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:14:30.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:14:30.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:14:30.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:14:30.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:14:30.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:14:30.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:14:30.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:14:30.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:14:30.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:14:30.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:14:30.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:14:30.652 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:14:30.866 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:14:31.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:14:31.332 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:14:31.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:14:31.333 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:14:31.333 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:14:31.507 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:14:31.507 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:15:01.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:15:01.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:15:01.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:15:01.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:15:01.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:15:02.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:15:02.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-05-29T13:15:02.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:15:02.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-05-29T13:15:02.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:15:02.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:15:02.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:15:02.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-05-29T13:15:04.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-05-29T13:15:04.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:15:04.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:15:04.607 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:15:04.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:15:04.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:15:04.628 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:15:04.628 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:15:04.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:15:04.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:15:04.629 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:15:04.629 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:15:04.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:15:04.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:15:04.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:15:04.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:15:04.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:15:04.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:15:04.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:15:04.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:15:04.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:15:04.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:15:04.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:15:04.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:15:04.974 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:15:03
2026-05-29T13:15:04.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71929, datetime.datetime(2026, 5, 29, 13, 15, 3), datetime.datetime(2026, 5, 29, 13, 15, 3), 'salt', 13.79, 52.58, None, 22.19, 53.6, 9.52, 832.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:15:04.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:15:04.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:15:04.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:15:03, diff=1.981068s, valid=True
2026-05-29T13:15:04.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:15:04.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:15:04.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=292.983949s, valid=True
2026-05-29T13:15:04.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:15:04.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:15:04.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:14:58, diff=6.990648s, valid=True
2026-05-29T13:15:04.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:15:04.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:15:04.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:15:04.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:15:04.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:15:04.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:15:04.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:10:12, diff=292.993696s, valid=True
2026-05-29T13:15:04.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:15:04.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:15:04.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:15:04.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985946.994343s, valid=True
2026-05-29T13:15:04.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:15:04.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:15:04.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:15:04.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:15:04.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:15:05.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:15:05.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:15:05.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:15:05.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:15:05.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:15:05.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:15:05.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:15:05.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:15:05.309 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:15:05.520 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:15:05.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:15:05.962 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:15:05.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:15:05.962 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:15:05.962 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:15:06.218 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:15:06.219 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:15:36.226 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:15:36.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:15:36.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:15:36.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:15:36.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:15:36.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:15:36.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-05-29T13:15:36.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:15:36.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-05-29T13:15:36.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:15:36.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:15:36.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:15:36.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-05-29T13:15:39.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T13:15:39.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:15:39.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:15:39.362 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:15:39.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:15:39.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:15:39.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:15:39.382 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:15:39.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:15:39.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:15:39.382 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:15:39.382 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:15:39.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:15:39.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:15:39.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:15:39.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:15:39.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:15:39.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:15:39.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:15:39.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:15:39.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:15:39.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:15:39.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:15:39.646 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:15:39.705 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:15:34
2026-05-29T13:15:39.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71930, datetime.datetime(2026, 5, 29, 13, 15, 34), datetime.datetime(2026, 5, 29, 13, 15, 33), 'salt', 13.56, 53.15, None, 22.02, 40.37, 9.35, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:15:39.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:15:39.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:15:39.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:15:33, diff=6.71175s, valid=True
2026-05-29T13:15:39.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:15:39.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:15:39.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:16:12, diff=-32.285413s, valid=True
2026-05-29T13:15:39.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:15:39.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:15:39.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:15:29, diff=10.721203s, valid=True
2026-05-29T13:15:39.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:15:39.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:15:39.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:15:39.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:15:39.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:15:39.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:15:39.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:16:12, diff=-32.275756s, valid=True
2026-05-29T13:15:39.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:15:39.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:15:39.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:15:39.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=985981.724905s, valid=True
2026-05-29T13:15:39.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:15:39.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:15:39.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:15:39.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:15:39.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:15:39.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:15:39.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:15:39.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:15:39.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:15:39.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:15:40.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:15:40.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:15:40.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:15:40.146 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:15:40.366 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:15:40.718 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:15:40.821 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:15:40.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:15:40.821 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:15:40.821 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:15:40.996 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:15:40.996 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:16:11.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:16:11.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:16:11.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:16:11.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:16:11.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:16:11.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:16:11.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-05-29T13:16:11.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:16:11.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-05-29T13:16:11.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:16:11.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:16:11.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:16:11.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-05-29T13:16:14.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-05-29T13:16:14.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:16:14.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:16:14.386 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:16:14.386 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:16:14.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:16:14.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:16:14.406 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:16:14.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:16:14.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:16:14.407 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:16:14.407 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:16:14.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:16:14.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:16:14.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:16:14.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:16:14.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:16:14.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:16:14.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:16:14.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:16:14.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:16:14.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:16:14.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:16:14.667 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:16:14.725 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:16:04
2026-05-29T13:16:14.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71931, datetime.datetime(2026, 5, 29, 13, 16, 4), datetime.datetime(2026, 5, 29, 13, 16, 3), 'salt', 13.66, 54.21, None, 20.22, 35.45, 9.07, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:16:14.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:16:14.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:16:14.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:16:03, diff=11.732009s, valid=True
2026-05-29T13:16:14.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:16:14.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:16:14.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:16:12, diff=2.734935s, valid=True
2026-05-29T13:16:14.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:16:14.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:16:14.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:16:00, diff=14.741641s, valid=True
2026-05-29T13:16:14.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:16:14.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:16:14.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:16:14.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:16:14.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:16:14.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:16:14.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:16:12, diff=2.744719s, valid=True
2026-05-29T13:16:14.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:16:14.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:16:14.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:16:14.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986016.745376s, valid=True
2026-05-29T13:16:14.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:16:14.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:16:14.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:16:14.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:16:14.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:16:14.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:16:14.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:16:14.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:16:14.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:16:14.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:16:14.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:16:14.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:16:15.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:16:15.066 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:16:15.282 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:16:15.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:16:15.734 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:16:15.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:16:15.734 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:16:15.734 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:16:15.917 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:16:15.918 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:16:45.948 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:16:45.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:16:45.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:16:46.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:16:46.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:16:46.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:16:46.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T13:16:46.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:16:46.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-05-29T13:16:46.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:16:46.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:16:46.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:16:46.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-05-29T13:16:49.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-05-29T13:16:49.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:16:49.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:16:49.191 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:16:49.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:16:49.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:16:49.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:16:49.210 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:16:49.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:16:49.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:16:49.210 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:16:49.210 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:16:49.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:16:49.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:16:49.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:16:49.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:16:49.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:16:49.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:16:49.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:16:49.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:16:49.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:16:49.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:16:49.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:16:49.459 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:16:49.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:16:34
2026-05-29T13:16:49.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71932, datetime.datetime(2026, 5, 29, 13, 16, 34), datetime.datetime(2026, 5, 29, 13, 16, 34), 'salt', 13.92, 55.93, None, 18.84, 42.04, 8.64, 832.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:16:49.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:16:49.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:16:49.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:16:34, diff=15.524894s, valid=True
2026-05-29T13:16:49.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:16:49.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:16:49.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:17:12, diff=-22.472311s, valid=True
2026-05-29T13:16:49.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:16:49.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:16:49.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:16:31, diff=18.534168s, valid=True
2026-05-29T13:16:49.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:16:49.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:16:49.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:16:49.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:16:49.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:16:49.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:16:49.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:17:12, diff=-22.462857s, valid=True
2026-05-29T13:16:49.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:16:49.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:16:49.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:16:49.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986051.537803s, valid=True
2026-05-29T13:16:49.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:16:49.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:16:49.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:16:49.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:16:49.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:16:49.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:16:49.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:16:49.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:16:49.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:16:49.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:16:49.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:16:49.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:16:49.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:16:49.855 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:16:50.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:16:50.425 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:16:50.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:16:50.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:16:50.524 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:16:50.525 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:16:50.692 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:16:50.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:17:20.723 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:17:20.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:17:20.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:17:21.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:17:21.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:17:21.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:17:21.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-05-29T13:17:21.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:17:21.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-05-29T13:17:21.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:17:21.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:17:21.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13: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-05-29T13:17:24.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-05-29T13:17:24.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:17:24.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:17:24.026 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:17:24.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:17:24.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:17:24.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:17:24.047 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:17:24.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:17:24.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:17:24.047 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:17:24.047 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:17:24.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:17:24.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:17:24.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:17:24.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:17:24.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:17:24.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:17:24.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:17:24.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:17:24.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:17:24.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:17:24.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:17:24.307 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:17:24.366 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:17:04
2026-05-29T13:17:24.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71933, datetime.datetime(2026, 5, 29, 13, 17, 4), datetime.datetime(2026, 5, 29, 13, 17, 4), 'salt', 14.02, 55.96, None, 22.19, 32.28, 8.64, 832.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:17:24.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:17:24.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:17:24.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:17:04, diff=20.372398s, valid=True
2026-05-29T13:17:24.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:17:24.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:17:24.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:17:12, diff=12.375266s, valid=True
2026-05-29T13:17:24.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:17:24.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:17:24.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:17:02, diff=22.381999s, valid=True
2026-05-29T13:17:24.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:17:24.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:17:24.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:17:24.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:17:24.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:17:24.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:17:24.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:17:12, diff=12.385102s, valid=True
2026-05-29T13:17:24.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:17:24.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:17:24.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:17:24.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986086.385776s, valid=True
2026-05-29T13:17:24.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:17:24.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:17:24.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:17:24.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:17:24.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:17:24.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:17:24.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:17:24.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:17:24.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:17:24.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:17:24.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:17:24.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:17:24.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:17:24.701 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:17:24.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:17:25.254 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:17:25.353 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:17:25.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:17:25.354 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:17:25.354 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:17:25.624 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:17:25.624 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:17:55.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:17:55.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:17:55.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:17:55.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:17:55.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:17:56.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:17:56.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-05-29T13:17:56.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:17:56.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-05-29T13:17:56.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:17:56.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:17:56.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:17:56.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-05-29T13:17:58.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-05-29T13:17:58.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:17:58.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:17:58.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:17:58.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:17:58.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:17:58.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:17:58.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:17:58.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:17:58.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:17:58.929 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:17:58.929 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:17:58.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:17:59.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:17:59.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:17:59.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:17:59.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:17:59.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:17:59.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:17:59.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:17:59.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:17:59.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:17:59.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:17:59.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:17:59.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:17:34
2026-05-29T13:17:59.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71934, datetime.datetime(2026, 5, 29, 13, 17, 34), datetime.datetime(2026, 5, 29, 13, 17, 34), 'salt', 14.12, 54.14, None, 18.07, 30.17, 9.12, 832.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:17:59.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:17:59.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:17:59.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:17:34, diff=25.253346s, valid=True
2026-05-29T13:17:59.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:17:59.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:17:59.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:18:12, diff=-12.743811s, valid=True
2026-05-29T13:17:59.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:17:59.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:17:59.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:17:34, diff=25.263873s, valid=True
2026-05-29T13:17:59.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:17:59.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:17:59.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:17:59.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:17:59.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:17:59.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:17:59.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:18:12, diff=-12.733095s, valid=True
2026-05-29T13:17:59.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:17:59.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:17:59.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:17:59.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986121.267559s, valid=True
2026-05-29T13:17:59.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:17:59.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:17:59.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:17:59.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:17:59.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:17:59.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:17:59.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:17:59.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:17:59.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:17:59.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:17:59.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:17:59.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:17:59.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:17:59.602 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:17:59.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:18:00.194 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:18:00.295 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:18:00.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:18:00.295 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:18:00.295 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:18:00.472 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:18:00.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:18:30.475 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:18:30.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:18:30.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:18:30.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:18:30.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:18:31.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:18:31.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-05-29T13:18:31.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:18:31.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-05-29T13:18:31.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:18:31.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:18:31.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:18:31.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-05-29T13:18:33.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-05-29T13:18:33.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:18:33.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:18:33.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:18:33.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:18:33.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:18:33.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:18:33.772 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:18:33.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:18:33.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:18:33.773 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:18:33.773 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:18:33.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:18:33.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:18:33.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:18:33.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:18:33.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:18:33.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:18:33.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:18:34.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:18:34.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:18:34.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:18:34.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:18:34.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:18:34.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:18:05
2026-05-29T13:18:34.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71935, datetime.datetime(2026, 5, 29, 13, 18, 5), datetime.datetime(2026, 5, 29, 13, 18, 4), 'salt', 14.32, 54.67, None, 20.08, 42.02, 8.99, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:18:34.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:18:34.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:18:34.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:18:04, diff=30.094509s, valid=True
2026-05-29T13:18:34.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:18:34.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:18:34.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:18:12, diff=22.09739s, valid=True
2026-05-29T13:18:34.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:18:34.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:18:34.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:18:00, diff=34.104077s, valid=True
2026-05-29T13:18:34.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:18:34.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:18:34.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:18:34.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:18:34.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:18:34.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:18:34.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:18:12, diff=22.107058s, valid=True
2026-05-29T13:18:34.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:18:34.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:18:34.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:18:34.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986156.10772s, valid=True
2026-05-29T13:18:34.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:18:34.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:18:34.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:18:34.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:18:34.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:18:34.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:18:34.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:18:34.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:18:34.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:18:34.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:18:34.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:18:34.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:18:34.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:18:34.421 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:18:34.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:18:35.032 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:18:35.131 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:18:35.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:18:35.131 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:18:35.131 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:18:35.296 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:18:35.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:19:05.325 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:19:05.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:19:05.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:19:05.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:19:05.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:19:06.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:19:06.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-05-29T13:19:06.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:19:06.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-05-29T13:19:06.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:19:06.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:19:06.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:19:06.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-05-29T13:19:08.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-05-29T13:19:08.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:19:08.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:19:08.790 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:19:08.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:19:08.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:19:08.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:19:08.810 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:19:08.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:19:08.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:19:08.810 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:19:08.810 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:19:08.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:19:08.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:19:08.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:19:08.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:19:08.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:19:09.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:19:09.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:19:09.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:19:09.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:19:09.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:19:09.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:19:09.074 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:19:09.132 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:19:05
2026-05-29T13:19:09.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71937, datetime.datetime(2026, 5, 29, 13, 19, 5), datetime.datetime(2026, 5, 29, 13, 19, 5), 'salt', 14.25, 55.1, None, 21.49, 43.68, 8.87, 832.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:19:09.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:19:09.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:19:09.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:19:05, diff=4.139342s, valid=True
2026-05-29T13:19:09.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:19:09.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:19:09.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:19:12, diff=-2.857749s, valid=True
2026-05-29T13:19:09.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:19:09.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:19:09.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:19:01, diff=8.150528s, valid=True
2026-05-29T13:19:09.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:19:09.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:19:09.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:19:09.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:19:09.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:19:09.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:19:09.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:19:12, diff=-2.844489s, valid=True
2026-05-29T13:19:09.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:19:09.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:19:09.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:19:09.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986191.156655s, valid=True
2026-05-29T13:19:09.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:19:09.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:19:09.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:19:09.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:19:09.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:19:09.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:19:09.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:19:09.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:19:09.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:19:09.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:19:09.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:19:09.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:19:09.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:19:09.482 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:19:09.708 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:19:10.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:19:10.184 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:19:10.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:19:10.185 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:19:10.185 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:19:10.252 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:19:10.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:19:40.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:19:40.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:19:40.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:19:40.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:19:40.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:19:40.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:19: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-05-29T13:19:40.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:19: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-05-29T13:19:40.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:19:40.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:19:40.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:19:40.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-05-29T13:19:43.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-05-29T13:19:43.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:19:43.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:19:43.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:19:43.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:19:43.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:19:43.441 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:19:43.441 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:19:43.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:19:43.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:19:43.442 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:19:43.442 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:19:43.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:19:43.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:19:43.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:19:43.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:19:43.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:19:43.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:19:43.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:19:43.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T13:19:43.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:19:43.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:19:43.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:19:43.697 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:19:43.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:19:05
2026-05-29T13:19:43.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71937, datetime.datetime(2026, 5, 29, 13, 19, 5), datetime.datetime(2026, 5, 29, 13, 19, 5), 'salt', 14.25, 55.1, None, 21.49, 43.68, 8.87, 832.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:19:43.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:19:43.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:19:43.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:19:35, diff=8.765062s, valid=True
2026-05-29T13:19:43.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:19:43.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:19:43.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:19:12, diff=31.767971s, valid=True
2026-05-29T13:19:43.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:19:43.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:19:43.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:19:31, diff=12.774664s, valid=True
2026-05-29T13:19:43.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:19:43.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:19:43.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:19:43.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:19:43.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:19:43.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T13:19:43.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:19:12, diff=31.777745s, valid=True
2026-05-29T13:19:43.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:19:43.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:19:43.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:19:43.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986225.778406s, valid=True
2026-05-29T13:19:43.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:19:43.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:19:43.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:19:43.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:19:43.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:19:43.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:19:43.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:19:43.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:19:43.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:19:43.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:19:43.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:19:44.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:19:44.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:19:44.100 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:19:44.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:19:44.727 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:19:44.830 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:19:44.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:19:44.830 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:19:44.830 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:19:44.897 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:19:44.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:20:14.927 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:20:14.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:20:14.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:20:15.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:20:15.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:20:15.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:20:15.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-05-29T13:20:15.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:20:15.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-05-29T13:20:15.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:20:15.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:20:15.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:20:15.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-05-29T13:20:17.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-05-29T13:20:17.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:20:17.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:20:17.981 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:20:17.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:20:17.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:20:18.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:20:18.003 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:20:18.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:20:18.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:20:18.004 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:20:18.005 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:20:18.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:20:18.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:20:18.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:20:18.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:20:18.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:20:18.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:20:18.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:20:18.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:20:18.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:20:18.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:20:18.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:20:18.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:20:18.389 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:20:16
2026-05-29T13:20:18.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71939, datetime.datetime(2026, 5, 29, 13, 20, 16), datetime.datetime(2026, 5, 29, 13, 20, 15), 'salt', 13.89, 56.06, None, 18.35, 45.98, 8.6, 832.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:20:18.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:20:18.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:20:18.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:20:15, diff=3.395752s, valid=True
2026-05-29T13:20:18.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:20:18.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:20:18.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:19:12, diff=66.398746s, valid=True
2026-05-29T13:20:18.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:20:18.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:20:18.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:20:11, diff=7.405634s, valid=True
2026-05-29T13:20:18.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:20:18.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:20:18.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:20:18.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:20:18.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:20:18.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:20:18.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:19:12, diff=66.408728s, valid=True
2026-05-29T13:20:18.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:20:18.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:20:18.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:20:18.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986260.409441s, valid=True
2026-05-29T13:20:18.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:20:18.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:20:18.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:20:18.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:20:18.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:20:18.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:20:18.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:20:18.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:20:18.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:20:18.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:20:18.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:20:18.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:20:18.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:20:18.735 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:20:18.946 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:20:19.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:20:19.388 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:20:19.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:20:19.389 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:20:19.389 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:20:19.605 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:20:19.605 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:20:49.635 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:20:49.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:20:49.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:20:50.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:20:50.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:20:50.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:20:50.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-05-29T13:20:50.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:20:50.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-05-29T13:20:50.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:20:50.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:20:50.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:20:50.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-05-29T13:20:53.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-05-29T13:20:53.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:20:53.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:20:53.060 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:20:53.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:20:53.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:20:53.080 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:20:53.081 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:20:53.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:20:53.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:20:53.081 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:20:53.081 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:20:53.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:20:53.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:20:53.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:20:53.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:20:53.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:20:53.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:20:53.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:20:53.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:20:53.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:20:53.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:20:53.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:20:53.338 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:20:53.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:20:46
2026-05-29T13:20:53.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71940, datetime.datetime(2026, 5, 29, 13, 20, 46), datetime.datetime(2026, 5, 29, 13, 20, 45), 'salt', 13.92, 55.4, None, 16.94, 42.18, 8.77, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:20:53.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:20:53.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:20:53.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:20:45, diff=8.40565s, valid=True
2026-05-29T13:20:53.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:20:53.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:20:53.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:21:12, diff=-18.591531s, valid=True
2026-05-29T13:20:53.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:20:53.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:20:53.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:20:43, diff=10.415044s, valid=True
2026-05-29T13:20:53.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:20:53.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:20:53.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:20:53.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:20:53.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:20:53.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:20:53.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:21:12, diff=-18.581961s, valid=True
2026-05-29T13:20:53.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:20:53.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:20:53.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:20:53.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986295.418704s, valid=True
2026-05-29T13:20:53.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:20:53.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:20:53.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:20:53.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:20:53.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:20:53.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:20:53.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:20:53.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:20:53.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:20:53.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:20:53.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:20:53.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:20:53.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:20:53.802 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:20:54.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:20:54.354 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:20:54.454 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:20:54.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:20:54.454 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:20:54.454 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:20:54.610 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:20:54.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:21:24.639 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:21:24.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:21:24.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:21:24.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:21:24.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:21:25.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:21:25.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-05-29T13:21:25.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:21:25.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-05-29T13:21:25.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:21:25.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:21:25.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:21:25.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-05-29T13:21:27.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-05-29T13:21:27.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:21:27.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:21:27.809 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:21:27.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:21:27.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:21:27.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:21:27.829 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:21:27.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:21:27.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:21:27.829 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:21:27.829 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:21:27.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:21:27.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:21:27.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:21:28.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:21:28.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:21:28.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:21:28.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:21:28.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:21:28.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:21:28.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:21:28.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:21:28.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:21:28.203 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:21:16
2026-05-29T13:21:28.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71941, datetime.datetime(2026, 5, 29, 13, 21, 16), datetime.datetime(2026, 5, 29, 13, 21, 16), 'salt', 13.95, 56.23, None, 18.46, 36.36, 8.56, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:21:28.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:21:28.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:21:28.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:21:16, diff=12.209769s, valid=True
2026-05-29T13:21:28.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:21:28.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:21:28.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:21:12, diff=16.212638s, valid=True
2026-05-29T13:21:28.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:21:28.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:21:28.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:21:14, diff=14.21931s, valid=True
2026-05-29T13:21:28.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:21:28.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:21:28.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:21:28.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:21:28.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:21:28.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:21:28.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:21:12, diff=16.222385s, valid=True
2026-05-29T13:21:28.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:21:28.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:21:28.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:21:28.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986330.223051s, valid=True
2026-05-29T13:21:28.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:21:28.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:21:28.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:21:28.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:21:28.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:21:28.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:21:28.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:21:28.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:21:28.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:21:28.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:21:28.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:21:28.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:21:28.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:21:28.546 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:21:28.766 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:21:29.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:21:29.227 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:21:29.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:21:29.227 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:21:29.228 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:21:29.382 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:21:29.383 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:21:59.397 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:21:59.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:21:59.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:21:59.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:21:59.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:21:59.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:21:59.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-05-29T13:21:59.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:21:59.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-05-29T13:21:59.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:21:59.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:21:59.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:21:59.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-05-29T13:22:02.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T13:22:02.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:22:02.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:22:02.375 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:22:02.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:22:02.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:22:02.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:22:02.396 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:22:02.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:22:02.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:22:02.397 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:22:02.397 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:22:02.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:22:02.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:22:02.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:22:02.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:22:02.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:22:02.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:22:02.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:22:02.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:22:02.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:22:02.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:22:02.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:22:02.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:22:02.737 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:21:46
2026-05-29T13:22:02.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71942, datetime.datetime(2026, 5, 29, 13, 21, 46), datetime.datetime(2026, 5, 29, 13, 21, 46), 'salt', 14.15, 54.84, None, 26.75, 31.51, 8.94, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:22:02.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:22:02.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:22:02.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:21:46, diff=16.744109s, valid=True
2026-05-29T13:22:02.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:22:02.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:22:02.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:22:12, diff=-9.253023s, valid=True
2026-05-29T13:22:02.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:22:02.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:22:02.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:21:46, diff=16.753616s, valid=True
2026-05-29T13:22:02.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:22:02.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:22:02.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:22:02.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:22:02.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:22:02.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:22:02.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:22:12, diff=-9.243363s, valid=True
2026-05-29T13:22:02.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:22:02.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:22:02.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:22:02.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986364.757284s, valid=True
2026-05-29T13:22:02.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:22:02.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:22:02.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:22:02.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:22:02.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:22:02.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:22:02.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:22:02.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:22:02.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:22:02.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:22:03.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:22:03.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:22:03.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:22:03.164 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:22:03.407 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:22:03.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:22:03.898 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:22:03.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:22:03.898 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:22:03.898 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:22:04.101 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:22:04.101 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:22:34.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:22:34.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:22:34.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:22:34.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:22:34.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:22:35.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:22: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-05-29T13:22:35.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:22:35.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-05-29T13:22:35.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:22:35.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:22:35.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:22:35.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-05-29T13:22:37.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-05-29T13:22:37.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:22:37.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:22:37.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:22:37.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:22:37.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:22:37.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:22:37.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:22:37.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:22:37.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:22:37.765 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:22:37.766 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:22:37.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:22:37.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:22:37.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:22:37.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:22:37.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:22:37.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:22:37.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:22:38.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:22:38.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:22:38.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:22:38.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:22:38.023 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:22:38.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:22:17
2026-05-29T13:22:38.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71943, datetime.datetime(2026, 5, 29, 13, 22, 17), datetime.datetime(2026, 5, 29, 13, 22, 16), 'salt', 14.19, 54.11, None, 23.43, 25.62, 9.14, 832.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:22:38.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:22:38.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:22:38.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:22:16, diff=22.089095s, valid=True
2026-05-29T13:22:38.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:22:38.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:22:38.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:22:12, diff=26.091923s, valid=True
2026-05-29T13:22:38.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:22:38.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:22:38.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:22:12, diff=26.098653s, valid=True
2026-05-29T13:22:38.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:22:38.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:22:38.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:22:38.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:22:38.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:22:38.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:22:38.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:22:12, diff=26.101724s, valid=True
2026-05-29T13:22:38.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:22:38.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:22:38.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:22:38.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986400.102405s, valid=True
2026-05-29T13:22:38.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:22:38.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:22:38.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:22:38.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:22:38.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:22:38.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:22:38.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:22:38.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:22:38.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:22:38.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:22:38.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:22:38.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:22:38.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:22:38.425 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:22:38.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:22:38.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:22:39.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:22:39.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:22:39.097 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:22:39.097 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:22:41.533 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:22:41.534 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:23:11.564 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:23:11.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:23:11.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:23:11.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:23:11.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:23:12.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:23:12.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-05-29T13:23:12.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:23:12.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-05-29T13:23:12.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:23:12.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:23:12.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:23:12.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-05-29T13:23:14.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T13:23:14.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:23:14.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:23:14.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:23:14.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:23:14.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:23:14.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:23:14.861 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:23:14.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:23:14.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:23:14.862 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:23:14.862 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:23:14.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:23:15.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:23:15.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:23:15.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:23:15.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:23:15.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:23:15.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:23:15.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:23:15.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:23:15.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:23:15.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:23:15.226 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:23:15.300 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:22:47
2026-05-29T13:23:15.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71944, datetime.datetime(2026, 5, 29, 13, 22, 47), datetime.datetime(2026, 5, 29, 13, 22, 46), 'salt', 14.38, 53.01, None, 21.88, 15.98, 9.43, 832.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:23:15.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:23:15.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:23:15.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:22:46, diff=29.309828s, valid=True
2026-05-29T13:23:15.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:23:15.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:23:15.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:23:12, diff=3.31419s, valid=True
2026-05-29T13:23:15.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:23:15.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:23:15.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:22:42, diff=33.321889s, valid=True
2026-05-29T13:23:15.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:23:15.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:23:15.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:23:15.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:23:15.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:23:15.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:23:15.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:23:12, diff=3.324934s, valid=True
2026-05-29T13:23:15.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:23:15.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:23:15.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:23:15.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986437.325596s, valid=True
2026-05-29T13:23:15.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:23:15.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:23:15.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:23:15.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:23:15.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:23:15.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:23:15.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:23:15.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:23:15.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:23:15.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:23:15.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:23:15.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:23:15.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:23:15.649 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:23:15.870 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:23:16.214 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:23:16.320 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:23:16.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:23:16.320 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:23:16.320 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:23:16.487 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:23:16.487 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:23:46.517 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:23:46.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:23:46.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:23:46.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:23:46.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:23:47.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:23:47.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-05-29T13:23:47.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:23:47.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-05-29T13:23:47.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:23:47.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:23:47.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:23:47.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-05-29T13:23:49.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-05-29T13:23:49.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:23:49.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:23:49.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:23:49.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:23:49.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:23:49.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:23:49.734 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:23:49.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:23:49.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:23:49.735 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:23:49.735 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:23:49.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:23:49.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:23:49.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:23:49.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:23:49.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:23:49.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:23:49.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:23:49.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:23:49.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:23:49.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:23:49.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:23:49.996 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:23:50.063 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:23:47
2026-05-29T13:23:50.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71946, datetime.datetime(2026, 5, 29, 13, 23, 47), datetime.datetime(2026, 5, 29, 13, 23, 47), 'salt', 14.52, 51.79, None, 23.68, 34.32, 9.79, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:23:50.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:23:50.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:23:50.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:23:47, diff=3.070703s, valid=True
2026-05-29T13:23:50.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:23:50.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:23:50.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:24:12, diff=-21.926317s, valid=True
2026-05-29T13:23:50.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:23:50.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:23:50.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:23:43, diff=7.080546s, valid=True
2026-05-29T13:23:50.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:23:50.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:23:50.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:23:50.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:23:50.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:23:50.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:23:50.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:24:12, diff=-21.916336s, valid=True
2026-05-29T13:23:50.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:23:50.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:23:50.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:23:50.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986472.084347s, valid=True
2026-05-29T13:23:50.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:23:50.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:23:50.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:23:50.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:23:50.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:23:50.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:23:50.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:23:50.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:23:50.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:23:50.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:23:50.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:23:50.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:23:50.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:23:50.419 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:23:50.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:23:50.986 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:23:51.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:23:51.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:23:51.149 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:23:51.149 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:23:51.298 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:23:51.298 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:24:21.304 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:24:21.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:24:21.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:24:21.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:24:21.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:24:21.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:24:21.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-05-29T13:24:21.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:24: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-05-29T13:24:21.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:24:21.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:24:21.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:24:21.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-05-29T13:24:24.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-05-29T13:24:24.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:24:24.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:24:24.466 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:24:24.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:24:24.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:24:24.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:24:24.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:24:24.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:24:24.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:24:24.488 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:24:24.488 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:24:24.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:24:24.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:24:24.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:24:24.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:24:24.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:24:24.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:24:24.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:24:24.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:24:24.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:24:24.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:24:24.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:24:24.796 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:24:24.854 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:24:17
2026-05-29T13:24:24.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71947, datetime.datetime(2026, 5, 29, 13, 24, 17), datetime.datetime(2026, 5, 29, 13, 24, 17), 'salt', 14.48, 52.08, None, 18.84, 31.79, 9.7, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:24:24.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:24:24.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:24:24.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:24:17, diff=7.862723s, valid=True
2026-05-29T13:24:24.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:24:24.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:24:24.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:24:12, diff=12.866522s, valid=True
2026-05-29T13:24:24.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:24:24.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:24:24.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:24:13, diff=11.875283s, valid=True
2026-05-29T13:24:24.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:24:24.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:24:24.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:24:24.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:24:24.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:24:24.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:24:24.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:24:12, diff=12.879266s, valid=True
2026-05-29T13:24:24.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:24:24.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:24:24.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:24:24.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986506.880058s, valid=True
2026-05-29T13:24:24.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:24:24.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:24:24.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:24:24.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:24:24.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:24:24.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:24:24.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:24:24.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:24:24.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:24:25.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:24:25.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:24:25.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:24:25.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:24:25.271 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:24:25.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:24:25.890 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:24:25.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:24:25.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:24:25.993 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:24:25.993 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:24:26.243 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:24:26.243 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:24:56.273 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:24:56.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:24:56.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:24:56.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:24:56.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:24:56.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:24:56.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-05-29T13:24:56.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:24:56.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-05-29T13:24:56.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:24:56.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:24:56.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:24:56.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-05-29T13:24:59.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-05-29T13:24:59.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:24:59.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:24:59.670 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:24:59.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:24:59.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:24:59.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:24:59.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:24:59.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:24:59.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:24:59.700 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:24:59.700 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:24:59.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:24:59.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:24:59.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:24:59.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:24:59.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:24:59.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:24:59.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:24:59.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:24:59.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:24:59.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:24:59.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:24:59.974 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:25:00.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:24:48
2026-05-29T13:25:00.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71948, datetime.datetime(2026, 5, 29, 13, 24, 48), datetime.datetime(2026, 5, 29, 13, 24, 47), 'salt', 14.62, 51.62, None, 29.04, 30.57, 9.84, 832.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:25:00.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:25:00.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:25:00.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:24:47, diff=13.050728s, valid=True
2026-05-29T13:25:00.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:25:00.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:25:00.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:25:12, diff=-11.94634s, valid=True
2026-05-29T13:25:00.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:25:00.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:25:00.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:24:44, diff=16.061337s, valid=True
2026-05-29T13:25:00.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:25:00.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:25:00.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:25:00.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:25:00.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:25:00.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:25:00.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:25:12, diff=-11.93547s, valid=True
2026-05-29T13:25:00.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:25:00.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:25:00.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:25:00.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986542.065223s, valid=True
2026-05-29T13:25:00.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:25:00.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:25:00.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:25:00.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:25:00.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:25:00.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:25:00.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:25:00.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:25:00.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:25:00.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:25:00.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:25:00.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:25:00.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:25:00.386 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:25:00.668 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:25:01.009 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:25:01.109 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:25:01.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:25:01.109 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:25:01.109 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:25:01.177 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:25:01.177 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:25:31.207 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:25:31.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:25:31.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:25:31.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:25:31.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:25:31.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:25:31.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-05-29T13:25:31.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:25:31.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-05-29T13:25:31.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:25:31.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:25:31.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:25:31.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-05-29T13:25:34.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-05-29T13:25:34.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:25:34.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:25:34.334 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:25:34.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:25:34.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:25:34.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:25:34.353 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:25:34.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:25:34.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:25:34.354 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:25:34.354 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:25:34.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:25:34.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:25:34.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:25:34.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:25:34.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:25:34.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:25:34.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:25:34.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:25:34.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:25:34.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:25:34.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:25:34.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:25:34.666 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:25:18
2026-05-29T13:25:34.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71949, datetime.datetime(2026, 5, 29, 13, 25, 18), datetime.datetime(2026, 5, 29, 13, 25, 17), 'salt', 14.68, 50.82, None, 23.01, 41.95, 10.06, 832.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:25:34.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:25:34.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:25:34.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:25:17, diff=17.672609s, valid=True
2026-05-29T13:25:34.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:25:34.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:25:34.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:25:12, diff=22.675435s, valid=True
2026-05-29T13:25:34.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:25:34.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:25:34.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:25:15, diff=19.682168s, valid=True
2026-05-29T13:25:34.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:25:34.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:25:34.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:25:34.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:25:34.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:25:34.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:25:34.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:25:12, diff=22.685199s, valid=True
2026-05-29T13:25:34.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:25:34.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:25:34.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:25:34.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986576.685866s, valid=True
2026-05-29T13:25:34.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:25:34.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:25:34.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:25:34.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:25:34.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:25:34.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:25:34.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:25:34.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:25:34.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:25:34.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:25:34.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:25:34.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:25:34.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:25:35.001 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:25:35.212 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:25:35.554 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:25:35.654 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:25:35.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:25: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-05-29T13:25: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-05-29T13:25:35.729 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:25:35.729 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:26:05.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:26:05.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:26:05.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:26:06.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:26:06.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:26:06.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:26:06.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-05-29T13:26:06.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:26: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-05-29T13:26:06.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:26:06.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:26:06.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:26:06.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-05-29T13:26:08.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T13:26:08.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:26:08.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:26:08.873 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:26:08.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:26:08.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:26:08.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:26:08.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:26:08.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:26:08.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:26:08.895 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:26:08.895 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:26:08.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:26:08.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:26:08.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:26:09.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:26:09.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:26:09.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:26:09.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:26:09.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:26:09.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:26:09.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:26:09.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:26:09.161 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:26:09.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:25:48
2026-05-29T13:26:09.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71950, datetime.datetime(2026, 5, 29, 13, 25, 48), datetime.datetime(2026, 5, 29, 13, 25, 48), 'salt', 14.55, 50.76, None, 20.36, 32.84, 10.07, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:26:09.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:26:09.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:26:09.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:25:48, diff=21.226036s, valid=True
2026-05-29T13:26:09.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:26:09.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:26:09.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:26:12, diff=-2.771093s, valid=True
2026-05-29T13:26:09.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:26:09.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:26:09.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:25:47, diff=22.235569s, valid=True
2026-05-29T13:26:09.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:26:09.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:26:09.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:26:09.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:26:09.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:26:09.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:26:09.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:26:12, diff=-2.76147s, valid=True
2026-05-29T13:26:09.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:26:09.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:26:09.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:26:09.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986611.239187s, valid=True
2026-05-29T13:26:09.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:26:09.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:26:09.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:26:09.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:26:09.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:26:09.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:26:09.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:26:09.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:26:09.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:26:09.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:26:09.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:26:09.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:26:09.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:26:09.647 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:26:09.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:26:10.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:26:10.375 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:26:10.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:26:10.375 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:26:10.375 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:26:10.529 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:26:10.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:26:40.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:26:40.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:26:40.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:26:40.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:26:40.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:26:41.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:26:41.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-05-29T13:26:41.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:26:41.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-05-29T13:26:41.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:26:41.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:26:41.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:26:41.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-05-29T13:26:43.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-05-29T13:26:43.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:26:43.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:26:43.863 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:26:43.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:26:43.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:26:43.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:26:43.883 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:26:43.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:26:43.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:26:43.883 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:26:43.883 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:26:43.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:26:43.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:26:43.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:26:44.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:26:44.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:26:44.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:26:44.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:26:44.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:26:44.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:26:44.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:26:44.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:26:44.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:26:44.201 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:26:18
2026-05-29T13:26:44.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71951, datetime.datetime(2026, 5, 29, 13, 26, 18), datetime.datetime(2026, 5, 29, 13, 26, 18), 'salt', 14.52, 50.79, None, 24.21, 35.07, 10.06, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:26:44.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:26:44.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:26:44.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:26:18, diff=26.208122s, valid=True
2026-05-29T13:26:44.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:26:44.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:26:44.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:26:12, diff=32.21099s, valid=True
2026-05-29T13:26:44.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:26:44.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:26:44.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:26:14, diff=30.217596s, valid=True
2026-05-29T13:26:44.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:26:44.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:26:44.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:26:44.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:26:44.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:26:44.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:26:44.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:26:12, diff=32.220663s, valid=True
2026-05-29T13:26:44.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:26:44.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:26:44.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:26:44.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986646.221315s, valid=True
2026-05-29T13:26:44.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:26:44.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:26:44.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:26:44.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:26:44.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:26:44.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:26:44.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:26:44.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:26:44.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:26:44.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:26:44.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:26:44.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:26:44.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:26:44.537 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:26:44.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:26:45.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:26:45.231 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:26:45.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:26:45.232 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:26:45.232 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:26:45.481 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:26:45.481 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:27:15.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:27:15.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:27:15.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:27:15.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:27:15.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:27:15.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:27:15.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-05-29T13:27:15.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:27:15.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-05-29T13:27:15.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:27:15.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:27:15.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:27:15.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-05-29T13:27:18.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-05-29T13:27:18.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:27:18.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:27:18.449 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:27:18.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:27:18.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:27:18.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:27:18.473 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:27:18.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:27:18.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:27:18.475 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:27:18.475 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:27:18.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:27:18.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:27:18.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:27:18.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:27:18.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:27:18.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:27:18.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:27:18.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:27:18.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:27:18.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:27:18.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:27:18.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:27:18.821 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:26:48
2026-05-29T13:27:18.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71952, datetime.datetime(2026, 5, 29, 13, 26, 48), datetime.datetime(2026, 5, 29, 13, 26, 48), 'salt', 14.42, 50.39, None, 25.37, 30.03, 10.17, 832.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:27:18.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:27:18.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:27:18.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:26:48, diff=30.837501s, valid=True
2026-05-29T13:27:18.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:27:18.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:27:18.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:27:12, diff=6.845174s, valid=True
2026-05-29T13:27:18.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:27:18.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:27:18.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:26:45, diff=33.85971s, valid=True
2026-05-29T13:27:18.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:27:18.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:27:18.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:27:18.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:27:18.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:27:18.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:27:18.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:27:12, diff=6.862895s, valid=True
2026-05-29T13:27:18.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:27:18.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:27:18.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:27:18.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986680.863586s, valid=True
2026-05-29T13:27:18.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:27:18.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:27:18.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:27:18.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:27:18.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:27:18.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:27:18.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:27:18.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:27:18.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:27:19.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:27:19.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:27:19.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:27:19.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:27:19.276 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:27:19.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:27:19.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:27:19.981 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:27:19.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:27:19.981 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:27:19.982 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:27:20.147 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:27:20.147 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:27:50.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:27:50.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:27:50.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:27:50.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:27:50.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:27:50.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:27:50.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-05-29T13:27:50.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:27:50.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-05-29T13:27:50.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:27:50.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:27:50.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:27:50.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-05-29T13:27:53.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T13:27:53.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:27:53.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:27:53.391 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:27:53.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:27:53.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:27:53.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:27:53.412 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:27:53.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:27:53.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:27:53.412 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:27:53.412 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:27:53.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:27:53.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:27:53.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:27:53.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:27:53.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:27:53.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:27:53.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:27:53.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:27:53.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:27:53.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:27:53.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:27:53.690 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:27:53.756 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:27:49
2026-05-29T13:27:53.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71954, datetime.datetime(2026, 5, 29, 13, 27, 49), datetime.datetime(2026, 5, 29, 13, 27, 49), 'salt', 14.42, 50.92, None, 23.96, 29.94, 10.02, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:27:53.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:27:53.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:27:53.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:27:49, diff=4.762643s, valid=True
2026-05-29T13:27:53.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:27:53.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:27:53.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:28:12, diff=-18.234504s, valid=True
2026-05-29T13:27:53.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:27:53.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:27:53.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:27:45, diff=8.772251s, valid=True
2026-05-29T13:27:53.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:27:53.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:27:53.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:27:53.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:27:53.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:27:53.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:27:53.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:28:12, diff=-18.224697s, valid=True
2026-05-29T13:27:53.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:27:53.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:27:53.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:27:53.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986715.775969s, valid=True
2026-05-29T13:27:53.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:27:53.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:27:53.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:27:53.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:27:53.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:27:53.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:27:53.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:27:53.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:27:53.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:27:53.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:27:53.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:27:54.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:27:54.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:27:54.106 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:27:54.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:27:54.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:27:54.783 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:27:54.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:27:54.783 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:27:54.783 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:27:55.277 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:27:55.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:28:25.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:28:25.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:28:25.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:28:25.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:28:25.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:28:25.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:28:25.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-05-29T13:28:25.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:28:25.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-05-29T13:28:25.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:28:25.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:28:25.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:28:25.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-05-29T13:28:28.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-05-29T13:28:28.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:28:28.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:28:28.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:28:28.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:28:28.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:28:28.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:28:28.408 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:28:28.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:28:28.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:28:28.409 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:28:28.409 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:28:28.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:28:28.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:28:28.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:28:28.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:28:28.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:28:28.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:28:28.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:28:28.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:28:28.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:28:28.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:28:28.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:28:28.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:28:28.732 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:28:19
2026-05-29T13:28:28.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71955, datetime.datetime(2026, 5, 29, 13, 28, 19), datetime.datetime(2026, 5, 29, 13, 28, 19), 'salt', 14.52, 51.55, None, 22.23, 38.17, 9.85, 832.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:28:28.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:28:28.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:28:28.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:28:19, diff=9.738508s, valid=True
2026-05-29T13:28:28.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:28:28.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:28:28.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:28:12, diff=16.741499s, valid=True
2026-05-29T13:28:28.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:28:28.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:28:28.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:28:15, diff=13.748058s, valid=True
2026-05-29T13:28:28.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:28:28.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:28:28.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:28:28.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:28:28.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:28:28.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:28:28.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:28:12, diff=16.751084s, valid=True
2026-05-29T13:28:28.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:28:28.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:28:28.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:28:28.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986750.75175s, valid=True
2026-05-29T13:28:28.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:28:28.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:28:28.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:28:28.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:28:28.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:28:28.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:28:28.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:28:28.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:28:28.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:28:28.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:28:29.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:28:29.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:28:29.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:28:29.150 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:28:29.363 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:28:29.726 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:28:29.829 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:28:29.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:28:29.829 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:28:29.829 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:28:30.034 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:28:30.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:29:00.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:29:00.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:29:00.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:29:00.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:29:00.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:29:00.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:29:00.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-05-29T13:29:00.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:29:00.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-05-29T13:29:00.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:29:00.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:29:00.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:29:00.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-05-29T13:29:03.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-05-29T13:29:03.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:29:03.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:29:03.217 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:29:03.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:29:03.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:29:03.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:29:03.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:29:03.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:29:03.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:29:03.239 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:29:03.239 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:29:03.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:29:03.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:29:03.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:29:03.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:29:03.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:29:03.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:29:03.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:29:03.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:29:03.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:29:03.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:29:03.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:29:03.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:29:03.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:28:49
2026-05-29T13:29:03.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71956, datetime.datetime(2026, 5, 29, 13, 28, 49), datetime.datetime(2026, 5, 29, 13, 28, 49), 'salt', 14.42, 50.46, None, 22.16, 61.27, 10.15, 832.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:29:03.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:29:03.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:29:03.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:28:49, diff=14.601156s, valid=True
2026-05-29T13:29:03.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:29:03.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:29:03.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:29:12, diff=-8.395952s, valid=True
2026-05-29T13:29:03.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:29:03.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:29:03.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:28:46, diff=17.612102s, valid=True
2026-05-29T13:29:03.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:29:03.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:29:03.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:29:03.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:29:03.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:29:03.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:29:03.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:29:12, diff=-8.384719s, valid=True
2026-05-29T13:29:03.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:29:03.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:29:03.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:29:03.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986785.615976s, valid=True
2026-05-29T13:29:03.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:29:03.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:29:03.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:29:03.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:29:03.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:29:03.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:29:03.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:29:03.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:29:03.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:29:03.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:29:03.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:29:03.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:29:03.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:29:03.951 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:29:04.174 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:29:04.539 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:29:04.646 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:29:04.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:29:04.647 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:29:04.647 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:29:04.803 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:29:04.803 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:29:34.832 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:29:34.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:29:34.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:29:35.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:29:35.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:29:35.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:29:35.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-05-29T13:29:35.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:29:35.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-05-29T13:29:35.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:29:35.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:29:35.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:29: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-05-29T13:29:37.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-05-29T13:29:37.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:29:37.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:29:37.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:29:37.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:29:37.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:29:37.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:29:37.997 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:29:37.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:29:37.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:29:37.998 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:29:37.998 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:29:38.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:29:38.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:29:38.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:29:38.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:29:38.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:29:38.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:29:38.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:29:38.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:29:38.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:29:38.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:29:38.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:29:38.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:29:38.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:29:20
2026-05-29T13:29:38.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71957, datetime.datetime(2026, 5, 29, 13, 29, 20), datetime.datetime(2026, 5, 29, 13, 29, 19), 'salt', 14.19, 51.42, None, 21.38, 49.17, 9.87, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:29:38.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:29:38.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:29:38.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:29:19, diff=19.32764s, valid=True
2026-05-29T13:29:38.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:29:38.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:29:38.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:29:12, diff=26.330397s, valid=True
2026-05-29T13:29:38.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:29:38.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:29:38.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:29:16, diff=22.336962s, valid=True
2026-05-29T13:29:38.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:29:38.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:29:38.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:29:38.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:29:38.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:29:38.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:29:38.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:29:12, diff=26.339943s, valid=True
2026-05-29T13:29:38.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:29:38.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:29:38.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:29:38.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986820.340588s, valid=True
2026-05-29T13:29:38.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:29:38.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:29:38.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:29:38.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:29:38.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:29:38.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:29:38.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:29:38.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:29:38.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:29:38.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:29:38.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:29:38.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:29:38.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:29:38.660 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:29:38.892 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:29:39.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:29:39.352 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:29:39.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:29:39.352 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:29:39.352 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:29:39.541 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:29:39.541 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:30:09.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:30:09.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:30:09.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:30:09.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:30:09.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:30:10.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:30:10.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-05-29T13:30:10.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:30:10.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-05-29T13:30:10.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:30:10.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:30:10.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:30:10.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-05-29T13:30:12.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-05-29T13:30:12.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:30:12.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:30:12.810 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:30:12.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:30:12.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:30:12.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:30:12.831 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:30:12.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:30:12.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:30:12.831 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:30:12.832 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:30:12.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:30:12.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:30:12.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:30:13.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:30:13.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:30:13.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:30:13.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:30:13.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:30:13.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:30:13.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:30:13.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:30:13.094 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:30:13.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:29:50
2026-05-29T13:30:13.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71958, datetime.datetime(2026, 5, 29, 13, 29, 50), datetime.datetime(2026, 5, 29, 13, 29, 49), 'salt', 13.82, 51.45, None, 22.3, 59.61, 9.82, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:30:13.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:30:13.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:30:13.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:29:49, diff=24.158721s, valid=True
2026-05-29T13:30:13.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:30:13.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:30:13.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:30:12, diff=1.161572s, valid=True
2026-05-29T13:30:13.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:30:13.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:30:13.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:29:48, diff=25.169148s, valid=True
2026-05-29T13:30:13.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:30:13.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:30:13.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:30:13.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:30:13.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:30:13.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:30:13.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:30:12, diff=1.172157s, valid=True
2026-05-29T13:30:13.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:30:13.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:30:13.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:30:13.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986855.17282s, valid=True
2026-05-29T13:30:13.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:30:13.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:30:13.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:30:13.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:30:13.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:30:13.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:30:13.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:30:13.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:30:13.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:30:13.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:30:13.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:30:13.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:30:13.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:30:13.504 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:30:13.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:30:14.084 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:30:14.193 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:30:14.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:30:14.193 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:30:14.193 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:30:14.461 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:30:14.461 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:30:44.486 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:30:44.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:30:44.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:30:44.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:30:44.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:30:45.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:30:45.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-05-29T13:30:45.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:30:45.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-05-29T13:30:45.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:30:45.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:30:45.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:30:45.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-05-29T13:30:47.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-05-29T13:30:47.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T13:30:47.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:30:47.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:30:47.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:30:47.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:30:47.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:30:47.971 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:30:47.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:30:47.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:30:47.971 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:30:47.972 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:30:47.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:30:48.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:30:48.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:30:48.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:30:48.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:30:48.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:30:48.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:30:48.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:30:48.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:30:48.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:30:48.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:30:48.229 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:30:48.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:30:20
2026-05-29T13:30:48.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71959, datetime.datetime(2026, 5, 29, 13, 30, 20), datetime.datetime(2026, 5, 29, 13, 30, 20), 'salt', 13.89, 51.92, None, 22.83, 53.86, 9.71, 832.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:30:48.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:30:48.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:30:48.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:30:20, diff=28.297076s, valid=True
2026-05-29T13:30:48.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:30:48.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:30:48.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:30:12, diff=36.29995s, valid=True
2026-05-29T13:30:48.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:30:48.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:30:48.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:30:19, diff=29.306665s, valid=True
2026-05-29T13:30:48.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:30:48.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:30:48.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:30:48.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:30:48.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:30:48.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:30:48.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:30:12, diff=36.309708s, valid=True
2026-05-29T13:30:48.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:30:48.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:30:48.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:30:48.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986890.310364s, valid=True
2026-05-29T13:30:48.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:30:48.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:30:48.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:30:48.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:30:48.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:30:48.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:30:48.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:30:48.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:30:48.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:30:48.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:30:48.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:30:48.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:30:48.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:30:48.634 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:30:48.849 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:30:49.196 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:30:49.296 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T13:30:49.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:30:49.297 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:30:49.297 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:30:49.465 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:30:49.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:30:57.159 [INFO] [MainThread] [loggingutils.py] [setup_logging()] Logging set up
2026-05-29T13:30:57.159 [INFO] [MainThread] [run_weather_plot.py] [<module>()] Running weatherplots service in development environment
2026-05-29T13:30:57.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Entering main run loop. Polling every 30 seconds.
2026-05-29T13:30:57.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:30:57.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:30:57.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:30:57.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:30:57.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:30:57.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:30:57.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-05-29T13:30:57.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:30:57.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-05-29T13:30:57.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:30:57.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:30:57.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:30:57.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-05-29T13:31:00.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-05-29T13:31:00.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:31:00.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:31:00.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:31:00.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:31:00.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:31:00.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:31:00.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:31:00.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:31:00.613 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:31:00.613 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:31:00.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:31:00.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:31:00.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:31:00.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:31:00.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:31:00.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:31:00.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:31:00.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:31:00.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:31:00.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:31:00.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:31:00.866 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:31:00.925 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:30:50
2026-05-29T13:31:00.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71960, datetime.datetime(2026, 5, 29, 13, 30, 50), datetime.datetime(2026, 5, 29, 13, 30, 50), 'salt', 13.75, 51.79, None, 18.42, 49.87, 9.72, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:31:00.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:31:00.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:31:00.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:30:50, diff=10.933077s, valid=True
2026-05-29T13:31:00.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:31:00.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:31:00.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:31:12, diff=-11.064072s, valid=True
2026-05-29T13:31:00.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:31:00.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:31:00.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:30:47, diff=13.942464s, valid=True
2026-05-29T13:31:00.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:31:00.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:31:00.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:31:00.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:31:00.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:31:00.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:31:00.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:31:12, diff=-11.054518s, valid=True
2026-05-29T13:31:00.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:31:00.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:31:00.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:31:00.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986902.946143s, valid=True
2026-05-29T13:31:00.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:31:00.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:31:00.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:31:00.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:31:00.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:31:01.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:31:01.019 [DEBUG] [MainThread] [pyplot.py] [switch_backend()] Loaded backend agg version v2.2.
2026-05-29T13:31:01.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:31:01.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:31:01.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:31:01.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:31:01.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:31:01.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:31:01.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:31:01.313 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:31:01.800 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:31:02.197 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:31:02.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:31:02.298 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:31:02.298 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:31:03.985 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:31:03.985 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:31:34.015 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:31:34.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:31:34.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:31:34.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:31:34.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:31:34.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:31:34.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-05-29T13:31:34.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:31:34.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-05-29T13:31:34.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:31:34.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:31:34.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:31:34.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-05-29T13:31:37.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-05-29T13:31:37.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:31:37.153 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:31:37.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:31:37.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:31:37.173 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:31:37.173 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:31:37.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:31:37.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:31:37.173 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:31:37.173 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:31:37.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:31:37.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:31:37.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:31:37.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:31:37.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:31:37.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:31:37.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:31:37.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:31:37.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:31:37.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:31:37.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:31:37.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:31:37.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:31:27
2026-05-29T13:31:37.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71962, datetime.datetime(2026, 5, 29, 13, 31, 27), datetime.datetime(2026, 5, 29, 13, 31, 26), 'salt', 13.82, 52.12, None, 19.37, 25.69, 9.64, 832.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:31:37.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:31:37.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:31:37.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:31:26, diff=11.510342s, valid=True
2026-05-29T13:31:37.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:31:37.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:31:37.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:31:12, diff=25.513167s, valid=True
2026-05-29T13:31:37.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:31:37.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:31:37.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:31:22, diff=15.519839s, valid=True
2026-05-29T13:31:37.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:31:37.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:31:37.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:31:37.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:31:37.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:31:37.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:31:37.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:31:12, diff=25.522861s, valid=True
2026-05-29T13:31:37.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:31:37.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:31:37.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:31:37.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986939.523511s, valid=True
2026-05-29T13:31:37.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:31:37.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:31:37.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:31:37.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:31:37.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:31:37.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:31:37.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:31:37.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:31:37.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:31:37.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:31:37.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:31:37.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:31:37.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:31:37.843 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:31:38.059 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:31:38.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:31:38.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:31:38.552 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:31:38.552 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:31:38.714 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:31:38.715 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:32:08.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:32:08.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:32:08.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:32:08.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:32:08.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:32:09.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:32:09.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-05-29T13:32:09.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:32:09.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-05-29T13:32:09.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:32:09.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:32:09.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:32:09.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-05-29T13:32:11.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T13:32:11.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:32:11.804 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:32:11.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:32:11.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:32:11.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:32:11.825 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:32:11.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:32:11.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:32:11.826 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:32:11.826 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:32:11.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:32:11.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:32:11.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:32:11.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:32:11.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:32:12.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:32:12.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:32:12.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:32:12.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:32:12.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:32:12.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:32:12.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:32:12.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:31:57
2026-05-29T13:32:12.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71963, datetime.datetime(2026, 5, 29, 13, 31, 57), datetime.datetime(2026, 5, 29, 13, 31, 57), 'salt', 13.99, 52.28, None, 21.49, 34.53, 9.61, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:32:12.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:32:12.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:32:12.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:31:57, diff=15.145347s, valid=True
2026-05-29T13:32:12.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:32:12.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:32:12.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:32:12, diff=0.148176s, valid=True
2026-05-29T13:32:12.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:32:12.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:32:12.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:31:54, diff=18.154802s, valid=True
2026-05-29T13:32:12.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:32:12.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:32:12.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:32:12.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:32:12.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:32:12.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:32:12.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:32:12, diff=0.157834s, valid=True
2026-05-29T13:32:12.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:32:12.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:32:12.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:32:12.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=986974.158492s, valid=True
2026-05-29T13:32:12.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:32:12.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:32:12.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:32:12.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:32:12.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:32:12.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:32:12.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:32:12.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:32:12.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:32:12.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:32:12.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:32:12.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:32:12.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:32:12.475 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:32:12.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:32:13.040 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:32:13.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:32:13.141 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:32:13.142 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:32:13.378 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:32:13.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:32:43.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:32:43.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:32:43.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:32:43.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:32:43.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:32:43.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:32:43.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-05-29T13:32:44.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:32:44.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-05-29T13:32:44.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:32:44.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:32:44.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:32:44.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-05-29T13:32:46.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-05-29T13:32:46.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:32:46.655 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:32:46.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:32:46.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:32:46.675 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:32:46.675 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:32:46.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:32:46.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:32:46.675 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:32:46.675 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:32:46.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:32:46.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:32:46.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:32:46.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:32:46.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:32:46.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:32:46.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:32:46.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:32:46.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:32:46.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:32:46.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:32:46.956 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:32:47.015 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:32:27
2026-05-29T13:32:47.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71964, datetime.datetime(2026, 5, 29, 13, 32, 27), datetime.datetime(2026, 5, 29, 13, 32, 27), 'salt', 14.28, 51.52, None, 24.56, 31.6, 9.84, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:32:47.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:32:47.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:32:47.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:32:27, diff=20.021973s, valid=True
2026-05-29T13:32:47.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:32:47.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:32:47.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:32:12, diff=35.024798s, valid=True
2026-05-29T13:32:47.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:32:47.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:32:47.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:32:25, diff=22.031483s, valid=True
2026-05-29T13:32:47.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:32:47.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:32:47.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:32:47.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:32:47.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:32:47.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:32:47.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:32:12, diff=35.034532s, valid=True
2026-05-29T13:32:47.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:32:47.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:32:47.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:32:47.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987009.035201s, valid=True
2026-05-29T13:32:47.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:32:47.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:32:47.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:32:47.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:32:47.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:32:47.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:32:47.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:32:47.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:32:47.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:32:47.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:32:47.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:32:47.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:32:47.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:32:47.354 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:32:47.630 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:32:47.980 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:32:48.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:32:48.082 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:32:48.082 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:32:48.155 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:32:48.156 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:33:18.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:33:18.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:33:18.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:33:18.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:33:18.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:33:18.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:33:18.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-05-29T13:33:18.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:33:18.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-05-29T13:33:18.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:33:18.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:33:18.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:33:18.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-05-29T13:33:21.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-05-29T13:33:21.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:33:21.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:33:21.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:33:21.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:33:21.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:33:21.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:33:21.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:33:21.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:33:21.158 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:33:21.158 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:33:21.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:33:21.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:33:21.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:33:21.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:33:21.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:33:21.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:33:21.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:33:21.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:33:21.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:33:21.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:33:21.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:33:21.425 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:33:21.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:32:58
2026-05-29T13:33:21.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71965, datetime.datetime(2026, 5, 29, 13, 32, 58), datetime.datetime(2026, 5, 29, 13, 32, 57), 'salt', 14.38, 50.72, None, 21.63, 29.84, 10.07, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:33:21.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:33:21.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:33:21.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:32:57, diff=24.489596s, valid=True
2026-05-29T13:33:21.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:33:21.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:33:21.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:33:12, diff=9.492419s, valid=True
2026-05-29T13:33:21.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:33:21.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:33:21.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:32:56, diff=25.499081s, valid=True
2026-05-29T13:33:21.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:33:21.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:33:21.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:33:21.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:33:21.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:33:21.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:33:21.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:33:12, diff=9.50229s, valid=True
2026-05-29T13:33:21.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:33:21.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:33:21.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:33:21.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987043.502999s, valid=True
2026-05-29T13:33:21.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:33:21.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:33:21.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:33:21.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:33:21.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:33:21.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:33:21.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:33:21.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:33:21.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:33:21.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:33:21.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:33:21.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:33:21.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:33:21.824 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:33:22.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:33:22.388 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:33:22.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:33:22.490 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:33:22.490 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:33:22.558 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:33:22.558 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:33:52.588 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:33:52.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:33:52.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:33:52.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:33:52.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:33:52.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:33:52.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-05-29T13:33:52.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:33:52.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-05-29T13:33:52.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:33:52.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:33:52.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:33:52.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-05-29T13:33:55.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-05-29T13:33:55.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:33:55.475 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:33:55.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:33:55.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:33:55.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:33:55.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:33:55.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:33:55.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:33:55.496 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:33:55.497 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:33:55.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:33:55.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:33:55.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:33:55.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:33:55.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:33:55.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T13:33:55.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:33:55.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T13:33:55.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:33:55.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:33:55.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:33:55.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:33:55.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:33:28
2026-05-29T13:33:55.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71966, datetime.datetime(2026, 5, 29, 13, 33, 28), datetime.datetime(2026, 5, 29, 13, 33, 27), 'salt', 14.65, 48.9, None, 21.0, 36.69, 10.62, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:33:55.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:33:55.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:33:55.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:33:27, diff=28.830373s, valid=True
2026-05-29T13:33:55.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:33:55.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T13:33:55.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:33:12, diff=43.833172s, valid=True
2026-05-29T13:33:55.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:33:55.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:33:55.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:33:18, diff=37.839683s, valid=True
2026-05-29T13:33:55.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:33:55.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:33:55.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:33:55.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:33:55.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:33:55.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T13:33:55.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:33:12, diff=43.842701s, valid=True
2026-05-29T13:33:55.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:33:55.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:33:55.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:33:55.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987077.843356s, valid=True
2026-05-29T13:33:55.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:33:55.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:33:55.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:33:55.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:33:55.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:33:55.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:33:55.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:33:55.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:33:55.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:33:55.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:33:56.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:33:56.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:33:56.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:33:56.227 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:33:56.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:33:56.807 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:33:56.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:33:56.907 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:33:56.907 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:33:56.975 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:33:56.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:34:27.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:34:27.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:34:27.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:34:27.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:34:27.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:34:27.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:34:27.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-05-29T13:34:27.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:34:27.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-05-29T13:34:27.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:34:27.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:34:27.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:34:27.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T13:34:30.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-05-29T13:34:30.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:34:30.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:34:30.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:34:30.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:34:30.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:34:30.336 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:34:30.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:34:30.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:34:30.337 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:34:30.337 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:34:30.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:34:30.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:34:30.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:34:30.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:34:30.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:34:30.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:34:30.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:34:30.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:34:30.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:34:30.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:34:30.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:34:30.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:34:30.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:34:28
2026-05-29T13:34:30.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71968, datetime.datetime(2026, 5, 29, 13, 34, 28), datetime.datetime(2026, 5, 29, 13, 34, 28), 'salt', 14.45, 48.8, None, 19.65, 43.31, 10.63, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:34:30.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:34:30.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:34:30.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:34:28, diff=2.682123s, valid=True
2026-05-29T13:34:30.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:34:30.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:34:30.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:34:12, diff=18.684963s, valid=True
2026-05-29T13:34:30.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:34:30.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:34:30.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:34:21, diff=9.691725s, valid=True
2026-05-29T13:34:30.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:34:30.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:34:30.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:34:30.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:34:30.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:34:30.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:34:30.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:34:12, diff=18.694896s, valid=True
2026-05-29T13:34:30.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:34:30.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:34:30.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:34:30.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987112.695865s, valid=True
2026-05-29T13:34:30.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:34:30.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:34:30.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:34:30.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:34:30.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:34:30.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:34:30.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:34:30.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:34:30.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:34:30.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:34:30.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:34:30.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:34:30.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:34:31.023 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:34:31.240 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:34:31.624 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:34:31.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:34:31.725 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:34:31.725 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:34:32.007 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:34:32.007 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:35:02.030 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:35:02.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:35:02.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:35:02.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:35:02.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:35:02.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:35:02.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-05-29T13:35:02.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:35:02.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-05-29T13:35:02.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:35:02.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:35:02.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:35:02.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T13:35: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-05-29T13:35:04.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:35:04.887 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:35:04.887 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:35:04.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:35:04.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:35:04.909 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:35:04.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:35:04.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:35:04.910 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:35:04.910 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:35:04.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:35:04.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:35:04.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:35:05.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:35:05.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:35:05.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:35:05.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:35:05.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:35:05.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:35:05.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:35:05.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:35:05.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:35:05.238 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:34:59
2026-05-29T13:35:05.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71969, datetime.datetime(2026, 5, 29, 13, 34, 59), datetime.datetime(2026, 5, 29, 13, 34, 58), 'salt', 14.38, 49.0, None, 18.49, 43.31, 10.56, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:35:05.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:35:05.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:35:05.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:34:58, diff=7.245044s, valid=True
2026-05-29T13:35:05.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:35:05.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:35:05.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:35:12, diff=-6.752084s, valid=True
2026-05-29T13:35:05.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:35:05.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:35:05.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:34:52, diff=13.254568s, valid=True
2026-05-29T13:35:05.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:35:05.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:35:05.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:35:05.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:35:05.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:35:05.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:35:05.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:35:12, diff=-6.742372s, valid=True
2026-05-29T13:35:05.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:35:05.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:35:05.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:35:05.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987147.258307s, valid=True
2026-05-29T13:35:05.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:35:05.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:35:05.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:35:05.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:35:05.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:35:05.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:35:05.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:35:05.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:35:05.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:35:05.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:35:05.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:35:05.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:35:05.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:35:05.635 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:35:05.849 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:35:06.199 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:35:06.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:35:06.301 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:35:06.301 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:35:06.474 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:35:06.474 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:35:36.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:35:36.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:35:36.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:35:36.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:35:36.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:35:36.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:35:36.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-05-29T13:35:36.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:35:36.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-05-29T13:35:36.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:35:36.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:35:36.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:35:36.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-05-29T13:35:39.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-05-29T13:35:39.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:35:39.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:35:39.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:35:39.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:35:39.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:35:39.872 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:35:39.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:35:39.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:35:39.872 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:35:39.872 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:35:39.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:35:39.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:35:39.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:35:40.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:35:40.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:35:40.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:35:40.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:35:40.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:35:40.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:35:40.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:35:40.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:35:40.141 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:35:40.203 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:35:29
2026-05-29T13:35:40.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71970, datetime.datetime(2026, 5, 29, 13, 35, 29), datetime.datetime(2026, 5, 29, 13, 35, 28), 'salt', 14.38, 50.46, None, 16.55, 45.63, 10.14, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:35:40.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:35:40.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:35:40.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:35:28, diff=12.21224s, valid=True
2026-05-29T13:35:40.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:35:40.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:35:40.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:35:12, diff=28.215126s, valid=True
2026-05-29T13:35:40.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:35:40.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:35:40.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:35:23, diff=17.22173s, valid=True
2026-05-29T13:35:40.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:35:40.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:35:40.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:35:40.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:35:40.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:35:40.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:35:40.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:35:12, diff=28.224795s, valid=True
2026-05-29T13:35:40.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:35:40.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:35:40.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:35:40.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987182.225468s, valid=True
2026-05-29T13:35:40.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:35:40.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:35:40.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:35:40.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:35:40.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:35:40.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:35:40.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:35:40.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:35:40.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:35:40.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:35:40.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:35:40.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:35:40.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:35:40.548 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:35:40.768 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:35:41.120 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:35:41.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:35:41.232 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:35:41.232 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:35:41.487 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:35:41.488 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:36:11.518 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:36:11.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:36:11.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:36:11.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:36:11.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:36:11.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:36:11.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-05-29T13:36:11.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:36:11.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-05-29T13:36:11.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:36:11.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:36:11.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:36:11.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-05-29T13:36:15.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-05-29T13:36:15.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:36:15.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:36:15.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:36:15.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:36:15.609 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:36:15.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:36:15.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:36:15.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:36:15.610 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:36:15.610 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:36:15.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:36:15.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:36:15.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:36:15.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:36:15.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:36:15.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:36:15.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:36:15.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:36:15.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:36:15.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:36:15.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:36:15.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:36:15.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:35:59
2026-05-29T13:36:15.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71971, datetime.datetime(2026, 5, 29, 13, 35, 59), datetime.datetime(2026, 5, 29, 13, 35, 59), 'salt', 14.45, 49.76, None, 20.4, 36.25, 10.35, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:36:15.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:36:15.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:36:15.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:35:59, diff=16.934216s, valid=True
2026-05-29T13:36:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:36:15.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:36:15.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:36:12, diff=3.937028s, valid=True
2026-05-29T13:36:15.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:36:15.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:36:15.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:35:55, diff=20.943486s, valid=True
2026-05-29T13:36:15.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:36:15.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:36:15.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:36:15.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:36:15.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:36:15.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:36:15.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:36:12, diff=3.946453s, valid=True
2026-05-29T13:36:15.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:36:15.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:36:15.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:36:15.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987217.947108s, valid=True
2026-05-29T13:36:15.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:36:15.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:36:15.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:36:15.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:36:15.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:36:16.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:36:16.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:36:16.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:36:16.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:36:16.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:36:16.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:36:16.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:36:16.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:36:16.319 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:36:16.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:36:16.873 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:36:16.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:36:16.975 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:36:16.975 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:36:17.048 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:36:17.049 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:36:47.079 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:36:47.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:36:47.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:36:47.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:36:47.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:36:47.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:36:47.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-05-29T13:36:47.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:36:47.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-05-29T13:36:47.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:36:47.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:36:47.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:36:47.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-05-29T13:36:50.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-05-29T13:36:50.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:36:50.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:36:50.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:36:50.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:36:50.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:36:50.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:36:50.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:36:50.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:36:50.275 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:36:50.275 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:36:50.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:36:50.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:36:50.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:36:50.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:36:50.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:36:50.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:36:50.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:36:50.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:36:50.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:36:50.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:36:50.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:36:50.551 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:36:50.613 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:36:29
2026-05-29T13:36:50.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71972, datetime.datetime(2026, 5, 29, 13, 36, 29), datetime.datetime(2026, 5, 29, 13, 36, 29), 'salt', 14.45, 49.36, None, 19.65, 39.79, 10.46, 832.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:36:50.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:36:50.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:36:50.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:36:29, diff=21.619242s, valid=True
2026-05-29T13:36:50.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:36:50.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:36:50.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:36:12, diff=38.622142s, valid=True
2026-05-29T13:36:50.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:36:50.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:36:50.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:36:26, diff=24.628803s, valid=True
2026-05-29T13:36:50.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:36:50.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:36:50.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:36:50.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:36:50.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:36:50.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:36:50.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:36:12, diff=38.631801s, valid=True
2026-05-29T13:36:50.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:36:50.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:36:50.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:36:50.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987252.632467s, valid=True
2026-05-29T13:36:50.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:36:50.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:36:50.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:36:50.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:36:50.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:36:50.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:36:50.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:36:50.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:36:50.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:36:50.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:36:50.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:36:50.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:36:50.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:36:50.948 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:36:51.184 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:36:51.530 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:36:51.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:36:51.632 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:36:51.632 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:36:51.893 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:36:51.893 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:37:21.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:37:21.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:37:21.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:37:22.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:37:22.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:37:22.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:37:22.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-05-29T13:37:22.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:37:22.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-05-29T13:37:22.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:37:22.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:37:22.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:37: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-05-29T13:37:25.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-05-29T13:37:25.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:37:25.090 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:37:25.090 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:37:25.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:37:25.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:37:25.111 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:37:25.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:37:25.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:37:25.112 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:37:25.112 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:37:25.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:37:25.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:37:25.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:37:25.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:37:25.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:37:25.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:37:25.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:37:25.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:37:25.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:37:25.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:37:25.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:37:25.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:37:25.460 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:36:59
2026-05-29T13:37:25.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71973, datetime.datetime(2026, 5, 29, 13, 36, 59), datetime.datetime(2026, 5, 29, 13, 36, 59), 'salt', 14.48, 49.99, None, 21.35, 52.9, 10.28, 832.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:37:25.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:37:25.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:37:25.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:36:59, diff=26.466439s, valid=True
2026-05-29T13:37:25.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:37:25.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:37:25.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:37:12, diff=13.469277s, valid=True
2026-05-29T13:37:25.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:37:25.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:37:25.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:36:58, diff=27.475953s, valid=True
2026-05-29T13:37:25.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:37:25.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:37:25.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:37:25.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:37:25.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:37:25.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:37:25.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:37:12, diff=13.478958s, valid=True
2026-05-29T13:37:25.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:37:25.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:37:25.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:37:25.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987287.479602s, valid=True
2026-05-29T13:37:25.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:37:25.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:37:25.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:37:25.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:37:25.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:37:25.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:37:25.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:37:25.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:37:25.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:37:25.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:37:25.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:37:25.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:37:25.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:37:25.821 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:37:26.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:37:26.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:37:26.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:37:26.491 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:37:26.491 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:37:26.749 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:37:26.749 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:37:56.777 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:37:56.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:37:56.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:37:57.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:37:57.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:37:57.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:37:57.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-05-29T13:37:57.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:37:57.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-05-29T13:37:57.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:37:57.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:37:57.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:37:57.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-05-29T13:38:00.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-05-29T13:38:00.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:38:00.381 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:38:00.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:38:00.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:38:00.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:38:00.401 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:38:00.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:38:00.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:38:00.401 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:38:00.401 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:38:00.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:38:00.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:38:00.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:38:00.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:38:00.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:38:00.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:38:00.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:38:00.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:38:00.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:38:00.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:38:00.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:38:00.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:38:00.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:38:00
2026-05-29T13:38:00.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71975, datetime.datetime(2026, 5, 29, 13, 38), datetime.datetime(2026, 5, 29, 13, 38), 'salt', 14.42, 47.61, None, 26.25, 34.18, 10.98, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:38:00.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:38:00.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:38:00.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:00, diff=0.740806s, valid=True
2026-05-29T13:38:00.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:38:00.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:38:00.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=-11.256325s, valid=True
2026-05-29T13:38:00.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:38:00.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:38:00.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:37:50, diff=10.75036s, valid=True
2026-05-29T13:38:00.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:38:00.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:38:00.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:38:00.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:38:00.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:38:00.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:38:00.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=-11.246586s, valid=True
2026-05-29T13:38:00.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:38:00.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:38:00.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:38:00.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987322.754091s, valid=True
2026-05-29T13:38:00.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:38:00.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:38:00.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:38:00.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:38:00.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:38:00.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:38:00.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:38:00.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:38:00.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:38:00.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:38:00.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:38:00.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:38:01.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:38:01.067 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:38:01.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:38:01.635 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:38:01.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:38:01.734 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:38:01.735 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:38:01.929 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:38:01.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:38:31.948 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:38:31.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:38:31.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:38:32.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:38:32.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:38:32.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:38:32.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-05-29T13:38:32.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:38:32.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-05-29T13:38:32.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:38:32.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:38:32.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:38:32.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-05-29T13:38:35.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-05-29T13:38:35.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:38:35.282 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:38:35.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:38:35.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:38:35.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:38:35.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:38:35.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:38:35.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:38:35.305 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:38:35.305 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:38:35.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:38:35.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:38:35.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:38:35.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:38:35.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:38:35.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:38:35.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:38:35.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T13:38:35.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:38:35.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:38:35.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:38:35.577 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:38:35.640 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:38:31
2026-05-29T13:38:35.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71976, datetime.datetime(2026, 5, 29, 13, 38, 31), datetime.datetime(2026, 5, 29, 13, 38, 30), 'salt', 14.18, 48.1, None, 19.27, 58.43, 10.81, 832.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:38:35.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:38:35.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:38:35.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:30, diff=5.646658s, valid=True
2026-05-29T13:38:35.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:38:35.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:38:35.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=23.649456s, valid=True
2026-05-29T13:38:35.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:38:35.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:38:35.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:22, diff=13.656126s, valid=True
2026-05-29T13:38:35.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:38:35.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:38:35.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:38:35.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:38:35.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:38:35.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T13:38:35.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=23.659158s, valid=True
2026-05-29T13:38:35.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:38:35.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:38:35.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:38:35.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987357.659826s, valid=True
2026-05-29T13:38:35.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:38:35.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:38:35.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:38:35.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:38:35.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:38:35.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:38:35.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:38:35.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:38:35.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:38:35.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:38:35.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:38:35.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:38:35.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:38:35.972 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:38:36.173 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:38:36.508 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:38:36.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:38:36.606 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:38:36.606 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:38:36.794 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:38:36.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:39:06.808 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:39:06.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:39:06.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:39:07.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:39:07.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:39:07.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:39:07.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-05-29T13:39:07.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:39:07.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-05-29T13:39:07.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:39:07.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:39:07.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:39:07.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-05-29T13:39:10.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-05-29T13:39:10.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:39:10.221 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:39:10.221 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:39:10.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:39:10.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:39:10.242 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:39:10.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:39:10.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:39:10.242 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:39:10.242 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:39:10.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:39:10.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:39:10.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:39:10.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:39:10.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:39:10.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T13:39:10.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:39:10.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T13:39:10.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:39:10.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:39:10.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:39:10.502 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:39:10.561 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:39:01
2026-05-29T13:39:10.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71977, datetime.datetime(2026, 5, 29, 13, 39, 1), datetime.datetime(2026, 5, 29, 13, 39, 1), 'salt', 14.28, 49.86, None, 21.67, 40.02, 10.3, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:39:10.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:39:10.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:39:10.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:39:01, diff=9.567704s, valid=True
2026-05-29T13:39:10.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:39:10.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T13:39:10.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=58.570557s, valid=True
2026-05-29T13:39:10.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:39:10.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:39:10.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:54, diff=16.577299s, valid=True
2026-05-29T13:39:10.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:39:10.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:39:10.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:39:10.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:39:10.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:39:10.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T13:39:10.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=58.580418s, valid=True
2026-05-29T13:39:10.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:39:10.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:39:10.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:39:10.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987392.581101s, valid=True
2026-05-29T13:39:10.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:39:10.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:39:10.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:39:10.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:39:10.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:39:10.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:39:10.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:39:10.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:39:10.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:39:10.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:39:10.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:39:10.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:39:10.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:39:10.898 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:39:11.102 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:39:11.494 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:39:11.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:39:11.594 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:39:11.594 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:39:11.849 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:39:11.849 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:39:41.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:39:41.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:39:41.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:39:42.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:39:42.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:39:42.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:39:42.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-05-29T13:39:42.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:39:42.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-05-29T13:39:42.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:39:42.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:39:42.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:39:42.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-05-29T13:39:45.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-05-29T13:39:45.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:39:45.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:39:45.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:39:45.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:39:45.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:39:45.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:39:45.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:39:45.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:39:45.157 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:39:45.157 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:39:45.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:39:45.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:39:45.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:39:45.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:39:45.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:39:45.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T13:39:45.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:39:45.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T13:39:45.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:39:45.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:39:45.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:39:45.412 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:39:45.470 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:39:32
2026-05-29T13:39:45.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71978, datetime.datetime(2026, 5, 29, 13, 39, 32), datetime.datetime(2026, 5, 29, 13, 39, 31), 'salt', 14.18, 48.24, None, 23.75, 34.51, 10.77, 832.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:39:45.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:39:45.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:39:45.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:39:31, diff=14.476644s, valid=True
2026-05-29T13:39:45.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:39:45.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T13:39:45.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=93.479589s, valid=True
2026-05-29T13:39:45.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:39:45.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:39:45.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:39:25, diff=20.486362s, valid=True
2026-05-29T13:39:45.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:39:45.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:39:45.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:39:45.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:39:45.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:39:45.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T13:39:45.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=93.489425s, valid=True
2026-05-29T13:39:45.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:39:45.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:39:45.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:39:45.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987427.490104s, valid=True
2026-05-29T13:39:45.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:39:45.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:39:45.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:39:45.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:39:45.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:39:45.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:39:45.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:39:45.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:39:45.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:39:45.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:39:45.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:39:45.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:39:45.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:39:45.824 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:39:46.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:39:46.365 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:39:46.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:39:46.465 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:39:46.465 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:39:46.682 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:39:46.682 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:40:16.712 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:40:16.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:40:16.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:40:17.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:40:17.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:40:17.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:40:17.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-05-29T13:40:17.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:40:17.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-05-29T13:40:17.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:40:17.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:40:17.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:40:17.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-05-29T13:40: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-05-29T13:40:21.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:40:21.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:40:21.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:40:21.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:40:21.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:40:21.258 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:40:21.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:40:21.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:40:21.258 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:40:21.258 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:40:21.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:40:21.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:40:21.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:40:21.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:40:21.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:40:21.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T13:40:21.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:40:21.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T13:40:21.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:40:21.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:40:21.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:40:21.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:40:21.567 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:40:02
2026-05-29T13:40:21.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71979, datetime.datetime(2026, 5, 29, 13, 40, 2), datetime.datetime(2026, 5, 29, 13, 40, 1), 'salt', 14.05, 48.9, None, 20.08, 37.09, 10.56, 832.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:40:21.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:40:21.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:40:21.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:40:01, diff=20.57363s, valid=True
2026-05-29T13:40:21.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:40:21.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T13:40:21.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=129.57643s, valid=True
2026-05-29T13:40:21.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:40:21.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:40:21.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:39:56, diff=25.583119s, valid=True
2026-05-29T13:40:21.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:40:21.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:40:21.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:40:21.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:40:21.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:40:21.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T13:40:21.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=129.586165s, valid=True
2026-05-29T13:40:21.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:40:21.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:40:21.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:40:21.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987463.586833s, valid=True
2026-05-29T13:40:21.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:40:21.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:40:21.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:40:21.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:40:21.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:40:21.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:40:21.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:40:21.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:40:21.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:40:21.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:40:21.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:40:21.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:40:21.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:40:21.919 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:40:22.186 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:40:22.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:40:22.618 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:40:22.619 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:40:22.619 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:40:22.785 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:40:22.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:40:52.816 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:40:52.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:40:52.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:40:53.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:40:53.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:40:53.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:40:53.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-05-29T13:40:53.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:40:53.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-05-29T13:40:53.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:40:53.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:40:53.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:40:53.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-05-29T13:40: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-05-29T13:40:56.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:40:56.431 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:40:56.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:40:56.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:40:56.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:40:56.451 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:40:56.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:40:56.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:40:56.452 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:40:56.452 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:40:56.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:40:56.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:40:56.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:40:56.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:40:56.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:40:56.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T13:40:56.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:40:56.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T13:40:56.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:40:56.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:40:56.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:40:56.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:40:56.760 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:40:32
2026-05-29T13:40:56.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71980, datetime.datetime(2026, 5, 29, 13, 40, 32), datetime.datetime(2026, 5, 29, 13, 40, 32), 'salt', 14.28, 49.76, None, 24.95, 42.39, 10.33, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:40:56.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:40:56.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:40:56.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:40:32, diff=24.76672s, valid=True
2026-05-29T13:40:56.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:40:56.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T13:40:56.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=164.769549s, valid=True
2026-05-29T13:40:56.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:40:56.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:40:56.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:40:32, diff=24.776205s, valid=True
2026-05-29T13:40:56.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:40:56.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:40:56.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:40:56.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:40:56.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:40:56.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T13:40:56.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=164.779248s, valid=True
2026-05-29T13:40:56.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:40:56.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:40:56.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:40:56.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987498.779919s, valid=True
2026-05-29T13:40:56.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:40:56.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:40:56.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:40:56.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:40:56.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:40:56.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:40:56.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:40:56.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:40:56.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:40:56.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:40:56.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:40:57.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:40:57.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:40:57.096 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:40:57.300 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:40:57.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:40:57.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:40: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-05-29T13:40:57.745 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:40:57.936 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:40:57.936 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:41:27.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:41:27.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:41:27.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:41:28.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:41:28.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:41:28.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:41:28.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-05-29T13:41:28.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:41:28.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-05-29T13:41:28.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:41:28.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:41:28.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:41:28.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-05-29T13:41:31.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-05-29T13:41:31.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:41:31.254 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:41:31.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:41:31.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:41:31.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:41:31.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:41:31.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:41:31.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:41:31.275 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:41:31.275 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:41:31.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:41:31.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:41:31.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:41:31.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:41:31.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:41:31.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T13:41:31.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:41:31.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T13:41:31.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:41:31.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:41:31.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:41:31.527 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:41:31.584 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:41:02
2026-05-29T13:41:31.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71981, datetime.datetime(2026, 5, 29, 13, 41, 2), datetime.datetime(2026, 5, 29, 13, 41, 1), 'salt', 14.18, 49.5, None, 24.31, 48.28, 10.4, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:41:31.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:41:31.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:41:31.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:41:01, diff=30.590585s, valid=True
2026-05-29T13:41:31.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:41:31.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T13:41:31.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=199.593392s, valid=True
2026-05-29T13:41:31.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:41:31.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:41:31.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:41:02, diff=29.599862s, valid=True
2026-05-29T13:41:31.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:41:31.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:41:31.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:41:31.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:41:31.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:41:31.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T13:41:31.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=199.602883s, valid=True
2026-05-29T13:41:31.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:41:31.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:41:31.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:41:31.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987533.603531s, valid=True
2026-05-29T13:41:31.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:41:31.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:41:31.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:41:31.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:41:31.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:41:31.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:41:31.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:41:31.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:41:31.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:41:31.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:41:31.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:41:31.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:41:31.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:41:31.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:41:32.205 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:41:32.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:41:32.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:41:32.655 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:41:32.655 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:41:32.888 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:41:32.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:42:02.918 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:42:02.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:42:02.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:42:03.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:42:03.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:42:03.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:42:03.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-05-29T13:42:03.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:42:03.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-05-29T13:42:03.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:42:03.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:42:03.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:42:03.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-05-29T13:42:05.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-05-29T13:42:05.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:42:05.611 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:42:05.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:42:05.619 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:42:05.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:42:05.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:42:05.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:42:05.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:42:05.635 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:42:05.635 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:42:05.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:42:05.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:42:05.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:42:05.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:42:05.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:42:05.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:42:05.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:42:05.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:42:05.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:42:05.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:42:05.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:42:05.886 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:42:05.944 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:42:03
2026-05-29T13:42:05.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71983, datetime.datetime(2026, 5, 29, 13, 42, 3), datetime.datetime(2026, 5, 29, 13, 42, 2), 'salt', 14.02, 49.63, None, 20.54, 37.65, 10.36, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:42:05.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:42:05.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:42:05.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:42:02, diff=3.950441s, valid=True
2026-05-29T13:42:05.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:42:05.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:42:05.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=233.953286s, valid=True
2026-05-29T13:42:05.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:42:05.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:42:05.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:42:02, diff=3.960117s, valid=True
2026-05-29T13:42:05.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:42:05.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:42:05.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:42:05.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:42:05.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:42:05.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:42:05.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=233.963144s, valid=True
2026-05-29T13:42:05.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:42:05.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:42:05.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:42:05.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987567.963806s, valid=True
2026-05-29T13:42:05.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:42:05.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:42:05.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:42:05.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:42:05.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:42:06.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:42:06.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:42:06.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:42:06.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:42:06.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:42:06.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:42:06.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:42:06.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:42:06.279 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:42:06.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:42:06.817 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:42:06.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:42:06.916 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:42:06.916 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:42:07.185 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:42:07.185 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:42:37.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:42:37.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:42:37.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:42:37.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:42:37.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:42:37.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:42:37.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-05-29T13:42:37.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:42:37.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-05-29T13:42:37.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:42:37.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:42:37.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:42:37.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T13:42:40.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-05-29T13:42:40.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:42:40.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:42:40.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:42:40.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:42:40.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:42:40.485 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:42:40.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:42:40.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:42:40.485 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:42:40.485 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:42:40.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:42:40.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:42:40.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:42:40.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:42:40.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:42:40.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:42:40.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:42:40.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:42:40.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:42:40.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:42:40.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:42:40.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:42:40.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:42:33
2026-05-29T13:42:40.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71984, datetime.datetime(2026, 5, 29, 13, 42, 33), datetime.datetime(2026, 5, 29, 13, 42, 32), 'salt', 14.22, 50.99, None, 21.98, 39.01, 9.99, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:42:40.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:42:40.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:42:40.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:42:32, diff=8.815116s, valid=True
2026-05-29T13:42:40.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:42:40.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:42:40.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=268.817975s, valid=True
2026-05-29T13:42:40.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:42:40.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:42:40.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:42:23, diff=17.824661s, valid=True
2026-05-29T13:42:40.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:42:40.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:42:40.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:42:40.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:42:40.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:42:40.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:42:40.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=268.827684s, valid=True
2026-05-29T13:42:40.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:42:40.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:42:40.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:42:40.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987602.82835s, valid=True
2026-05-29T13:42:40.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:42:40.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:42:40.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:42:40.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:42:40.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:42:40.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:42:40.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:42:40.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:42:40.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:42:41.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:42:41.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:42:41.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:42:41.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:42:41.206 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:42:41.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:42:41.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:42:41.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:42:41.845 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:42:41.845 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:42:42.023 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:42:42.024 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:43:12.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:43:12.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:43:12.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:43:12.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:43:12.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:43:12.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:43:12.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-05-29T13:43:12.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:43:12.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-05-29T13:43:12.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:43:12.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:43:12.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:43:12.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-05-29T13:43:15.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-05-29T13:43:15.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:43:15.156 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:43:15.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:43:15.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:43:15.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:43:15.178 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:43:15.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:43:15.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:43:15.178 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:43:15.178 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:43:15.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:43:15.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:43:15.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:43:15.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:43:15.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:43:15.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:43:15.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:43:15.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:43:15.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:43:15.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:43:15.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:43:15.439 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:43:15.497 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:43:03
2026-05-29T13:43:15.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71985, datetime.datetime(2026, 5, 29, 13, 43, 3), datetime.datetime(2026, 5, 29, 13, 43, 3), 'salt', 14.35, 50.39, None, 23.64, 41.36, 10.16, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:43:15.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:43:15.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:43:15.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:43:03, diff=12.504171s, valid=True
2026-05-29T13:43:15.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:43:15.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:43:15.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=303.507101s, valid=True
2026-05-29T13:43:15.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:43:15.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:43:15.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:42:54, diff=21.513912s, valid=True
2026-05-29T13:43:15.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:43:15.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:43:15.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:43:15.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:43:15.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:43:15.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:43:15.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:38:12, diff=303.517006s, valid=True
2026-05-29T13:43:15.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:43:15.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:43:15.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:43:15.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987637.517685s, valid=True
2026-05-29T13:43:15.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:43:15.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:43:15.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:43:15.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:43:15.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:43:15.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:43:15.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:43:15.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:43:15.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:43:15.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:43:15.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:43:15.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:43:15.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:43:15.845 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:43:16.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:43:16.393 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:43:16.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:43:16.492 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:43:16.493 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:43:16.747 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:43:16.747 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:43:46.765 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:43:46.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:43:46.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:43:46.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:43:46.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:43:47.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:43:47.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-05-29T13:43:47.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:43:47.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-05-29T13:43:47.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:43:47.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:43:47.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:43:47.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-05-29T13:43:49.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-05-29T13:43:49.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:43:49.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:43:49.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:43:49.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:43:49.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:43:49.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:43:49.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:43:49.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:43:49.880 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:43:49.880 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:43:49.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:43:50.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:43:50.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:43:50.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:43:50.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:43:50.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:43:50.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:43:50.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:43:50.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:43:50.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:43:50.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:43:50.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:43:50.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:43:33
2026-05-29T13:43:50.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71986, datetime.datetime(2026, 5, 29, 13, 43, 33), datetime.datetime(2026, 5, 29, 13, 43, 33), 'salt', 14.42, 48.17, None, 23.5, 37.65, 10.81, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:43:50.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:43:50.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:43:50.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:43:33, diff=17.282225s, valid=True
2026-05-29T13:43:50.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:43:50.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:43:50.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:44:12, diff=-21.714979s, valid=True
2026-05-29T13:43:50.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:43:50.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:43:50.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:43:26, diff=24.291576s, valid=True
2026-05-29T13:43:50.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:43:50.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:43:50.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:43:50.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:43:50.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:43:50.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:43:50.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:44:12, diff=-21.705348s, valid=True
2026-05-29T13:43:50.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:43:50.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:43:50.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:43:50.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987672.295294s, valid=True
2026-05-29T13:43:50.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:43:50.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:43:50.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:43:50.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:43:50.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:43:50.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:43:50.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:43:50.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:43:50.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:43:50.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:43:50.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:43:50.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:43:50.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:43:50.617 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:43:50.823 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:43:51.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:43:51.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:43:51.270 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:43:51.271 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:43:51.435 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:43:51.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:44:21.453 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:44:21.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:44:21.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:44:21.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:44:21.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:44:21.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:44:21.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-05-29T13:44:21.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:44: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-05-29T13:44:21.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:44:21.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:44:21.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:44:21.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-05-29T13:44:24.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T13:44:24.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:44:24.511 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:44:24.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:44:24.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:44:24.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:44:24.532 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:44:24.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:44:24.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:44:24.532 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:44:24.532 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:44:24.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:44:24.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:44:24.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:44:24.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:44:24.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:44:24.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:44:24.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:44:24.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:44:24.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:44:24.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:44:24.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:44:24.795 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:44:24.855 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:44:04
2026-05-29T13:44:24.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71987, datetime.datetime(2026, 5, 29, 13, 44, 4), datetime.datetime(2026, 5, 29, 13, 44, 3), 'salt', 14.51, 48.24, None, 22.12, 36.88, 10.79, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:44:24.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:44:24.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:44:24.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:44:03, diff=21.861627s, valid=True
2026-05-29T13:44:24.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:44:24.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:44:24.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:44:12, diff=12.864435s, valid=True
2026-05-29T13:44:24.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:44:24.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:44:24.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:43:57, diff=27.871263s, valid=True
2026-05-29T13:44:24.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:44:24.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:44:24.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:44:24.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:44:24.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:44:24.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:44:24.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:44:12, diff=12.874369s, valid=True
2026-05-29T13:44:24.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:44:24.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:44:24.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:44:24.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987706.875036s, valid=True
2026-05-29T13:44:24.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:44:24.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:44:24.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:44:24.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:44:24.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:44:24.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:44:24.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:44:24.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:44:24.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:44:25.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:44:25.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:44:25.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:44:25.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:44:25.200 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:44:25.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:44:25.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:44:25.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:44:25.902 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:44:25.902 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:44:26.155 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:44:26.155 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:44:56.185 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:44:56.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:44:56.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:44:56.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:44:56.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:44:56.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:44:56.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-05-29T13:44:56.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:44:56.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-05-29T13:44:56.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:44:56.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:44:56.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:44:56.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-05-29T13:44:59.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-05-29T13:44:59.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:44:59.124 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:44:59.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:44:59.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:44:59.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:44:59.146 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:44:59.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:44:59.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:44:59.147 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:44:59.147 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:44:59.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:44:59.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:44:59.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:44:59.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:44:59.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:44:59.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:44:59.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:44:59.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:44:59.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:44:59.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:44:59.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:44:59.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:44:59.464 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:44:34
2026-05-29T13:44:59.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71988, datetime.datetime(2026, 5, 29, 13, 44, 34), datetime.datetime(2026, 5, 29, 13, 44, 33), 'salt', 14.51, 47.54, None, 22.23, 42.18, 11.0, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:44:59.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:44:59.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:44:59.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:44:33, diff=26.470476s, valid=True
2026-05-29T13:44:59.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:44:59.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:44:59.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:45:12, diff=-12.526586s, valid=True
2026-05-29T13:44:59.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:44:59.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:44:59.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:44:29, diff=30.480297s, valid=True
2026-05-29T13:44:59.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:44:59.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:44:59.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:44:59.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:44:59.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:44:59.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:44:59.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:45:12, diff=-12.51651s, valid=True
2026-05-29T13:44:59.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:44:59.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:44:59.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:44:59.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987741.484164s, valid=True
2026-05-29T13:44:59.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:44:59.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:44:59.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:44:59.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:44:59.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:44:59.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:44:59.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:44:59.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:44:59.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:44:59.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:44:59.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:44:59.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:44:59.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:44:59.807 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:45:00.030 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:45:00.383 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:45:00.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:45:00.483 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:45:00.483 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:45:00.717 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:45:00.717 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:45:30.748 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:45:30.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:45:30.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:45:31.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:45:31.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:45:31.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:45:31.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-05-29T13:45:31.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:45:31.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-05-29T13:45:31.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:45:31.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:45:31.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:45:31.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-05-29T13:45:34.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-05-29T13:45:34.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:45:34.124 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:45:34.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:45:34.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:45:34.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:45:34.144 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:45:34.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:45:34.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:45:34.144 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:45:34.144 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:45:34.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:45:34.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:45:34.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:45:34.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:45:34.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:45:34.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:45:34.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:45:34.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:45:34.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:45:34.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:45:34.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:45:34.398 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:45:34.456 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:45:04
2026-05-29T13:45:34.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71989, datetime.datetime(2026, 5, 29, 13, 45, 4), datetime.datetime(2026, 5, 29, 13, 45, 4), 'salt', 14.45, 47.91, None, 23.57, 29.04, 10.89, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:45:34.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:45:34.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:45:34.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:45:34, diff=0.462581s, valid=True
2026-05-29T13:45:34.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:45:34.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:45:34.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:45:12, diff=22.465393s, valid=True
2026-05-29T13:45:34.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:45:34.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:45:34.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:45:32, diff=2.471927s, valid=True
2026-05-29T13:45:34.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:45:34.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:45:34.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:45:34.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:45:34.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:45:34.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:45:34.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:45:12, diff=22.474935s, valid=True
2026-05-29T13:45:34.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:45:34.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:45:34.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:45:34.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987776.475591s, valid=True
2026-05-29T13:45:34.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:45:34.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:45:34.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:45:34.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:45:34.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:45:34.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:45:34.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:45:34.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:45:34.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:45:34.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:45:34.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:45:34.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:45:34.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:45:34.790 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:45:35.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:45:35.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:45:35.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:45:35.502 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:45:35.502 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:45:38.468 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:45:38.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:46:08.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:46:08.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:46:08.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:46:08.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:46:08.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:46:09.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:46:09.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-05-29T13:46:09.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:46:09.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-05-29T13:46:09.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:46:09.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:46:09.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:46:09.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-05-29T13:46:11.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T13:46:11.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:46:11.805 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:46:11.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:46:11.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:46:11.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:46:11.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:46:11.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:46:11.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:46:11.826 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:46:11.826 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:46:11.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:46:11.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:46:11.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:46:11.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:46:11.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:46:12.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:46:12.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:46:12.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:46:12.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:46:12.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:46:12.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:46:12.087 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:46:12.144 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:46:04
2026-05-29T13:46:12.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71991, datetime.datetime(2026, 5, 29, 13, 46, 4), datetime.datetime(2026, 5, 29, 13, 46, 4), 'salt', 14.61, 50.33, None, 21.24, 36.95, 10.2, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:46:12.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:46:12.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:46:12.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:46:04, diff=8.151014s, valid=True
2026-05-29T13:46:12.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:46:12.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:46:12.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:46:12, diff=0.153831s, valid=True
2026-05-29T13:46:12.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:46:12.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:46:12.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:46:03, diff=9.160512s, valid=True
2026-05-29T13:46:12.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:46:12.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:46:12.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:46:12.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:46:12.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:46:12.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:46:12.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:46:12, diff=0.163495s, valid=True
2026-05-29T13:46:12.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:46:12.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:46:12.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:46:12.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987814.164167s, valid=True
2026-05-29T13:46:12.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:46:12.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:46:12.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:46:12.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:46:12.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:46:12.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:46:12.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:46:12.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:46:12.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:46:12.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:46:12.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:46:12.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:46:12.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:46:12.507 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:46:12.739 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:46:13.089 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:46:13.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:46:13.199 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:46:13.199 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:46:13.359 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:46:13.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:46:43.388 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:46:43.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:46:43.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:46:43.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:46:43.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:46:43.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:46:43.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-05-29T13:46:43.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:46:43.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-05-29T13:46:43.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:46:43.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:46:43.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:46:43.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-05-29T13:46:46.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T13:46:46.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:46:46.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:46:46.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:46:46.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:46:46.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:46:46.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:46:46.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:46:46.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:46:46.228 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:46:46.228 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:46:46.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:46:46.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:46:46.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:46:46.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:46:46.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:46:46.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:46:46.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:46:46.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:46:46.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:46:46.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:46:46.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:46:46.572 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:46:46.636 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:46:35
2026-05-29T13:46:46.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71992, datetime.datetime(2026, 5, 29, 13, 46, 35), datetime.datetime(2026, 5, 29, 13, 46, 34), 'salt', 14.58, 50.29, None, 20.57, 42.88, 10.21, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:46:46.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:46:46.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:46:46.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:46:34, diff=12.64289s, valid=True
2026-05-29T13:46:46.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:46:46.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:46:46.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:47:12, diff=-25.354276s, valid=True
2026-05-29T13:46:46.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:46:46.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:46:46.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:46:34, diff=12.652391s, valid=True
2026-05-29T13:46:46.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:46:46.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:46:46.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:46:46.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:46:46.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:46:46.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:46:46.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:47:12, diff=-25.344579s, valid=True
2026-05-29T13:46:46.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:46:46.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:46:46.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:46:46.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987848.656112s, valid=True
2026-05-29T13:46:46.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:46:46.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:46:46.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:46:46.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:46:46.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:46:46.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:46:46.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:46:46.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:46:46.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:46:46.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:46:46.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:46:46.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:46:46.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:46:46.979 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:46:47.267 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:46:47.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:46:47.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:46:47.712 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:46:47.713 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:46:47.877 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:46:47.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:47:17.908 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:47:17.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:47:17.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:47:18.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:47:18.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:47:18.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:47:18.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-05-29T13:47:18.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:47:18.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-05-29T13:47:18.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:47:18.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:47:18.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:47:18.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-05-29T13:47:20.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-05-29T13:47:20.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:47:20.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:47:20.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:47:20.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:47:20.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:47:20.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:47:20.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:47:20.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:47:20.729 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:47:20.729 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:47:20.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:47:20.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:47:20.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:47:20.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:47:20.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:47:20.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:47:20.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:47:20.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:47:20.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:47:20.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:47:20.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:47:20.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:47:21.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:47:05
2026-05-29T13:47:21.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71993, datetime.datetime(2026, 5, 29, 13, 47, 5), datetime.datetime(2026, 5, 29, 13, 47, 5), 'salt', 14.51, 50.62, None, 21.0, 37.74, 10.1, 832.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:47:21.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:47:21.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:47:21.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:47:05, diff=16.05145s, valid=True
2026-05-29T13:47:21.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:47:21.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:47:21.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:47:12, diff=9.054324s, valid=True
2026-05-29T13:47:21.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:47:21.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:47:21.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:46:56, diff=25.061097s, valid=True
2026-05-29T13:47:21.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:47:21.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:47:21.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:47:21.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:47:21.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:47:21.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:47:21.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:47:12, diff=9.064162s, valid=True
2026-05-29T13:47:21.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:47:21.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:47:21.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:47:21.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987883.064839s, valid=True
2026-05-29T13:47:21.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:47:21.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:47:21.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:47:21.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:47:21.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:47:21.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:47:21.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:47:21.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:47:21.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:47:21.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:47:21.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:47:21.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:47:21.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:47:21.383 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:47:21.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:47:21.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:47:22.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:47:22.047 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:47:22.047 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:47:22.316 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:47:22.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:47:52.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:47:52.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:47:52.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:47:52.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:47:52.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:47:52.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:47:52.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-05-29T13:47:52.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:47:52.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-05-29T13:47:52.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:47:52.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:47:52.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:47:52.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-05-29T13:47:55.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-05-29T13:47:55.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:47:55.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:47:55.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:47:55.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:47:55.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:47:55.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:47:55.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:47:55.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:47:55.200 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:47:55.200 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:47:55.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:47:55.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:47:55.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:47:55.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:47:55.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:47:55.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:47:55.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:47:55.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:47:55.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:47:55.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:47:55.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:47:55.455 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:47:55.514 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:47:35
2026-05-29T13:47:55.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71994, datetime.datetime(2026, 5, 29, 13, 47, 35), datetime.datetime(2026, 5, 29, 13, 47, 35), 'salt', 14.42, 51.05, None, 19.37, 42.76, 9.99, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:47:55.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:47:55.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:47:55.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:47:35, diff=20.520704s, valid=True
2026-05-29T13:47:55.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:47:55.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:47:55.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:48:12, diff=-16.476454s, valid=True
2026-05-29T13:47:55.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:47:55.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:47:55.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:47:27, diff=28.530173s, valid=True
2026-05-29T13:47:55.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:47:55.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:47:55.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:47:55.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:47:55.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:47:55.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:47:55.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:48:12, diff=-16.466802s, valid=True
2026-05-29T13:47:55.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:47:55.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:47:55.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:47:55.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987917.533887s, valid=True
2026-05-29T13:47:55.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:47:55.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:47:55.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:47:55.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:47:55.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:47:55.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:47:55.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:47:55.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:47:55.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:47:55.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:47:55.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:47:55.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:47:55.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:47:55.912 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:47:56.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:47:56.456 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:47:56.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:47:56.555 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:47:56.555 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:47:56.724 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:47:56.724 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:48:26.754 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:48:26.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:48:26.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:48:27.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:48:27.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:48:27.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:48:27.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-05-29T13:48:27.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:48:27.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-05-29T13:48:27.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:48:27.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:48:27.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:48: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-05-29T13:48:29.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T13:48:29.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:48:29.688 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:48:29.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:48:29.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:48:29.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:48:29.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:48:29.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:48:29.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:48:29.711 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:48:29.711 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:48:29.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:48:29.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:48:29.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:48:29.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:48:29.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:48:29.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:48:29.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:48:29.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:48:29.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:48:29.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:48:29.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:48:29.979 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:48:30.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:48:05
2026-05-29T13:48:30.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71995, datetime.datetime(2026, 5, 29, 13, 48, 5), datetime.datetime(2026, 5, 29, 13, 48, 5), 'salt', 14.38, 52.12, None, 16.3, 51.11, 9.68, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:48:30.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:48:30.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:48:30.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:48:05, diff=25.052333s, valid=True
2026-05-29T13:48:30.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:48:30.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:48:30.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:48:12, diff=18.055299s, valid=True
2026-05-29T13:48:30.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:48:30.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:48:30.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:47:59, diff=31.062155s, valid=True
2026-05-29T13:48:30.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:48:30.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:48:30.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:48:30.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:48:30.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:48:30.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:48:30.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:48:12, diff=18.065387s, valid=True
2026-05-29T13:48:30.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:48:30.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:48:30.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:48:30.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987952.066087s, valid=True
2026-05-29T13:48:30.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:48:30.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:48:30.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:48:30.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:48:30.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:48:30.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:48:30.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:48:30.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:48:30.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:48:30.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:48:30.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:48:30.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:48:30.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:48:30.394 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:48:30.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:48:30.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:48:31.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:48:31.081 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:48:31.082 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:48:31.303 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:48:31.303 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:49:01.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:49:01.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:49:01.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:49:01.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:49:01.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:49:01.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:49:01.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-05-29T13:49:01.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:49:01.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-05-29T13:49:01.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:49:01.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:49:01.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:49:01.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-05-29T13:49:04.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-05-29T13:49:04.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:49:04.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:49:04.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:49:04.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:49:04.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:49:04.303 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:49:04.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:49:04.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:49:04.304 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:49:04.304 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:49:04.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:49:04.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:49:04.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:49:04.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:49:04.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:49:04.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:49:04.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:49:04.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:49:04.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:49:04.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:49:04.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:49:04.559 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:49:04.628 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:48:36
2026-05-29T13:49:04.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71996, datetime.datetime(2026, 5, 29, 13, 48, 36), datetime.datetime(2026, 5, 29, 13, 48, 34), 'salt', 14.38, 52.22, None, 19.94, 38.4, 9.65, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:49:04.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:49:04.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:49:04.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:48:34, diff=30.634946s, valid=True
2026-05-29T13:49:04.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:49:04.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:49:04.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:49:12, diff=-7.362223s, valid=True
2026-05-29T13:49:04.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:49:04.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:49:04.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:48:30, diff=34.64452s, valid=True
2026-05-29T13:49:04.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:49:04.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:49:04.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:49:04.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:49:04.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:49:04.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:49:04.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:49:12, diff=-7.352464s, valid=True
2026-05-29T13:49:04.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:49:04.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:49:04.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:49:04.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=987986.648209s, valid=True
2026-05-29T13:49:04.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:49:04.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:49:04.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:49:04.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:49:04.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:49:04.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:49:04.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:49:04.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:49:04.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:49:04.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:49:04.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:49:04.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:49:04.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:49:05.035 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:49:05.239 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:49:05.575 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:49:05.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:49:05.674 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:49:05.674 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:49:05.945 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:49:05.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:49:35.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:49:35.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:49:35.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:49:36.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:49:36.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:49:36.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:49:36.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-05-29T13:49:36.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:49:36.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-05-29T13:49:36.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:49:36.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:49:36.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:49:36.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-05-29T13:49:38.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-05-29T13:49:38.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:49:38.849 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:49:38.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:49:38.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:49:38.869 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:49:38.869 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:49:38.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:49:38.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:49:38.870 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:49:38.870 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:49:38.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:49:38.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:49:38.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:49:39.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:49:39.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:49:39.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:49:39.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:49:39.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:49:39.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:49:39.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:49:39.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:49:39.130 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:49:39.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:49:36
2026-05-29T13:49:39.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71998, datetime.datetime(2026, 5, 29, 13, 49, 36), datetime.datetime(2026, 5, 29, 13, 49, 36), 'salt', 14.25, 51.92, None, 17.96, 45.32, 9.73, 832.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:49:39.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:49:39.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:49:39.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:49:36, diff=3.193913s, valid=True
2026-05-29T13:49:39.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:49:39.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:49:39.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:50:12, diff=-32.803274s, valid=True
2026-05-29T13:49:39.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:49:39.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:49:39.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:49:33, diff=6.203493s, valid=True
2026-05-29T13:49:39.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:49:39.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:49:39.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:49:39.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:49:39.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:49:39.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:49:39.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:50:12, diff=-32.7935s, valid=True
2026-05-29T13:49:39.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:49:39.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:49:39.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:49:39.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988021.207185s, valid=True
2026-05-29T13:49:39.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:49:39.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:49:39.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:49:39.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:49:39.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:49:39.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:49:39.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:49:39.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:49:39.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:49:39.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:49:39.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:49:39.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:49:39.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:49:39.522 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:49:39.729 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:49:40.082 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:49:40.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:49:40.187 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:49:40.187 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:49:40.434 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:49:40.434 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:50:10.462 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:50:10.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:50:10.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:50:10.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:50:10.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:50:10.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:50:10.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-05-29T13:50:10.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:50:10.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-05-29T13:50:10.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:50:10.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:50:11.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:50:11.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-05-29T13:50:13.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-05-29T13:50:13.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:50:13.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:50:13.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:50:13.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:50:13.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:50:13.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:50:13.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:50:13.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:50:13.775 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:50:13.775 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:50:13.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:50:13.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:50:13.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:50:14.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:50:14.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:50:14.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:50:14.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:50:14.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:50:14.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:50:14.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:50:14.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:50:14.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:50:14.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:50:06
2026-05-29T13:50:14.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71999, datetime.datetime(2026, 5, 29, 13, 50, 6), datetime.datetime(2026, 5, 29, 13, 50, 6), 'salt', 14.28, 52.41, None, 18.67, 37.56, 9.59, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:50:14.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:50:14.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:50:14.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:50:06, diff=8.165253s, valid=True
2026-05-29T13:50:14.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:50:14.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:50:14.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:50:12, diff=2.168122s, valid=True
2026-05-29T13:50:14.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:50:14.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:50:14.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:50:04, diff=10.174683s, valid=True
2026-05-29T13:50:14.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:50:14.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:50:14.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:50:14.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:50:14.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:50:14.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:50:14.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:50:12, diff=2.177697s, valid=True
2026-05-29T13:50:14.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:50:14.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:50:14.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:50:14.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988056.178341s, valid=True
2026-05-29T13:50:14.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:50:14.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:50:14.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:50:14.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:50:14.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:50:14.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:50:14.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:50:14.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:50:14.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:50:14.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:50:14.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:50:14.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:50:14.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:50:14.495 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:50:14.710 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:50:15.059 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:50:15.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:50:15.162 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:50:15.162 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:50:15.321 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:50:15.321 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:50:45.342 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:50:45.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:50:45.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:50:45.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:50:45.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:50:45.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:50:45.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-05-29T13:50:45.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:50:45.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-05-29T13:50:45.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:50:45.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:50:45.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:50:45.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-05-29T13:50:48.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-05-29T13:50:48.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:50:48.113 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:50:48.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:50:48.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:50:48.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:50:48.134 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:50:48.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:50:48.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:50:48.134 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:50:48.135 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:50:48.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:50:48.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:50:48.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:50:48.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:50:48.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:50:48.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:50:48.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:50:48.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:50:48.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:50:48.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:50:48.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:50:48.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:50:48.460 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:50:36
2026-05-29T13:50:48.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72000, datetime.datetime(2026, 5, 29, 13, 50, 36), datetime.datetime(2026, 5, 29, 13, 50, 36), 'salt', 14.18, 52.45, None, 15.81, 35.56, 9.58, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:50:48.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:50:48.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:50:48.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:50:36, diff=12.466286s, valid=True
2026-05-29T13:50:48.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:50:48.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:50:48.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:51:12, diff=-23.530866s, valid=True
2026-05-29T13:50:48.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:50:48.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:50:48.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:50:36, diff=12.475844s, valid=True
2026-05-29T13:50:48.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:50:48.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:50:48.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:50:48.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:50:48.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:50:48.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:50:48.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:51:12, diff=-23.521131s, valid=True
2026-05-29T13:50:48.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:50:48.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:50:48.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:50:48.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988090.47952s, valid=True
2026-05-29T13:50:48.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:50:48.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:50:48.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:50:48.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:50:48.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:50:48.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:50:48.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:50:48.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:50:48.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:50:48.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:50:48.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:50:48.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:50:48.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:50:48.795 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:50:49.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:50:49.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:50:49.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:50:49.504 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:50:49.504 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:50:49.670 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:50:49.670 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:51:19.674 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:51:19.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:51:19.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:51:19.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:51:19.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:51:20.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:51:20.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-05-29T13:51:20.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:51:20.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-05-29T13:51:20.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:51:20.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:51:20.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:51:20.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-05-29T13:51:22.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-05-29T13:51:22.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:51:22.614 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:51:22.614 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:51:22.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:51:22.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:51:22.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:51:22.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:51:22.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:51:22.635 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:51:22.635 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:51:22.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:51:22.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:51:22.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:51:22.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:51:22.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:51:22.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:51:22.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:51:22.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:51:22.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:51:22.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:51:22.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:51:22.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:51:22.957 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:51:07
2026-05-29T13:51:22.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72001, datetime.datetime(2026, 5, 29, 13, 51, 7), datetime.datetime(2026, 5, 29, 13, 51, 6), 'salt', 14.15, 52.84, None, 20.11, 43.68, 9.47, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:51:22.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:51:22.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:51:22.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:51:06, diff=16.963235s, valid=True
2026-05-29T13:51:22.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:51:22.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:51:22.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:51:12, diff=10.966073s, valid=True
2026-05-29T13:51:22.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:51:22.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:51:22.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:50:58, diff=24.972928s, valid=True
2026-05-29T13:51:22.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:51:22.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:51:22.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:51:22.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:51:22.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:51:22.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:51:22.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:51:12, diff=10.975967s, valid=True
2026-05-29T13:51:22.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:51:22.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:51:22.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:51:22.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988124.976635s, valid=True
2026-05-29T13:51:22.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:51:22.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:51:22.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:51:22.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:51:22.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:51:23.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:51:23.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:51:23.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:51:23.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:51:23.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:51:23.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:51:23.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:51:23.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:51:23.298 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:51:23.513 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:51:23.862 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:51:23.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:51:23.964 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:51:23.964 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:51:24.200 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:51:24.200 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:51:54.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:51:54.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:51:54.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:51:54.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:51:54.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:51:54.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:51:54.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-05-29T13:51:54.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:51:54.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-05-29T13:51:54.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:51:54.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:51:54.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:51:54.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-05-29T13:51:57.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-05-29T13:51:57.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:51:57.351 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:51:57.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:51:57.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:51:57.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:51:57.371 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:51:57.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:51:57.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:51:57.371 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:51:57.371 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:51:57.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:51:57.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:51:57.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:51:57.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:51:57.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:51:57.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:51:57.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:51:57.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:51:57.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:51:57.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:51:57.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:51:57.628 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:51:57.687 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:51:37
2026-05-29T13:51:57.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72002, datetime.datetime(2026, 5, 29, 13, 51, 37), datetime.datetime(2026, 5, 29, 13, 51, 36), 'salt', 14.12, 52.21, None, 18.17, 38.03, 9.64, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:51:57.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:51:57.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:51:57.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:51:36, diff=21.693256s, valid=True
2026-05-29T13:51:57.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:51:57.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:51:57.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:52:12, diff=-14.303928s, valid=True
2026-05-29T13:51:57.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:51:57.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:51:57.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:51:28, diff=29.702687s, valid=True
2026-05-29T13:51:57.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:51:57.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:51:57.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:51:57.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:51:57.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:51:57.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:51:57.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:52:12, diff=-14.294305s, valid=True
2026-05-29T13:51:57.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:51:57.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:51:57.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:51:57.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988159.706359s, valid=True
2026-05-29T13:51:57.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:51:57.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:51:57.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:51:57.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:51:57.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:51:57.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:51:57.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:51:57.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:51:57.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:51:57.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:51:57.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:51:57.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:51:57.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:51:58.024 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:51:58.309 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:51:58.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:51:58.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:51:58.760 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:51:58.760 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:51:59.122 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:51:59.122 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:52:29.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:52:29.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:52:29.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:52:29.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:52:29.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:52:29.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:52: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-05-29T13:52:29.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:52:29.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-05-29T13:52:29.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:52:29.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:52:29.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:52:29.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-05-29T13:52:32.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-05-29T13:52:32.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:52:32.074 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:52:32.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:52:32.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:52:32.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:52:32.094 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:52:32.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:52:32.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:52:32.094 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:52:32.094 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:52:32.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:52:32.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:52:32.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:52:32.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:52:32.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:52:32.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:52:32.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:52:32.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:52:32.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:52:32.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:52:32.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:52:32.350 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:52:32.411 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:52:07
2026-05-29T13:52:32.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72003, datetime.datetime(2026, 5, 29, 13, 52, 7), datetime.datetime(2026, 5, 29, 13, 52, 7), 'salt', 14.18, 53.14, None, 16.2, 34.39, 9.39, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:52:32.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:52:32.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:52:32.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:52:07, diff=25.417389s, valid=True
2026-05-29T13:52:32.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:52:32.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:52:32.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:52:12, diff=20.420277s, valid=True
2026-05-29T13:52:32.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:52:32.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:52:32.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:51:59, diff=33.427204s, valid=True
2026-05-29T13:52:32.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:52:32.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:52:32.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:52:32.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:52:32.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:52:32.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:52:32.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:52:12, diff=20.430263s, valid=True
2026-05-29T13:52:32.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:52:32.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:52:32.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:52:32.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988194.430944s, valid=True
2026-05-29T13:52:32.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:52:32.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:52:32.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:52:32.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:52:32.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:52:32.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:52:32.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:52:32.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:52:32.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:52:32.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:52:32.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:52:32.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:52:32.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:52:32.751 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:52:32.969 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:52:33.319 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:52:33.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:52:33.421 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:52:33.421 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:52:33.660 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:52:33.660 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:53:03.671 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:53:03.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:53:03.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:53:03.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:53:03.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:53:04.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:53: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-05-29T13:53:04.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:53:04.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-05-29T13:53:04.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:53:04.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:53:04.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:53:04.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-05-29T13:53:06.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-05-29T13:53:06.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:53:06.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:53:06.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:53:06.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:53:06.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:53:06.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:53:06.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:53:06.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:53:06.613 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:53:06.614 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:53:06.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:53:06.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:53:06.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:53:06.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:53:06.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:53:06.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:53:06.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:53:06.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:53:06.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:53:06.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:53:06.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:53:06.870 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:53:06.932 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:52:37
2026-05-29T13:53:06.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72004, datetime.datetime(2026, 5, 29, 13, 52, 37), datetime.datetime(2026, 5, 29, 13, 52, 37), 'salt', 14.28, 52.48, None, 15.07, 32.91, 9.58, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:53:06.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:53:06.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:53:06.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:52:37, diff=29.938147s, valid=True
2026-05-29T13:53:06.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:53:06.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:53:06.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:53:12, diff=-5.059015s, valid=True
2026-05-29T13:53:06.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:53:06.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:53:06.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:52:31, diff=35.94768s, valid=True
2026-05-29T13:53:06.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:53:06.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:53:06.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:53:06.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:53:06.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:53:06.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:53:06.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:53:12, diff=-5.049302s, valid=True
2026-05-29T13:53:06.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:53:06.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:53:06.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:53:06.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988228.951361s, valid=True
2026-05-29T13:53:06.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:53:06.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:53:06.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:53:06.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:53:06.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:53:07.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:53:07.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:53:07.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:53:07.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:53:07.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:53:07.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:53:07.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:53:07.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:53:07.335 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:53:07.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:53:07.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:53:07.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:53:07.996 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:53:07.997 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:53:08.266 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:53:08.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:53:38.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:53:38.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:53:38.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:53:38.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:53:38.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:53:38.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:53:38.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-05-29T13:53:38.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:53: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-05-29T13:53:38.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:53:38.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:53:38.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:53:38.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T13:53:41.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-05-29T13:53:41.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:53:41.169 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:53:41.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:53:41.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:53:41.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:53:41.190 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:53:41.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:53:41.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:53:41.190 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:53:41.190 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:53:41.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:53:41.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:53:41.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:53:41.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:53:41.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:53:41.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:53:41.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:53:41.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:53:41.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:53:41.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:53:41.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:53:41.439 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:53:41.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:53:38
2026-05-29T13:53:41.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72006, datetime.datetime(2026, 5, 29, 13, 53, 38), datetime.datetime(2026, 5, 29, 13, 53, 37), 'salt', 14.51, 51.82, None, 14.4, 32.68, 9.77, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:53:41.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:53:41.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:53:41.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:53:37, diff=4.505191s, valid=True
2026-05-29T13:53:41.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:53:41.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:53:41.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:54:12, diff=-30.491969s, valid=True
2026-05-29T13:53:41.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:53:41.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:53:41.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:53:34, diff=7.514798s, valid=True
2026-05-29T13:53:41.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:53:41.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:53:41.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:53:41.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:53:41.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:53:41.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:53:41.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:54:12, diff=-30.482209s, valid=True
2026-05-29T13:53:41.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:53:41.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:53:41.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:53:41.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988263.518448s, valid=True
2026-05-29T13:53:41.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:53:41.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:53:41.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:53:41.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:53:41.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:53:41.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:53:41.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:53:41.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:53:41.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:53:41.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:53:41.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:53:41.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:53:41.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:53:41.836 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:53:42.050 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:53:42.396 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:53:42.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:53:42.498 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:53:42.498 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:53:42.661 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:53:42.661 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:54:12.690 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:54:12.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:54:12.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:54:13.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:54:13.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:54:13.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:54:13.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-05-29T13:54:13.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:54:13.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-05-29T13:54:13.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:54:13.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:54:13.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:54:13.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-05-29T13:54:15.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-05-29T13:54:15.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:54:15.985 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:54:15.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:54:15.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:54:16.005 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:54:16.006 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:54:16.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:54:16.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:54:16.006 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:54:16.006 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:54:16.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:54:16.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:54:16.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:54:16.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:54:16.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:54:16.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:54:16.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:54:16.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:54:16.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:54:16.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:54:16.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:54:16.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:54:16.331 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:54:08
2026-05-29T13:54:16.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72007, datetime.datetime(2026, 5, 29, 13, 54, 8), datetime.datetime(2026, 5, 29, 13, 54, 8), 'salt', 14.68, 50.26, None, 17.93, 31.06, 10.23, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:54:16.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:54:16.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:54:16.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:54:08, diff=8.337712s, valid=True
2026-05-29T13:54:16.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:54:16.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:54:16.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:54:12, diff=4.340477s, valid=True
2026-05-29T13:54:16.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:54:16.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:54:16.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:54:05, diff=11.34705s, valid=True
2026-05-29T13:54:16.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:54:16.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:54:16.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:54:16.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:54:16.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:54:16.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:54:16.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:54:12, diff=4.35003s, valid=True
2026-05-29T13:54:16.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:54:16.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:54:16.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:54:16.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988298.350688s, valid=True
2026-05-29T13:54:16.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:54:16.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:54:16.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:54:16.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:54:16.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:54:16.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:54:16.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:54:16.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:54:16.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:54:16.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:54:16.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:54:16.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:54:16.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:54:16.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:54:16.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:54:17.312 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:54:17.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:54:17.417 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:54:17.417 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:54:17.582 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:54:17.583 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:54:47.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:54:47.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:54:47.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:54:48.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:54:48.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:54:48.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:54:48.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-05-29T13:54:48.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:54:48.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T13:54:48.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:54:48.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:54:48.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:54:48.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-05-29T13:54:50.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-05-29T13:54:50.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:54:50.750 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:54:50.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:54:50.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:54:50.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:54:50.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:54:50.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:54:50.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:54:50.770 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:54:50.770 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:54:50.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:54:50.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:54:50.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:54:50.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:54:50.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:54:50.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:54:50.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:54:51.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:54:51.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:54:51.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:54:51.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:54:51.026 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:54:51.093 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:54:38
2026-05-29T13:54:51.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72008, datetime.datetime(2026, 5, 29, 13, 54, 38), datetime.datetime(2026, 5, 29, 13, 54, 38), 'salt', 14.78, 50.99, None, 14.22, 50.22, 10.03, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:54:51.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:54:51.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:54:51.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:54:38, diff=13.099653s, valid=True
2026-05-29T13:54:51.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:54:51.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:54:51.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:55:12, diff=-20.897507s, valid=True
2026-05-29T13:54:51.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:54:51.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:54:51.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:54:37, diff=14.109196s, valid=True
2026-05-29T13:54:51.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:54:51.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:54:51.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:54:51.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:54:51.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:54:51.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:54:51.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:55:12, diff=-20.887742s, valid=True
2026-05-29T13:54:51.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:54:51.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:54:51.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:54:51.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988333.11293s, valid=True
2026-05-29T13:54:51.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:54:51.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:54:51.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:54:51.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:54:51.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:54:51.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:54:51.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:54:51.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:54:51.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:54:51.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:54:51.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:54:51.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:54:51.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:54:51.426 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:54:51.656 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:54:52.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:54:52.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:54:52.103 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:54:52.104 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:54:52.358 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:54:52.358 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:55:22.388 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:55:22.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:55:22.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:55:22.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:55:22.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:55:23.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:55:23.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T13:55:23.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:55:23.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-05-29T13:55:23.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:55:23.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:55:23.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:55:23.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-05-29T13:55:26.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-05-29T13:55:26.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:55:26.089 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:55:26.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:55:26.097 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:55:26.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:55:26.109 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:55:26.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:55:26.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:55:26.109 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:55:26.110 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:55:26.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:55:26.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:55:26.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:55:26.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:55:26.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:55:26.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:55:26.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:55:26.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:55:26.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:55:26.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:55:26.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:55:26.360 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:55:26.419 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:55:08
2026-05-29T13:55:26.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72009, datetime.datetime(2026, 5, 29, 13, 55, 8), datetime.datetime(2026, 5, 29, 13, 55, 8), 'salt', 14.88, 49.23, None, 21.24, 46.75, 10.54, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:55:26.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:55:26.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:55:26.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:55:08, diff=18.425991s, valid=True
2026-05-29T13:55:26.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:55:26.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:55:26.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:55:12, diff=14.428825s, valid=True
2026-05-29T13:55:26.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:55:26.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:55:26.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:55:08, diff=18.435549s, valid=True
2026-05-29T13:55:26.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:55:26.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:55:26.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:55:26.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:55:26.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:55:26.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:55:26.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:55:12, diff=14.438583s, valid=True
2026-05-29T13:55:26.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:55:26.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:55:26.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:55:26.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988368.439255s, valid=True
2026-05-29T13:55:26.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:55:26.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:55:26.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:55:26.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:55:26.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:55:26.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:55:26.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:55:26.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:55:26.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:55:26.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:55:26.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:55:26.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:55:26.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:55:26.831 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:55:27.045 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:55:27.389 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:55:27.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:55:27.491 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:55:27.491 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:55:27.660 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:55:27.660 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:55:57.660 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:55:57.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:55:57.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:55:57.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:55:57.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:55:58.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:55:58.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-05-29T13:55:58.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:55:58.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-05-29T13:55:58.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:55:58.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:55:58.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:55:58.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-05-29T13:56:00.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-05-29T13:56:00.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:56:00.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:56:00.754 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:56:00.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:56:00.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:56:00.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:56:00.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:56:00.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:56:00.775 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:56:00.775 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:56:00.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:56:00.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:56:00.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:56:00.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:56:00.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:56:00.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:56:00.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:56:01.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:56:01.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:56:01.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:56:01.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:56:01.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:56:01.095 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:55:39
2026-05-29T13:56:01.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72010, datetime.datetime(2026, 5, 29, 13, 55, 39), datetime.datetime(2026, 5, 29, 13, 55, 38), 'salt', 14.81, 49.2, None, 19.65, 45.67, 10.54, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:56:01.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:56:01.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:56:01.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:55:38, diff=23.101717s, valid=True
2026-05-29T13:56:01.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:56:01.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:56:01.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:56:12, diff=-10.895343s, valid=True
2026-05-29T13:56:01.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:56:01.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:56:01.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:55:30, diff=31.111527s, valid=True
2026-05-29T13:56:01.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:56:01.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:56:01.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:56:01.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:56:01.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:56:01.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:56:01.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:56:12, diff=-10.885394s, valid=True
2026-05-29T13:56:01.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:56:01.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:56:01.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:56:01.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988403.11527s, valid=True
2026-05-29T13:56:01.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:56:01.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:56:01.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:56:01.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:56:01.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:56:01.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:56:01.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:56:01.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:56:01.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:56:01.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:56:01.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:56:01.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:56:01.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:56:01.548 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:56:01.769 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:56:02.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:56:02.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:56: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-05-29T13:56: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-05-29T13:56:02.525 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:56:02.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:56:32.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:56:32.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:56:32.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:56:33.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:56:33.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:56:33.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:56:33.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-05-29T13:56:33.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:56:33.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-05-29T13:56:33.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:56:33.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:56:33.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:56:33.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-05-29T13:56:35.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-05-29T13:56:35.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:56:35.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:56:35.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:56:35.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:56:35.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:56:35.790 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:56:35.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:56:35.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:56:35.791 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:56:35.791 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:56:35.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:56:35.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T13:56:35.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:56:35.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T13:56:35.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:56:36.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:56:36.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:56:36.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:56:36.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:56:36.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:56:36.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:56:36.051 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:56:36.111 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:56:09
2026-05-29T13:56:36.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72011, datetime.datetime(2026, 5, 29, 13, 56, 9), datetime.datetime(2026, 5, 29, 13, 56, 8), 'salt', 14.61, 50.76, None, 24.84, 38.17, 10.08, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:56:36.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:56:36.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T13:56:36.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:56:08, diff=28.117962s, valid=True
2026-05-29T13:56:36.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:56:36.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:56:36.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:56:12, diff=24.120832s, valid=True
2026-05-29T13:56:36.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:56:36.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T13:56:36.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:56:01, diff=35.127609s, valid=True
2026-05-29T13:56:36.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:56:36.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:56:36.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:56:36.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:56:36.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:56:36.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:56:36.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:56:12, diff=24.13086s, valid=True
2026-05-29T13:56:36.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:56:36.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:56:36.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:56:36.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988438.131534s, valid=True
2026-05-29T13:56:36.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:56:36.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:56:36.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:56:36.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:56:36.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:56:36.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:56:36.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:56:36.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:56:36.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:56:36.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:56:36.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:56:36.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:56:36.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:56:36.457 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:56:36.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:56:37.045 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:56:37.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:56: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-05-29T13:56: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-05-29T13:56:37.321 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:56:37.321 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:57:07.350 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:57:07.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:57:07.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:57:07.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:57:07.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:57:08.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:57: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-05-29T13:57:08.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:57:08.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-05-29T13:57:08.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:57:08.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:57:08.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:57:08.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-05-29T13:57:11.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-05-29T13:57:11.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:57:11.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:57:11.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:57:11.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:57:11.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:57:11.340 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:57:11.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:57:11.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:57:11.340 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:57:11.340 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:57:11.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:57:11.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:57:11.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:57:11.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:57:11.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:57:11.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:57:11.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:57:11.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:57:11.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:57:11.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:57:11.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:57:11.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:57:11.654 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:57:09
2026-05-29T13:57:11.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72013, datetime.datetime(2026, 5, 29, 13, 57, 9), datetime.datetime(2026, 5, 29, 13, 57, 9), 'salt', 14.84, 50.89, None, 22.65, 35.07, 10.06, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:57:11.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:57:11.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:57:11.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:57:09, diff=2.660506s, valid=True
2026-05-29T13:57:11.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:57:11.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:57:11.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:57:12, diff=-0.336053s, valid=True
2026-05-29T13:57:11.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:57:11.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:57:11.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:57:04, diff=7.670568s, valid=True
2026-05-29T13:57:11.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:57:11.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:57:11.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:57:11.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:57:11.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:57:11.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:57:11.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:57:12, diff=-0.326349s, valid=True
2026-05-29T13:57:11.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:57:11.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:57:11.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:57:11.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988473.674323s, valid=True
2026-05-29T13:57:11.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:57:11.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:57:11.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:57:11.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:57:11.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:57:11.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:57:11.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:57:11.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:57:11.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:57:11.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:57:11.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:57:11.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:57:11.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:57:11.991 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:57:12.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:57:12.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:57:12.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:57:12.651 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:57:12.651 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:57:12.816 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:57:12.816 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:57:42.841 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:57:42.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:57:42.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:57:43.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:57:43.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:57:43.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:57:43.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-05-29T13:57:43.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:57:43.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-05-29T13:57:43.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:57:43.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:57:43.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:57:43.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-05-29T13:57:46.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-05-29T13:57:46.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:57:46.889 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:57:46.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:57:46.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:57:46.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:57:46.909 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:57:46.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:57:46.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:57:46.910 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:57:46.910 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:57:46.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:57:46.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:57:46.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:57:47.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:57:47.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:57:47.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:57:47.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:57:47.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:57:47.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:57:47.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:57:47.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:57:47.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:57:47.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:57:39
2026-05-29T13:57:47.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72014, datetime.datetime(2026, 5, 29, 13, 57, 39), datetime.datetime(2026, 5, 29, 13, 57, 39), 'salt', 14.91, 49.96, None, 23.96, 29.72, 10.33, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:57:47.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:57:47.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:57:47.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:57:39, diff=8.238472s, valid=True
2026-05-29T13:57:47.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:57:47.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:57:47.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:58:12, diff=-24.758647s, valid=True
2026-05-29T13:57:47.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:57:47.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:57:47.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:57:35, diff=12.248084s, valid=True
2026-05-29T13:57:47.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:57:47.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:57:47.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:57:47.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:57:47.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:57:47.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:57:47.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:58:12, diff=-24.748791s, valid=True
2026-05-29T13:57:47.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:57:47.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:57:47.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:57:47.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988509.251886s, valid=True
2026-05-29T13:57:47.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:57:47.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:57:47.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:57:47.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:57:47.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:57:47.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:57:47.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:57:47.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:57:47.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:57:47.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:57:47.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:57:47.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:57:47.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:57:47.573 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:57:47.804 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:57:48.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:57:48.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:57:48.247 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:57:48.247 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:57:48.705 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:57:48.705 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:58:18.735 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:58:18.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:58:18.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:58:19.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:58:19.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:58:19.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:58:19.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-05-29T13:58:19.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:58:19.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-05-29T13:58:19.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:58:19.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:58:19.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:58:19.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-05-29T13:58:21.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-05-29T13:58:21.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:58:21.898 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:58:21.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:58:21.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:58:21.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:58:21.919 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:58:21.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:58:21.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:58:21.919 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:58:21.919 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:58:21.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:58:22.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:58:22.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:58:22.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:58:22.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:58:22.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:58:22.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:58:22.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:58:22.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:58:22.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:58:22.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:58:22.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:58:22.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:58:10
2026-05-29T13:58:22.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72015, datetime.datetime(2026, 5, 29, 13, 58, 10), datetime.datetime(2026, 5, 29, 13, 58, 9), 'salt', 14.94, 50.39, None, 19.05, 49.68, 10.2, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:58:22.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:58:22.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:58:22.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:58:09, diff=13.249715s, valid=True
2026-05-29T13:58:22.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:58:22.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:58:22.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:58:12, diff=10.252506s, valid=True
2026-05-29T13:58:22.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:58:22.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:58:22.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:58:06, diff=16.259052s, valid=True
2026-05-29T13:58:22.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:58:22.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:58:22.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:58:22.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:58:22.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:58:22.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:58:22.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:58:12, diff=10.262038s, valid=True
2026-05-29T13:58:22.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:58:22.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:58:22.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:58:22.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988544.262726s, valid=True
2026-05-29T13:58:22.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:58:22.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:58:22.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:58:22.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:58:22.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:58:22.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:58:22.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:58:22.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:58:22.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:58:22.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:58:22.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:58:22.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:58:22.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:58:22.591 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:58:22.816 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:58:23.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:58:23.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:58:23.324 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:58:23.324 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:58:23.494 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:58:23.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:58:53.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:58:53.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:58:53.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:58:53.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:58:53.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:58:54.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:58:54.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-05-29T13:58:54.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:58:54.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-05-29T13:58:54.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:58:54.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:58:54.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:58:54.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-05-29T13:58:57.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-05-29T13:58:57.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:58:57.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:58:57.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:58:57.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:58:57.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:58:57.262 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:58:57.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:58:57.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:58:57.262 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:58:57.262 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:58:57.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:58:57.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:58:57.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:58:57.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:58:57.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:58:57.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:58:57.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:58:57.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T13:58:57.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:58:57.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:58:57.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:58:57.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:58:57.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:58:40
2026-05-29T13:58:57.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72016, datetime.datetime(2026, 5, 29, 13, 58, 40), datetime.datetime(2026, 5, 29, 13, 58, 40), 'salt', 14.78, 50.03, None, 19.58, 46.12, 10.3, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:58:57.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:58:57.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:58:57.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:58:40, diff=17.584365s, valid=True
2026-05-29T13:58:57.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:58:57.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:58:57.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:59:12, diff=-14.410973s, valid=True
2026-05-29T13:58:57.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:58:57.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:58:57.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:58:38, diff=19.595703s, valid=True
2026-05-29T13:58:57.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:58:57.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:58:57.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:58:57.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:58:57.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:58:57.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T13:58:57.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:59:12, diff=-14.401277s, valid=True
2026-05-29T13:58:57.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:58:57.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:58:57.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:58:57.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988579.599389s, valid=True
2026-05-29T13:58:57.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:58:57.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:58:57.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:58:57.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:58:57.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:58:57.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:58:57.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:58:57.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:58:57.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:58:57.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:58:57.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:58:57.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:58:57.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:58:57.960 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:58:58.193 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:58:58.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:58:58.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:58:58.648 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:58:58.648 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:58:58.857 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:58:58.857 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T13:59:28.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T13:59:28.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T13:59:28.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T13:59:29.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T13:59:29.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T13:59:29.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T13:59:29.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T13:59:29.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T13:59:29.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-05-29T13:59:29.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T13:59:29.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T13:59:29.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T13:59:29.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-05-29T13:59:32.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-05-29T13:59:32.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T13:59:32.248 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T13:59:32.248 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T13:59:32.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T13:59:32.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T13:59:32.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T13:59:32.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T13:59:32.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T13:59:32.268 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T13:59:32.268 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T13:59:32.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T13:59:32.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T13:59:32.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T13:59:32.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T13:59:32.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:59:32.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:59:32.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T13:59:32.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T13:59:32.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T13:59:32.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T13:59:32.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T13:59:32.519 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T13:59:32.576 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:59:10
2026-05-29T13:59:32.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72017, datetime.datetime(2026, 5, 29, 13, 59, 10), datetime.datetime(2026, 5, 29, 13, 59, 10), 'salt', 14.35, 50.89, None, 24.38, 47.36, 10.03, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T13:59:32.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T13:59:32.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T13:59:32.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:59:10, diff=22.583041s, valid=True
2026-05-29T13:59:32.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T13:59:32.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:59:32.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:59:12, diff=20.585852s, valid=True
2026-05-29T13:59:32.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T13:59:32.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T13:59:32.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:59:09, diff=23.592435s, valid=True
2026-05-29T13:59:32.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T13:59:32.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:59:32.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T13:59:32.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T13:59:32.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T13:59:32.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T13:59:32.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:59:12, diff=20.595455s, valid=True
2026-05-29T13:59:32.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T13:59:32.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T13:59:32.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T13:59:32.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988614.596116s, valid=True
2026-05-29T13:59:32.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T13:59:32.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T13:59:32.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T13:59:32.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T13:59:32.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T13:59:32.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T13:59:32.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T13:59:32.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T13:59:32.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T13:59:32.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T13:59:32.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T13:59:32.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T13:59:32.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T13:59:32.909 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T13:59:33.192 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:59:33.534 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T13:59:33.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T13:59:33.635 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T13:59:33.635 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T13:59:33.844 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T13:59:33.844 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:00:03.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:00:03.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:00:03.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:00:04.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:00:04.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:00:04.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:00: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-05-29T14:00:04.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:00: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-05-29T14:00:04.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:00:04.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:00:04.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:00:04.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-05-29T14:00:07.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-05-29T14:00:07.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:00:07.153 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:00:07.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:00:07.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:00:07.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:00:07.174 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:00:07.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:00:07.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:00:07.175 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:00:07.175 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:00:07.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:00:07.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T14:00:07.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:00:07.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T14:00:07.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:00:07.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:00:07.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:00:07.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:00:07.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:00:07.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:00:07.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:00:07.435 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:00:07.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 13:59:40
2026-05-29T14:00:07.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72018, datetime.datetime(2026, 5, 29, 13, 59, 40), datetime.datetime(2026, 5, 29, 13, 59, 40), 'salt', 14.38, 50.92, None, 21.17, 46.73, 10.02, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:00:07.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:00:07.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T14:00:07.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:59:40, diff=27.526888s, valid=True
2026-05-29T14:00:07.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:00:07.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:00:07.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:00:12, diff=-4.470174s, valid=True
2026-05-29T14:00:07.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:00:07.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T14:00:07.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 13:59:32, diff=35.536481s, valid=True
2026-05-29T14:00:07.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:00:07.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:00:07.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:00:07.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:00:07.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:00:07.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:00:07.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:00:12, diff=-4.460472s, valid=True
2026-05-29T14:00:07.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:00:07.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:00:07.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:00:07.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988649.540198s, valid=True
2026-05-29T14:00:07.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:00:07.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:00:07.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:00:07.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:00:07.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:00:07.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:00:07.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:00:07.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:00:07.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:00:07.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:00:07.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:00:07.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:00:07.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:00:07.859 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:00:08.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:00:08.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:00:08.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:00:08.516 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:00:08.516 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:00:08.765 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:00:08.765 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:00:38.796 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:00:38.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:00:38.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:00:39.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:00:39.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:00:39.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:00:39.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-05-29T14:00:39.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:00:39.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-05-29T14:00:39.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:00:39.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:00:39.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:00:39.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T14:00:42.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T14:00:42.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:00:42.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:00:42.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:00:42.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:00:42.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:00:42.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:00:42.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:00:42.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:00:42.278 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:00:42.278 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:00:42.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:00:42.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:00:42.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:00:42.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:00:42.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:00:42.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:00:42.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:00:42.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:00:42.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:00:42.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:00:42.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:00:42.534 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:00:42.593 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:00:41
2026-05-29T14:00:42.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72020, datetime.datetime(2026, 5, 29, 14, 0, 41), datetime.datetime(2026, 5, 29, 14, 0, 40), 'salt', 14.65, 50.03, None, 23.89, 40.49, 10.29, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:00:42.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:00:42.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:00:42.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:00:40, diff=2.600063s, valid=True
2026-05-29T14:00:42.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:00:42.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:00:42.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:01:12, diff=-29.397141s, valid=True
2026-05-29T14:00:42.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:00:42.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:00:42.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:00:33, diff=9.609457s, valid=True
2026-05-29T14:00:42.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:00:42.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:00:42.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:00:42.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:00:42.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:00:42.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:00:42.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:01:12, diff=-29.387512s, valid=True
2026-05-29T14:00:42.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:00:42.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:00:42.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:00:42.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988684.61316s, valid=True
2026-05-29T14:00:42.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:00:42.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:00:42.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:00:42.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:00:42.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:00:42.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:00:42.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:00:42.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:00:42.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:00:42.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:00:42.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:00:42.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:00:42.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:00:42.999 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:00:43.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:00:43.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:00:43.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:00:43.670 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:00:43.670 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:00:43.922 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:00:43.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:01:13.927 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:01:13.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:01:13.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:01:14.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:01:14.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:01:14.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:01:14.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-05-29T14:01:14.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:01:14.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-05-29T14:01:14.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:01:14.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:01:14.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:01:14.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-05-29T14:01:17.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-05-29T14:01:17.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:01:17.138 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:01:17.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:01:17.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:01:17.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:01:17.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:01:17.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:01:17.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:01:17.158 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:01:17.158 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:01:17.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:01:17.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:01:17.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:01:17.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:01:17.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:01:17.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:01:17.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:01:17.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:01:17.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:01:17.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:01:17.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:01:17.423 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:01:17.480 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:01:11
2026-05-29T14:01:17.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72021, datetime.datetime(2026, 5, 29, 14, 1, 11), datetime.datetime(2026, 5, 29, 14, 1, 11), 'salt', 14.58, 48.04, None, 21.49, 42.81, 10.86, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:01:17.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:01:17.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:01:17.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:01:11, diff=6.486533s, valid=True
2026-05-29T14:01:17.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:01:17.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:01:17.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:01:12, diff=5.489345s, valid=True
2026-05-29T14:01:17.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:01:17.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:01:17.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:01:04, diff=13.496081s, valid=True
2026-05-29T14:01:17.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:01:17.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:01:17.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:01:17.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:01:17.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:01:17.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:01:17.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:01:12, diff=5.499081s, valid=True
2026-05-29T14:01:17.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:01:17.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:01:17.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:01:17.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988719.499743s, valid=True
2026-05-29T14:01:17.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:01:17.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:01:17.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:01:17.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:01:17.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:01:17.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:01:17.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:01:17.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:01:17.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:01:17.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:01:17.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:01:17.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:01:17.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:01:17.813 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:01:18.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:01:18.365 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:01:18.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:01:18.466 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:01:18.466 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:01:18.637 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:01:18.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:01:48.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:01:48.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:01:48.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:01:48.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:01:48.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:01:49.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:01:49.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-05-29T14:01:49.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:01:49.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T14:01:49.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:01:49.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:01:49.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:01:49.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-05-29T14:01:52.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-05-29T14:01:52.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:01:52.063 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:01:52.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:01:52.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:01:52.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:01:52.085 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:01:52.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:01:52.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:01:52.085 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:01:52.085 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:01:52.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:01:52.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:01:52.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:01:52.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:01:52.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:01:52.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:01:52.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:01:52.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:01:52.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:01:52.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:01:52.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:01:52.350 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:01:52.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:01:41
2026-05-29T14:01:52.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72022, datetime.datetime(2026, 5, 29, 14, 1, 41), datetime.datetime(2026, 5, 29, 14, 1, 41), 'salt', 14.45, 47.9, None, 19.41, 41.05, 10.89, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:01:52.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:01:52.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:01:52.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:01:41, diff=11.414485s, valid=True
2026-05-29T14:01:52.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:01:52.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:01:52.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:02:12, diff=-19.582673s, valid=True
2026-05-29T14:01:52.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:01:52.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:01:52.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:01:36, diff=16.423883s, valid=True
2026-05-29T14:01:52.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:01:52.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:01:52.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:01:52.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:01:52.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:01:52.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:01:52.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:02:12, diff=-19.573069s, valid=True
2026-05-29T14:01:52.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:01:52.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:01:52.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:01:52.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988754.427593s, valid=True
2026-05-29T14:01:52.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:01:52.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:01:52.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:01:52.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:01:52.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:01:52.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:01:52.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:01:52.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:01:52.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:01:52.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:01:52.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:01:52.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:01:52.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:01:52.805 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:01:53.016 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:01:53.358 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:01:53.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:01:53.458 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:01:53.458 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:01:53.648 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:01:53.648 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:02:23.679 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:02:23.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:02:23.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:02:24.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:02:24.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:02:24.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:02:24.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-05-29T14:02:24.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:02:24.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-05-29T14:02:24.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:02:24.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:02:24.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:02:24.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-05-29T14:02:27.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-05-29T14:02:27.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:02:27.475 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:02:27.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:02:27.483 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:02:27.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:02:27.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:02:27.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:02:27.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:02:27.495 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:02:27.495 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:02:27.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:02:27.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:02:27.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:02:27.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:02:27.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:02:27.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:02:27.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:02:27.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:02:27.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:02:27.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:02:27.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:02:27.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:02:27.829 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:02:11
2026-05-29T14:02:27.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72023, datetime.datetime(2026, 5, 29, 14, 2, 11), datetime.datetime(2026, 5, 29, 14, 2, 11), 'salt', 14.55, 49.43, None, 23.64, 31.06, 10.46, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:02:27.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:02:27.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:02:27.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:02:11, diff=16.835973s, valid=True
2026-05-29T14:02:27.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:02:27.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:02:27.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:02:12, diff=15.838796s, valid=True
2026-05-29T14:02:27.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:02:27.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:02:27.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:02:08, diff=19.84546s, valid=True
2026-05-29T14:02:27.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:02:27.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:02:27.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:02:27.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:02:27.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:02:27.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:02:27.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:02:12, diff=15.848503s, valid=True
2026-05-29T14:02:27.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:02:27.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:02:27.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:02:27.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988789.849174s, valid=True
2026-05-29T14:02:27.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:02:27.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:02:27.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:02:27.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:02:27.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:02:27.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:02:27.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:02:27.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:02:27.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:02:27.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:02:28.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:02:28.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:02:28.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:02:28.172 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:02:28.382 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:02:28.735 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:02:28.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:02:28.834 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:02:28.834 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:02:28.999 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:02:29.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:02:59.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:02:59.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:02:59.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:02:59.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:02:59.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:02:59.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:02:59.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-05-29T14:02:59.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:02:59.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-05-29T14:02:59.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:02:59.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:02:59.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:02:59.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-05-29T14:03:02.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-05-29T14:03:02.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:03:02.250 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:03:02.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:03:02.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:03:02.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:03:02.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:03:02.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:03:02.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:03:02.272 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:03:02.272 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:03:02.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:03:02.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:03:02.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:03:02.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:03:02.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:03:02.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:03:02.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:03:02.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:03:02.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:03:02.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:03:02.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:03:02.533 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:03:02.591 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:02:42
2026-05-29T14:03:02.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72024, datetime.datetime(2026, 5, 29, 14, 2, 42), datetime.datetime(2026, 5, 29, 14, 2, 41), 'salt', 14.64, 48.07, None, 22.62, 27.42, 10.85, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:03:02.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:03:02.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:03:02.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:02:41, diff=21.597948s, valid=True
2026-05-29T14:03:02.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:03:02.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:03:02.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:03:12, diff=-9.399209s, valid=True
2026-05-29T14:03:02.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:03:02.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:03:02.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:02:39, diff=23.607386s, valid=True
2026-05-29T14:03:02.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:03:02.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:03:02.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:03:02.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:03:02.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:03:02.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:03:02.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:03:12, diff=-9.389588s, valid=True
2026-05-29T14:03:02.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:03:02.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:03:02.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:03:02.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988824.611071s, valid=True
2026-05-29T14:03:02.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:03:02.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:03:02.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:03:02.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:03:02.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:03:02.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:03:02.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:03:02.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:03:02.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:03:02.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:03:02.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:03:02.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:03:02.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:03:02.926 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:03:03.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:03:03.524 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:03:03.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:03:03.630 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:03:03.631 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:03:03.878 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:03:03.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:03:33.908 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:03:33.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:03:33.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:03:34.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:03:34.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:03:34.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:03:34.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-05-29T14:03:34.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:03:34.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-05-29T14:03:34.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:03:34.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:03:34.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:03:34.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-05-29T14:03:36.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-05-29T14:03:36.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:03:36.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:03:36.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:03:36.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:03:36.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:03:36.845 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:03:36.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:03:36.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:03:36.846 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:03:36.846 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:03:36.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:03:36.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:03:36.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:03:37.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:03:37.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:03:37.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:03:37.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:03:37.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:03:37.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:03:37.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:03:37.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:03:37.108 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:03:37.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:03:12
2026-05-29T14:03:37.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72025, datetime.datetime(2026, 5, 29, 14, 3, 12), datetime.datetime(2026, 5, 29, 14, 3, 11), 'salt', 14.74, 47.44, None, 23.89, 29.32, 11.05, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:03:37.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:03:37.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:03:37.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:03:11, diff=26.173005s, valid=True
2026-05-29T14:03:37.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:03:37.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:03:37.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:03:12, diff=25.175852s, valid=True
2026-05-29T14:03:37.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:03:37.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:03:37.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:03:10, diff=27.18255s, valid=True
2026-05-29T14:03:37.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:03:37.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:03:37.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:03:37.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:03:37.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:03:37.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:03:37.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:03:12, diff=25.185596s, valid=True
2026-05-29T14:03:37.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:03:37.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:03:37.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:03:37.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988859.186255s, valid=True
2026-05-29T14:03:37.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:03:37.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:03:37.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:03:37.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:03:37.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:03:37.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:03:37.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:03:37.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:03:37.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:03:37.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:03:37.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:03:37.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:03:37.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:03:37.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:03:37.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:03:38.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:03:38.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:03:38.151 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:03:38.151 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:03:38.322 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:03:38.322 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:04:08.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:04:08.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:04:08.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:04:08.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:04:08.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:04:09.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:04:09.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-05-29T14:04:09.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:04:09.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-05-29T14:04:09.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:04:09.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:04:09.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:04:09.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-05-29T14:04:11.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-05-29T14:04:11.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:04:11.530 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:04:11.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:04:11.539 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:04:11.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:04:11.552 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:04:11.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:04:11.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:04:11.552 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:04:11.552 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:04:11.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:04:11.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T14:04:11.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:04:11.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T14:04:11.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:04:11.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:04:11.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:04:11.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:04:11.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:04:11.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:04:11.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:04:11.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:04:11.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:03:42
2026-05-29T14:04:11.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72026, datetime.datetime(2026, 5, 29, 14, 3, 42), datetime.datetime(2026, 5, 29, 14, 3, 42), 'salt', 14.84, 47.27, None, 20.85, 32.91, 11.11, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:04:11.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:04:11.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T14:04:11.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:03:42, diff=29.930986s, valid=True
2026-05-29T14:04:11.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:04:11.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:04:11.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:04:12, diff=-0.066142s, valid=True
2026-05-29T14:04:11.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:04:11.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T14:04:11.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:03:42, diff=29.94129s, valid=True
2026-05-29T14:04:11.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:04:11.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:04:11.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:04:11.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:04:11.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:04:11.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:04:11.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:04:12, diff=-0.055564s, valid=True
2026-05-29T14:04:11.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:04:11.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:04:11.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:04:11.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988893.945103s, valid=True
2026-05-29T14:04:11.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:04:11.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:04:11.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:04:11.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:04:11.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:04:12.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:04:12.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:04:12.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:04:12.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:04:12.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:04:12.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:04:12.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:04:12.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:04:12.260 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:04:12.471 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:04:12.817 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:04:12.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:04:12.917 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:04:12.917 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:04:13.919 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:04:13.920 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:04:43.949 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:04:43.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:04:43.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:04:44.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:04:44.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:04:44.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:04:44.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-05-29T14:04:44.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:04:44.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-05-29T14:04:44.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:04:44.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:04:44.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:04:44.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-05-29T14:04:47.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-05-29T14:04:47.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:04:47.245 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:04:47.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:04:47.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:04:47.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:04:47.265 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:04:47.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:04:47.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:04:47.265 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:04:47.265 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:04:47.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:04:47.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:04:47.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:04:47.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:04:47.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:04:47.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:04:47.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:04:47.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:04:47.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:04:47.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:04:47.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:04:47.537 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:04:47.599 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:04:43
2026-05-29T14:04:47.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72028, datetime.datetime(2026, 5, 29, 14, 4, 43), datetime.datetime(2026, 5, 29, 14, 4, 42), 'salt', 14.98, 48.73, None, 20.43, 19.36, 10.69, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:04:47.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:04:47.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:04:47.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:04:42, diff=5.605889s, valid=True
2026-05-29T14:04:47.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:04:47.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:04:47.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:05:12, diff=-24.391271s, valid=True
2026-05-29T14:04:47.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:04:47.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:04:47.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:04:35, diff=12.615335s, valid=True
2026-05-29T14:04:47.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:04:47.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:04:47.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:04:47.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:04:47.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:04:47.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:04:47.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:05:12, diff=-24.381594s, valid=True
2026-05-29T14:04:47.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:04:47.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:04:47.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:04:47.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988929.619078s, valid=True
2026-05-29T14:04:47.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:04:47.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:04:47.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:04:47.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:04:47.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:04:47.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:04:47.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:04:47.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:04:47.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:04:47.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:04:47.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:04:47.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:04:47.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:04:47.946 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:04:48.159 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:04:48.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:04:48.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:04:48.673 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:04:48.673 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:04:48.921 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:04:48.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:05:18.944 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:05:18.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:05:18.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:05:19.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:05:19.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:05:19.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:05:19.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-05-29T14:05:19.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:05:19.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-05-29T14:05:19.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:05:19.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:05:19.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:05:19.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-05-29T14:05:22.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-05-29T14:05:22.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:05:22.328 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:05:22.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:05:22.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:05:22.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:05:22.348 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:05:22.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:05:22.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:05:22.349 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:05:22.349 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:05:22.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:05:22.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:05:22.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:05:22.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:05:22.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:05:22.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:05:22.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:05:22.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:05:22.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:05:22.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:05:22.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:05:22.619 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:05:22.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:05:13
2026-05-29T14:05:22.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72029, datetime.datetime(2026, 5, 29, 14, 5, 13), datetime.datetime(2026, 5, 29, 14, 5, 12), 'salt', 15.04, 48.14, None, 20.61, 23.7, 10.87, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:05:22.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:05:22.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:05:22.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:05:12, diff=10.686569s, valid=True
2026-05-29T14:05:22.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:05:22.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:05:22.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:05:12, diff=10.689462s, valid=True
2026-05-29T14:05:22.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:05:22.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:05:22.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:05:06, diff=16.696194s, valid=True
2026-05-29T14:05:22.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:05:22.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:05:22.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:05:22.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:05:22.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:05:22.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:05:22.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:05:12, diff=10.699297s, valid=True
2026-05-29T14:05:22.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:05:22.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:05:22.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:05:22.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988964.699961s, valid=True
2026-05-29T14:05:22.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:05:22.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:05:22.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:05:22.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:05:22.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:05:22.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:05:22.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:05:22.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:05:22.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:05:22.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:05:22.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:05:22.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:05:22.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:05:23.014 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:05:23.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:05:23.568 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:05:23.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:05:23.669 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:05:23.669 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:05:23.919 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:05:23.919 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:05:53.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:05:53.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:05:53.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:05:54.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:05:54.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:05:54.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:05:54.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-05-29T14:05:54.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:05:54.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-05-29T14:05:54.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:05:54.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:05:54.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:05:54.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-05-29T14:05:57.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-05-29T14:05:57.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:05:57.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:05:57.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:05:57.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:05:57.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:05:57.222 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:05:57.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:05:57.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:05:57.222 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:05:57.222 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:05:57.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:05:57.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:05:57.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:05:57.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:05:57.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:05:57.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:05:57.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:05:57.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:05:57.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:05:57.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:05:57.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:05:57.510 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:05:57.571 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:05:43
2026-05-29T14:05:57.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72030, datetime.datetime(2026, 5, 29, 14, 5, 43), datetime.datetime(2026, 5, 29, 14, 5, 43), 'salt', 15.08, 47.21, None, 15.67, 35.96, 11.15, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:05:57.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:05:57.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:05:57.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:05:43, diff=14.57763s, valid=True
2026-05-29T14:05:57.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:05:57.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:05:57.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:06:12, diff=-14.419543s, valid=True
2026-05-29T14:05:57.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:05:57.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:05:57.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:05:37, diff=20.587045s, valid=True
2026-05-29T14:05:57.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:05:57.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:05:57.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:05:57.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:05:57.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:05:57.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:05:57.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:06:12, diff=-14.409899s, valid=True
2026-05-29T14:05:57.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:05:57.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:05:57.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:05:57.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=988999.59077s, valid=True
2026-05-29T14:05:57.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:05:57.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:05:57.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:05:57.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:05:57.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:05:57.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:05:57.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:05:57.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:05:57.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:05:57.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:05:57.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:05:57.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:05:57.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:05:57.924 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:05:58.235 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:05:58.585 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:05:58.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:05:58.693 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:05:58.693 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:05:58.854 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:05:58.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:06:28.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:06:28.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:06:28.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:06:29.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:06:29.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:06:29.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:06:29.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-05-29T14:06:29.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:06:29.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-05-29T14:06:29.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:06:29.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:06:29.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:06:29.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-05-29T14:06:32.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-05-29T14:06:32.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:06:32.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:06:32.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:06:32.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:06:32.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:06:32.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:06:32.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:06:32.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:06:32.035 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:06:32.035 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:06:32.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:06:32.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:06:32.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:06:32.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:06:32.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:06:32.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:06:32.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:06:32.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:06:32.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:06:32.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:06:32.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:06:32.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:06:32.348 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:06:13
2026-05-29T14:06:32.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72031, datetime.datetime(2026, 5, 29, 14, 6, 13), datetime.datetime(2026, 5, 29, 14, 6, 13), 'salt', 15.18, 48.3, None, 24.49, 37.3, 10.84, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:06:32.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:06:32.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:06:32.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:06:13, diff=19.354319s, valid=True
2026-05-29T14:06:32.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:06:32.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:06:32.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:06:12, diff=20.357157s, valid=True
2026-05-29T14:06:32.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:06:32.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:06:32.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:06:09, diff=23.36388s, valid=True
2026-05-29T14:06:32.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:06:32.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:06:32.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:06:32.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:06:32.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:06:32.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:06:32.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:06:12, diff=20.367018s, valid=True
2026-05-29T14:06:32.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:06:32.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:06:32.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:06:32.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989034.367706s, valid=True
2026-05-29T14:06:32.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:06:32.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:06:32.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:06:32.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:06:32.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:06:32.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:06:32.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:06:32.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:06:32.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:06:32.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:06:32.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:06:32.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:06:32.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:06:32.682 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:06:32.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:06:33.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:06:33.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:06:33.358 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:06:33.358 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:06:33.533 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:06:33.533 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:07:03.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:07:03.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:07:03.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:07:03.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:07:03.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:07:04.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:07:04.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T14:07:04.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:07:04.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-05-29T14:07:04.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:07:04.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:07:04.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:07:04.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-05-29T14:07:06.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-05-29T14:07:06.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:07:06.691 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:07:06.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:07:06.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:07:06.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:07:06.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:07:06.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:07:06.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:07:06.713 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:07:06.713 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:07:06.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:07:06.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:07:06.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:07:06.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:07:06.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:07:06.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:07:06.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:07:06.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:07:06.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:07:06.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:07:06.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:07:06.961 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:07:07.023 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:06:44
2026-05-29T14:07:07.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72032, datetime.datetime(2026, 5, 29, 14, 6, 44), datetime.datetime(2026, 5, 29, 14, 6, 43), 'salt', 15.14, 49.36, None, 20.01, 44.45, 10.52, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:07:07.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:07:07.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:07:07.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:06:43, diff=24.029512s, valid=True
2026-05-29T14:07:07.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:07:07.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:07:07.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:07:12, diff=-4.967615s, valid=True
2026-05-29T14:07:07.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:07:07.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:07:07.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:06:40, diff=27.039208s, valid=True
2026-05-29T14:07:07.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:07:07.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:07:07.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:07:07.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:07:07.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:07:07.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:07:07.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:07:12, diff=-4.957731s, valid=True
2026-05-29T14:07:07.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:07:07.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:07:07.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:07:07.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989069.042928s, valid=True
2026-05-29T14:07:07.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:07:07.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:07:07.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:07:07.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:07:07.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:07:07.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:07:07.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:07:07.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:07:07.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:07:07.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:07:07.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:07:07.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:07:07.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:07:07.422 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:07:07.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:07:07.976 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:07:08.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:07:08.077 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:07:08.077 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:07:08.248 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:07:08.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:07:38.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:07:38.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:07:38.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:07:38.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:07:38.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:07:38.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:07:38.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T14:07:38.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:07:38.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-05-29T14:07:38.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:07:38.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:07:38.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:07:38.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-05-29T14:07: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-05-29T14:07:41.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:07:41.552 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:07:41.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:07:41.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:07:41.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:07:41.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:07:41.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:07:41.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:07:41.572 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:07:41.572 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:07:41.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:07:41.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T14:07:41.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:07:41.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T14:07:41.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:07:41.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:07:41.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:07:41.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:07:41.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:07:41.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:07:41.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:07:41.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:07:41.888 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:07:14
2026-05-29T14:07:41.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72033, datetime.datetime(2026, 5, 29, 14, 7, 14), datetime.datetime(2026, 5, 29, 14, 7, 13), 'salt', 14.98, 49.06, None, 28.55, 45.23, 10.6, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:07:41.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:07:41.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T14:07:41.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:07:13, diff=28.895057s, valid=True
2026-05-29T14:07:41.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:07:41.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:07:41.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:07:12, diff=29.89787s, valid=True
2026-05-29T14:07:41.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:07:41.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T14:07:41.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:07:11, diff=30.904584s, valid=True
2026-05-29T14:07:41.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:07:41.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:07:41.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:07:41.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:07:41.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:07:41.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:07:41.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:07:12, diff=29.907642s, valid=True
2026-05-29T14:07:41.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:07:41.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:07:41.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:07:41.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989103.908303s, valid=True
2026-05-29T14:07:41.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:07:41.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:07:41.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:07:41.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:07:41.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:07:41.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:07:41.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:07:41.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:07:41.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:07:42.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:07:42.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:07:42.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:07:42.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:07:42.227 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:07:42.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:07:42.803 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:07:42.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:07:42.904 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:07:42.904 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:07:43.054 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:07:43.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:08:13.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:08:13.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:08:13.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:08:13.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:08:13.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:08:13.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:08:13.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-05-29T14:08:13.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:08:13.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-05-29T14:08:13.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:08:13.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:08:13.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:08:13.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-05-29T14:08:16.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-05-29T14:08:16.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:08:16.124 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:08:16.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:08:16.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:08:16.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:08:16.144 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:08:16.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:08:16.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:08:16.145 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:08:16.145 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:08:16.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:08:16.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:08:16.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:08:16.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:08:16.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:08:16.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:08:16.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:08:16.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:08:16.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:08:16.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:08:16.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:08:16.416 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:08:16.474 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:08:14
2026-05-29T14:08:16.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72035, datetime.datetime(2026, 5, 29, 14, 8, 14), datetime.datetime(2026, 5, 29, 14, 8, 14), 'salt', 14.41, 50.26, None, 21.31, 49.14, 10.2, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:08:16.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:08:16.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:08:16.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:08:14, diff=2.480983s, valid=True
2026-05-29T14:08:16.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:08:16.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:08:16.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:08:12, diff=4.48378s, valid=True
2026-05-29T14:08:16.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:08:16.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:08:16.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:08:07, diff=9.490331s, valid=True
2026-05-29T14:08:16.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:08:16.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:08:16.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:08:16.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:08:16.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:08:16.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:08:16.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:08:12, diff=4.493319s, valid=True
2026-05-29T14:08:16.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:08:16.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:08:16.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:08:16.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989138.493983s, valid=True
2026-05-29T14:08:16.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:08:16.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:08:16.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:08:16.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:08:16.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:08:16.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:08:16.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:08:16.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:08:16.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:08:16.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:08:16.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:08:16.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:08:16.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:08:16.889 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:08:17.120 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:08:17.480 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:08:17.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:08:17.583 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:08:17.583 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:08:17.799 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:08:17.799 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:08:47.830 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:08:47.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:08:47.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:08:48.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:08:48.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:08:48.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:08:48.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-05-29T14:08:48.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:08:48.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-05-29T14:08:48.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:08:48.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:08:48.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:08:48.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-05-29T14:08: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-05-29T14:08:52.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:08:52.171 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:08:52.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:08:52.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:08:52.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:08:52.192 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:08:52.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:08:52.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:08:52.193 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:08:52.193 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:08:52.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:08:52.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:08:52.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:08:52.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:08:52.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:08:52.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:08:52.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:08:52.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:08:52.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:08:52.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:08:52.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:08:52.480 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:08:52.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:08:44
2026-05-29T14:08:52.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72036, datetime.datetime(2026, 5, 29, 14, 8, 44), datetime.datetime(2026, 5, 29, 14, 8, 44), 'salt', 14.25, 51.15, None, 21.67, 53.06, 9.94, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:08:52.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:08:52.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:08:52.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:08:44, diff=8.551331s, valid=True
2026-05-29T14:08:52.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:08:52.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:08:52.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:09:12, diff=-19.445869s, valid=True
2026-05-29T14:08:52.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:08:52.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:08:52.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:08:37, diff=15.560874s, valid=True
2026-05-29T14:08:52.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:08:52.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:08:52.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:08:52.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:08:52.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:08:52.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:08:52.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:09:12, diff=-19.436137s, valid=True
2026-05-29T14:08:52.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:08:52.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:08:52.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:08:52.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989174.564515s, valid=True
2026-05-29T14:08:52.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:08:52.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:08:52.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:08:52.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:08:52.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:08:52.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:08:52.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:08:52.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:08:52.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:08:52.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:08:52.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:08:52.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:08:52.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:08:52.883 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:08:53.094 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:08:53.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:08:53.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:08:53.538 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:08:53.538 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:08:53.792 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:08:53.792 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:09:23.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:09:23.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:09:23.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:09:24.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:09:24.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:09:24.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:09:24.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-05-29T14:09:24.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:09:24.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-05-29T14:09:24.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:09:24.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:09:24.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:09:24.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-05-29T14:09: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-05-29T14:09:28.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:09:28.020 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:09:28.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:09:28.028 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:09:28.039 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:09:28.039 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:09:28.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:09:28.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:09:28.040 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:09:28.040 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:09:28.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:09:28.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:09:28.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:09:28.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:09:28.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:09:28.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:09:28.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:09:28.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:09:28.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:09:28.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:09:28.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:09:28.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:09:28.446 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:09:15
2026-05-29T14:09:28.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72037, datetime.datetime(2026, 5, 29, 14, 9, 15), datetime.datetime(2026, 5, 29, 14, 9, 14), 'salt', 14.35, 52.25, None, 21.88, 47.1, 9.65, 832.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:09:28.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:09:28.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:09:28.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:09:14, diff=14.452883s, valid=True
2026-05-29T14:09:28.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:09:28.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:09:28.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:09:12, diff=16.455732s, valid=True
2026-05-29T14:09:28.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:09:28.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:09:28.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:09:08, diff=20.462283s, valid=True
2026-05-29T14:09:28.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:09:28.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:09:28.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:09:28.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:09:28.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:09:28.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:09:28.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:09:12, diff=16.465312s, valid=True
2026-05-29T14:09:28.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:09:28.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:09:28.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:09:28.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989210.465967s, valid=True
2026-05-29T14:09:28.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:09:28.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:09:28.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:09:28.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:09:28.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:09:28.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:09:28.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:09:28.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:09:28.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:09:28.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:09:28.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:09:28.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:09:28.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:09:28.787 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:09:29.006 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:09:29.358 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:09:29.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:09:29.462 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:09:29.462 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:09:29.627 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:09:29.627 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:09:59.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:09:59.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:09:59.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:09:59.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:09:59.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:10:00.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:10:00.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-05-29T14:10:00.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:10:00.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-05-29T14:10:00.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:10:00.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:10:00.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:10:00.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-05-29T14:10:02.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-05-29T14:10:02.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:10:02.991 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:10:02.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:10:03.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:10:03.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:10:03.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:10:03.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:10:03.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:10:03.012 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:10:03.012 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:10:03.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:10:03.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:10:03.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:10:03.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:10:03.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:10:03.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T14:10:03.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:10:03.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T14:10:03.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:10:03.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:10:03.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:10:03.267 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:10:03.329 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:09:45
2026-05-29T14:10:03.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72038, datetime.datetime(2026, 5, 29, 14, 9, 45), datetime.datetime(2026, 5, 29, 14, 9, 45), 'salt', 14.31, 52.11, None, 19.87, 49.0, 9.68, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:10:03.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:10:03.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:10:03.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:09:45, diff=18.335956s, valid=True
2026-05-29T14:10:03.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:10:03.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T14:10:03.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:10:12, diff=-8.661174s, valid=True
2026-05-29T14:10:03.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:10:03.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:10:03.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:09:38, diff=25.345658s, valid=True
2026-05-29T14:10:03.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:10:03.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:10:03.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:10:03.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:10:03.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:10:03.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T14:10:03.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:10:12, diff=-8.65112s, valid=True
2026-05-29T14:10:03.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:10:03.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:10:03.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:10:03.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989245.349576s, valid=True
2026-05-29T14:10:03.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:10:03.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:10:03.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:10:03.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:10:03.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:10:03.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:10:03.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:10:03.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:10:03.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:10:03.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:10:03.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:10:03.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:10:03.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:10:03.670 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:10:03.886 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:10:04.275 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:10:04.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:10:04.433 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:10:04.433 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:10:04.683 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:10:04.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:10:34.705 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:10:34.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:10:34.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:10:34.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:10:34.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:10:35.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:10:35.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-05-29T14:10:35.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:10:35.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T14:10:35.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:10:35.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:10:35.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:10:35.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-05-29T14:10:37.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-05-29T14:10:37.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:10:37.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:10:37.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:10:37.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:10:37.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:10:37.808 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:10:37.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:10:37.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:10:37.808 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:10:37.808 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:10:37.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:10:37.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:10:37.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:10:37.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:10:37.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:10:38.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T14:10:38.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:10:38.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T14:10:38.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:10:38.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:10:38.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:10:38.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:10:38.123 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:10:16
2026-05-29T14:10:38.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72039, datetime.datetime(2026, 5, 29, 14, 10, 16), datetime.datetime(2026, 5, 29, 14, 10, 15), 'salt', 14.48, 52.28, None, 19.3, 40.25, 9.65, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:10:38.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:10:38.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:10:38.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:10:15, diff=23.129917s, valid=True
2026-05-29T14:10:38.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:10:38.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T14:10:38.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:10:12, diff=26.132801s, valid=True
2026-05-29T14:10:38.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:10:38.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:10:38.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:10:10, diff=28.139682s, valid=True
2026-05-29T14:10:38.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:10:38.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:10:38.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:10:38.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:10:38.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:10:38.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T14:10:38.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:10:12, diff=26.142767s, valid=True
2026-05-29T14:10:38.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:10:38.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:10:38.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:10:38.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989280.143422s, valid=True
2026-05-29T14:10:38.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:10:38.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:10:38.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:10:38.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:10:38.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:10:38.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:10:38.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:10:38.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:10:38.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:10:38.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:10:38.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:10:38.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:10:38.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:10:38.460 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:10:38.674 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:10:39.306 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:10:39.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:10:39.409 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:10:39.409 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:10:41.460 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:10:41.460 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:11:11.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:11:11.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:11:11.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:11:11.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:11:11.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:11:12.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:11:12.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-05-29T14:11:12.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:11:12.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-05-29T14:11:12.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:11:12.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:11:12.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:11:12.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-05-29T14:11:15.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-05-29T14:11:15.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:11:15.089 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:11:15.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:11:15.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:11:15.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:11:15.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:11:15.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:11:15.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:11:15.110 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:11:15.110 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:11:15.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:11:15.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T14:11:15.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:11:15.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T14:11:15.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:11:15.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T14:11:15.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:11:15.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T14:11:15.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:11:15.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:11:15.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:11:15.367 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:11:15.425 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:10:46
2026-05-29T14:11:15.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72040, datetime.datetime(2026, 5, 29, 14, 10, 46), datetime.datetime(2026, 5, 29, 14, 10, 45), 'salt', 14.41, 52.08, None, 18.46, 56.79, 9.69, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:11:15.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:11:15.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T14:11:15.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:10:45, diff=30.431326s, valid=True
2026-05-29T14:11:15.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:11:15.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T14:11:15.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:11:12, diff=3.43418s, valid=True
2026-05-29T14:11:15.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:11:15.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T14:11:15.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:10:41, diff=34.44085s, valid=True
2026-05-29T14:11:15.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:11:15.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:11:15.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:11:15.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:11:15.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:11:15.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T14:11:15.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:11:12, diff=3.443898s, valid=True
2026-05-29T14:11:15.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:11:15.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:11:15.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:11:15.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989317.444586s, valid=True
2026-05-29T14:11:15.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:11:15.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:11:15.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:11:15.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:11:15.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:11:15.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:11:15.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:11:15.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:11:15.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:11:15.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:11:15.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:11:15.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:11:15.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:11:15.772 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:11:16.082 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:11:16.427 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:11:16.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:11:16.529 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:11:16.529 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:11:16.773 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:11:16.773 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:11:46.803 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:11:46.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:11:46.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:11:47.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:11:47.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:11:47.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:11:47.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-05-29T14:11:47.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:11:47.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-05-29T14:11:47.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:11:47.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:11:47.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:11:47.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-05-29T14:11:50.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-05-29T14:11:50.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:11:50.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:11:50.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:11:50.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:11:50.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:11:50.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:11:50.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:11:50.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:11:50.106 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:11:50.107 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:11:50.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:11:50.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:11:50.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:11:50.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:11:50.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:11:50.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:11:50.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:11:50.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:11:50.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:11:50.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:11:50.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:11:50.361 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:11:50.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:11:46
2026-05-29T14:11:50.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72042, datetime.datetime(2026, 5, 29, 14, 11, 46), datetime.datetime(2026, 5, 29, 14, 11, 46), 'salt', 14.51, 49.29, None, 23.89, 48.55, 10.49, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:11:50.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:11:50.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:11:50.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:11:46, diff=4.426238s, valid=True
2026-05-29T14:11:50.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:11:50.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:11:50.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:12:12, diff=-21.570833s, valid=True
2026-05-29T14:11:50.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:11:50.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:11:50.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:11:44, diff=6.436096s, valid=True
2026-05-29T14:11:50.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:11:50.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:11:50.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:11:50.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:11:50.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:11:50.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:11:50.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:12:12, diff=-21.560735s, valid=True
2026-05-29T14:11:50.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:11:50.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:11:50.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:11:50.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989352.439968s, valid=True
2026-05-29T14:11:50.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:11:50.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:11:50.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:11:50.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:11:50.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:11:50.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:11:50.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:11:50.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:11:50.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:11:50.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:11:50.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:11:50.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:11:50.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:11:50.753 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:11:50.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:11:51.308 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:11:51.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:11:51.408 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:11:51.408 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:11:51.574 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:11:51.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:12:21.604 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:12:21.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:12:21.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:12:21.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:12:21.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:12:22.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:12:22.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T14:12:22.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:12:22.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-05-29T14:12:22.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:12:22.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:12:22.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:12:22.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-05-29T14:12:25.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T14:12:25.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:12:25.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:12:25.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:12:25.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:12:25.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:12:25.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:12:25.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:12:25.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:12:25.274 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:12:25.274 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:12:25.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:12:25.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:12:25.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:12:25.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:12:25.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:12:25.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:12:25.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:12:25.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:12:25.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:12:25.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:12:25.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:12:25.524 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:12:25.582 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:12:17
2026-05-29T14:12:25.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72043, datetime.datetime(2026, 5, 29, 14, 12, 17), datetime.datetime(2026, 5, 29, 14, 12, 16), 'salt', 14.41, 49.2, None, 22.97, 38.05, 10.51, 832.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:12:25.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:12:25.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:12:25.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:12:16, diff=9.589021s, valid=True
2026-05-29T14:12:25.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:12:25.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:12:25.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:12:12, diff=13.591906s, valid=True
2026-05-29T14:12:25.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:12:25.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:12:25.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:12:15, diff=10.598601s, valid=True
2026-05-29T14:12:25.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:12:25.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:12:25.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:12:25.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:12:25.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:12:25.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:12:25.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:12:12, diff=13.6017s, valid=True
2026-05-29T14:12:25.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:12:25.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:12:25.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:12:25.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989387.602365s, valid=True
2026-05-29T14:12:25.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:12:25.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:12:25.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:12:25.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:12:25.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:12:25.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:12:25.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:12:25.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:12:25.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:12:25.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:12:25.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:12:25.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:12:25.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:12:25.987 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:12:26.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:12:26.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:12:26.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:12:26.640 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:12:26.640 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:12:26.804 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:12:26.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:12:56.834 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:12:56.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:12:56.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:12:57.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:12:57.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:12:57.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:12:57.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-05-29T14:12:57.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:12:57.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-05-29T14:12:57.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:12:57.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:12:57.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:12:57.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-05-29T14:13:00.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-05-29T14:13:00.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:13:00.173 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:13:00.173 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:13:00.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:13:00.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:13:00.194 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:13:00.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:13:00.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:13:00.195 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:13:00.195 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:13:00.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:13:00.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:13:00.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:13:00.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:13:00.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:13:00.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:13:00.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:13:00.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:13:00.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:13:00.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:13:00.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:13:00.450 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:13:00.510 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:12:47
2026-05-29T14:13:00.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72044, datetime.datetime(2026, 5, 29, 14, 12, 47), datetime.datetime(2026, 5, 29, 14, 12, 46), 'salt', 14.64, 50.32, None, 25.09, 32.21, 10.2, 832.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:13:00.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:13:00.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:13:00.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:12:46, diff=14.517247s, valid=True
2026-05-29T14:13:00.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:13:00.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:13:00.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:13:12, diff=-11.479858s, valid=True
2026-05-29T14:13:00.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:13:00.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:13:00.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:12:40, diff=20.526938s, valid=True
2026-05-29T14:13:00.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:13:00.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:13:00.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:13:00.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:13:00.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:13:00.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:13:00.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:13:12, diff=-11.470016s, valid=True
2026-05-29T14:13:00.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:13:00.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:13:00.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:13:00.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989422.530647s, valid=True
2026-05-29T14:13:00.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:13:00.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:13:00.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:13:00.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:13:00.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:13:00.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:13:00.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:13:00.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:13:00.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:13:00.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:13:00.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:13:00.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:13:00.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:13:00.853 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:13:01.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:13:01.428 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:13:01.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:13:01.531 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:13:01.531 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:13:01.698 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:13:01.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:13:31.722 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:13:31.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:13:31.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:13:32.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:13:32.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:13:32.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:13:32.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-05-29T14:13:32.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:13:32.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-05-29T14:13:32.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:13:32.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:13:32.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:13:32.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-05-29T14:13:34.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-05-29T14:13:34.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:13:34.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:13:34.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:13:34.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:13:34.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:13:34.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:13:34.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:13:34.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:13:34.879 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:13:34.879 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:13:34.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:13:34.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:13:34.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:13:35.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:13:35.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:13:35.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:13:35.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:13:35.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:13:35.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:13:35.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:13:35.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:13:35.146 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:13:35.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:13:17
2026-05-29T14:13:35.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72045, datetime.datetime(2026, 5, 29, 14, 13, 17), datetime.datetime(2026, 5, 29, 14, 13, 17), 'salt', 14.61, 50.32, None, 20.89, 33.85, 10.2, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:13:35.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:13:35.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:13:35.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:13:17, diff=18.212345s, valid=True
2026-05-29T14:13:35.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:13:35.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:13:35.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:13:12, diff=23.215221s, valid=True
2026-05-29T14:13:35.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:13:35.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:13:35.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:13:10, diff=25.221967s, valid=True
2026-05-29T14:13:35.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:13:35.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:13:35.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:13:35.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:13:35.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:13:35.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:13:35.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:13:12, diff=23.225033s, valid=True
2026-05-29T14:13:35.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:13:35.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:13:35.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:13:35.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989457.225715s, valid=True
2026-05-29T14:13:35.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:13:35.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:13:35.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:13:35.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:13:35.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:13:35.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:13:35.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:13:35.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:13:35.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:13:35.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:13:35.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:13:35.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:13:35.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:13:35.628 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:13:35.853 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:13:36.225 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:13:36.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:13:36.328 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:13:36.328 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:13:36.569 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:13:36.569 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:14:06.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:14:06.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:14:06.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:14:06.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:14:06.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:14:07.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:14:07.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-05-29T14:14:07.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:14:07.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-05-29T14:14:07.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:14:07.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:14:07.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:14:07.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-05-29T14:14:09.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-05-29T14:14:09.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:14:09.717 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:14:09.717 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:14:09.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:14:09.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:14:09.739 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:14:09.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:14:09.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:14:09.739 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:14:09.739 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:14:09.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:14:09.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:14:09.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:14:09.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:14:09.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:14:09.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:14:09.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:14:10.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:14:10.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:14:10.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:14:10.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:14:10.013 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:14:10.076 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:13:47
2026-05-29T14:14:10.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72046, datetime.datetime(2026, 5, 29, 14, 13, 47), datetime.datetime(2026, 5, 29, 14, 13, 47), 'salt', 14.97, 50.36, None, 23.82, 43.37, 10.22, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:14:10.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:14:10.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:14:10.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:13:47, diff=23.089578s, valid=True
2026-05-29T14:14:10.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:14:10.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:14:10.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:14:12, diff=-1.903817s, valid=True
2026-05-29T14:14:10.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:14:10.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:14:10.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:13:40, diff=30.105389s, valid=True
2026-05-29T14:14:10.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:14:10.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:14:10.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:14:10.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:14:10.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:14:10.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:14:10.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:14:12, diff=-1.890658s, valid=True
2026-05-29T14:14:10.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:14:10.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:14:10.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:14:10.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989492.110072s, valid=True
2026-05-29T14:14:10.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:14:10.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:14:10.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:14:10.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:14:10.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:14:10.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:14:10.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:14:10.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:14:10.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:14:10.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:14:10.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:14:10.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:14:10.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:14:10.438 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:14:10.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:14:11.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:14:11.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:14: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-05-29T14:14: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-05-29T14:14:11.310 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:14:11.310 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:14:41.316 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:14:41.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:14:41.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:14:41.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:14:41.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:14:41.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:14:41.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-05-29T14:14:41.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:14:41.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-05-29T14:14:41.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:14:41.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:14:41.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:14:41.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-05-29T14:14:44.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-05-29T14:14:44.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:14:44.547 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:14:44.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:14:44.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:14:44.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:14:44.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:14:44.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:14:44.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:14:44.571 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:14:44.571 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:14:44.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:14:44.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:14:44.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:14:44.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:14:44.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:14:44.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T14:14:44.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:14:44.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T14:14:44.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:14:44.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:14:44.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:14:44.825 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:14:44.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:14:17
2026-05-29T14:14:44.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72047, datetime.datetime(2026, 5, 29, 14, 14, 17), datetime.datetime(2026, 5, 29, 14, 14, 17), 'salt', 14.94, 49.29, None, 21.03, 39.97, 10.52, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:14:44.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:14:44.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:14:44.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:14:17, diff=27.892044s, valid=True
2026-05-29T14:14:44.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:14:44.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T14:14:44.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:14:12, diff=32.894925s, valid=True
2026-05-29T14:14:44.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:14:44.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:14:44.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:14:11, diff=33.901635s, valid=True
2026-05-29T14:14:44.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:14:44.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:14:44.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:14:44.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:14:44.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:14:44.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T14:14:44.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:14:12, diff=32.904688s, valid=True
2026-05-29T14:14:44.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:14:44.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:14:44.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:14:44.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989526.905344s, valid=True
2026-05-29T14:14:44.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:14:44.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:14:44.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:14:44.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:14:44.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:14:44.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:14:44.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:14:44.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:14:45.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:14:45.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:14:45.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:14:45.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:14:45.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:14:45.289 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:14:45.503 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:14:45.848 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:14:45.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:14:45.950 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:14:45.951 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:14:46.117 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:14:46.117 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:15:16.121 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:15:16.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:15:16.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:15:16.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:15:16.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:15:16.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:15:16.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-05-29T14:15:16.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:15:16.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-05-29T14:15:16.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:15:16.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:15:16.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:15:16.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-05-29T14:15:19.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-05-29T14:15:19.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:15:19.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:15:19.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:15:19.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:15:19.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:15:19.298 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:15:19.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:15:19.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:15:19.298 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:15:19.298 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:15:19.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:15:19.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:15:19.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:15:19.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:15:19.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:15:19.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:15:19.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:15:19.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:15:19.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:15:19.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:15:19.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:15:19.548 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:15:19.609 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:15:18
2026-05-29T14:15:19.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72049, datetime.datetime(2026, 5, 29, 14, 15, 18), datetime.datetime(2026, 5, 29, 14, 15, 17), 'salt', 14.91, 48.86, None, 19.3, 34.51, 10.65, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:15:19.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:15:19.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:15:19.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:15:17, diff=2.615824s, valid=True
2026-05-29T14:15:19.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:15:19.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:15:19.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:15:12, diff=7.618688s, valid=True
2026-05-29T14:15:19.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:15:19.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:15:19.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:15:13, diff=6.625358s, valid=True
2026-05-29T14:15:19.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:15:19.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:15:19.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:15:19.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:15:19.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:15:19.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:15:19.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:15:12, diff=7.628419s, valid=True
2026-05-29T14:15:19.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:15:19.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:15:19.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:15:19.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989561.629104s, valid=True
2026-05-29T14:15:19.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:15:19.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:15:19.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:15:19.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:15:19.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:15:19.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:15:19.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:15:19.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:15:19.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:15:19.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:15:19.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:15:19.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:15:19.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:15:19.963 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:15:20.194 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:15:20.538 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:15:20.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:15:20.638 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:15:20.638 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:15:20.863 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:15:20.864 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:15:50.894 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:15:50.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:15:50.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:15:51.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:15:51.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:15:51.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:15:51.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T14:15:51.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:15:51.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-05-29T14:15:51.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:15:51.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:15:51.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:15:51.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-05-29T14:15:54.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-05-29T14:15:54.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:15:54.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:15:54.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:15:54.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:15:54.322 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:15:54.322 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:15:54.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:15:54.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:15:54.323 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:15:54.323 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:15:54.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:15:54.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:15:54.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:15:54.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:15:54.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:15:54.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:15:54.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:15:54.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:15:54.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:15:54.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:15:54.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:15:54.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:15:54.630 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:15:48
2026-05-29T14:15:54.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72050, datetime.datetime(2026, 5, 29, 14, 15, 48), datetime.datetime(2026, 5, 29, 14, 15, 48), 'salt', 14.94, 48.86, None, 21.17, 19.57, 10.65, 832.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:15:54.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:15:54.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:15:54.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:15:48, diff=6.636657s, valid=True
2026-05-29T14:15:54.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:15:54.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:15:54.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:16:12, diff=-17.360522s, valid=True
2026-05-29T14:15:54.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:15:54.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:15:54.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:15:45, diff=9.646026s, valid=True
2026-05-29T14:15:54.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:15:54.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:15:54.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:15:54.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:15:54.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:15:54.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:15:54.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:16:12, diff=-17.350992s, valid=True
2026-05-29T14:15:54.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:15:54.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:15:54.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:15:54.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989596.649668s, valid=True
2026-05-29T14:15:54.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:15:54.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:15:54.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:15:54.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:15:54.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:15:54.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:15:54.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:15:54.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:15:54.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:15:54.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:15:54.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:15:54.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:15:54.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:15:54.963 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:15:55.174 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:15:55.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:15:55.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:15:55.621 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:15:55.621 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:15:55.820 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:15:55.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:16:25.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:16:25.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:16:25.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:16:26.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:16:26.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:16:26.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:16:26.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-05-29T14:16:26.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:16:26.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-05-29T14:16:26.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:16:26.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:16:26.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:16:26.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-05-29T14:16:29.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-05-29T14:16:29.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:16:29.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:16:29.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:16:29.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:16:29.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:16:29.188 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:16:29.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:16:29.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:16:29.188 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:16:29.189 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:16:29.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:16:29.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:16:29.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:16:29.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:16:29.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:16:29.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:16:29.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:16:29.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:16:29.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:16:29.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:16:29.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:16:29.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:16:29.495 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:16:18
2026-05-29T14:16:29.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72051, datetime.datetime(2026, 5, 29, 14, 16, 18), datetime.datetime(2026, 5, 29, 14, 16, 18), 'salt', 15.07, 49.06, None, 24.21, 34.86, 10.6, 832.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:16:29.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:16:29.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:16:29.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:16:18, diff=11.501133s, valid=True
2026-05-29T14:16:29.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:16:29.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:16:29.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:16:12, diff=17.504037s, valid=True
2026-05-29T14:16:29.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:16:29.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:16:29.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:16:16, diff=13.510648s, valid=True
2026-05-29T14:16:29.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:16:29.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:16:29.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:16:29.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:16:29.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:16:29.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:16:29.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:16:12, diff=17.513699s, valid=True
2026-05-29T14:16:29.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:16:29.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:16:29.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:16:29.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989631.514351s, valid=True
2026-05-29T14:16:29.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:16:29.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:16:29.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:16:29.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:16:29.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:16:29.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:16:29.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:16:29.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:16:29.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:16:29.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:16:29.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:16:29.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:16:29.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:16:29.828 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:16:30.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:16:30.462 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:16:30.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:16:30.564 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:16:30.564 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:16:30.810 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:16:30.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:17:00.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:17:00.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:17:00.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:17:01.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:17:01.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:17:01.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:17:01.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-05-29T14:17:01.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:17:01.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-05-29T14:17:01.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:17:01.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:17:01.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:17:01.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-05-29T14:17:03.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-05-29T14:17:03.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:17:03.989 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:17:03.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:17:04.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:17:04.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:17:04.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:17:04.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:17:04.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:17:04.012 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:17:04.012 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:17:04.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:17:04.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:17:04.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:17:04.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:17:04.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:17:04.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:17:04.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:17:04.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:17:04.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:17:04.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:17:04.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:17:04.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:17:04.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:16:49
2026-05-29T14:17:04.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72052, datetime.datetime(2026, 5, 29, 14, 16, 49), datetime.datetime(2026, 5, 29, 14, 16, 48), 'salt', 15.27, 47.14, None, 26.57, 40.44, 11.18, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:17:04.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:17:04.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:17:04.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:16:48, diff=16.328248s, valid=True
2026-05-29T14:17:04.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:17:04.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:17:04.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:17:12, diff=-7.668868s, valid=True
2026-05-29T14:17:04.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:17:04.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:17:04.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:16:48, diff=16.337777s, valid=True
2026-05-29T14:17:04.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:17:04.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:17:04.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:17:04.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:17:04.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:17:04.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:17:04.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:17:12, diff=-7.659146s, valid=True
2026-05-29T14:17:04.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:17:04.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:17:04.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:17:04.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989666.341505s, valid=True
2026-05-29T14:17:04.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:17:04.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:17:04.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:17:04.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:17:04.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:17:04.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:17:04.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:17:04.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:17:04.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:17:04.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:17:04.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:17:04.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:17:04.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:17:04.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:17:04.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:17:05.217 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:17:05.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:17:05.316 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:17:05.316 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:17:05.484 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:17:05.484 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:17:35.514 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:17:35.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:17:35.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:17:35.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:17:35.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:17:36.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:17:36.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-05-29T14:17:36.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:17:36.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-05-29T14:17:36.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:17:36.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:17:36.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:17:36.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-05-29T14:17:38.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-05-29T14:17:38.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:17:38.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:17:38.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:17:38.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:17:38.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:17:38.727 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:17:38.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:17:38.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:17:38.727 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:17:38.727 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:17:38.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:17:38.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:17:38.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:17:38.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:17:38.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:17:38.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:17:38.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:17:38.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:17:38.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:17:38.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:17:38.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:17:38.977 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:17:39.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:17:19
2026-05-29T14:17:39.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72053, datetime.datetime(2026, 5, 29, 14, 17, 19), datetime.datetime(2026, 5, 29, 14, 17, 18), 'salt', 15.31, 46.58, None, 24.52, 21.49, 11.37, 832.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:17:39.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:17:39.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:17:39.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:17:18, diff=21.04723s, valid=True
2026-05-29T14:17:39.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:17:39.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:17:39.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:17:12, diff=27.050065s, valid=True
2026-05-29T14:17:39.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:17:39.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:17:39.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:17:12, diff=27.056687s, valid=True
2026-05-29T14:17:39.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:17:39.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:17:39.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:17:39.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:17:39.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:17:39.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:17:39.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:17:12, diff=27.059676s, valid=True
2026-05-29T14:17:39.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:17:39.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:17:39.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:17:39.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989701.060328s, valid=True
2026-05-29T14:17:39.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:17:39.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:17:39.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:17:39.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:17:39.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:17:39.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:17:39.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:17:39.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:17:39.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:17:39.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:17:39.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:17:39.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:17:39.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:17:39.375 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:17:39.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:17:40.038 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:17:40.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:17:40.144 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:17:40.145 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:17:40.375 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:17:40.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:18:10.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:18:10.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:18:10.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:18:10.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:18:10.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:18:10.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:18:10.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-05-29T14:18:10.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:18:10.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-05-29T14:18:10.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:18:10.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:18:10.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:18:10.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-05-29T14:18:13.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-05-29T14:18:13.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:18:13.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:18:13.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:18:13.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:18:13.450 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:18:13.450 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:18:13.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:18:13.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:18:13.451 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:18:13.452 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:18:13.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:18:13.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:18:13.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:18:13.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:18:13.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:18:13.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:18:13.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:18:13.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:18:13.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:18:13.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:18:13.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:18:13.742 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:18:13.804 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:17:49
2026-05-29T14:18:13.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72054, datetime.datetime(2026, 5, 29, 14, 17, 49), datetime.datetime(2026, 5, 29, 14, 17, 49), 'salt', 15.34, 45.71, None, 21.59, 31.86, 11.63, 832.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:18:13.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:18:13.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:18:13.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:17:49, diff=24.810466s, valid=True
2026-05-29T14:18:13.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:18:13.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:18:13.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:18:12, diff=1.813369s, valid=True
2026-05-29T14:18:13.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:18:13.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:18:13.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:17:42, diff=31.82018s, valid=True
2026-05-29T14:18:13.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:18:13.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:18:13.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:18:13.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:18:13.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:18:13.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:18:13.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:18:12, diff=1.823255s, valid=True
2026-05-29T14:18:13.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:18:13.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:18:13.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:18:13.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989735.82393s, valid=True
2026-05-29T14:18:13.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:18:13.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:18:13.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:18:13.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:18:13.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:18:13.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:18:13.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:18:13.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:18:13.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:18:13.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:18:14.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:18:14.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:18:14.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:18:14.141 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:18:14.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:18:14.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:18:14.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:18:14.804 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:18:14.804 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:18:14.961 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:18:14.961 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:18:44.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:18:44.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:18:44.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:18:45.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:18:45.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:18:45.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:18:45.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-05-29T14:18:45.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:18:45.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-05-29T14:18:45.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:18:45.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:18:45.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:18:45.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-05-29T14:18:48.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T14:18:48.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:18:48.066 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:18:48.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:18:48.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:18:48.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:18:48.087 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:18:48.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:18:48.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:18:48.087 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:18:48.087 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:18:48.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:18:48.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T14:18:48.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:18:48.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T14:18:48.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:18:48.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T14:18:48.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:18:48.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T14:18:48.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:18:48.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:18:48.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:18:48.338 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:18:48.396 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:18:19
2026-05-29T14:18:48.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72055, datetime.datetime(2026, 5, 29, 14, 18, 19), datetime.datetime(2026, 5, 29, 14, 18, 19), 'salt', 15.31, 46.01, None, 21.24, 37.58, 11.54, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:18:48.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:18:48.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T14:18:48.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:18:19, diff=29.402517s, valid=True
2026-05-29T14:18:48.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:18:48.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T14:18:48.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:18:12, diff=36.405361s, valid=True
2026-05-29T14:18:48.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:18:48.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T14:18:48.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:18:13, diff=35.412112s, valid=True
2026-05-29T14:18:48.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:18:48.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:18:48.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:18:48.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:18:48.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:18:48.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T14:18:48.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:18:12, diff=36.415178s, valid=True
2026-05-29T14:18:48.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:18:48.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:18:48.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:18:48.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989770.415848s, valid=True
2026-05-29T14:18:48.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:18:48.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:18:48.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:18:48.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:18:48.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:18:48.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:18:48.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:18:48.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:18:48.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:18:48.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:18:48.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:18:48.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:18:48.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:18:48.804 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:18:49.045 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:18:49.396 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:18:49.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:18:49.497 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:18:49.497 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:18:49.686 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:18:49.686 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:19:19.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:19:19.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:19:19.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:19:19.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:19:19.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:19:20.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:19:20.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-05-29T14:19:20.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:19:20.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-05-29T14:19:20.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:19:20.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:19:20.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:19:20.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-05-29T14:19:22.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-05-29T14:19:22.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:19:22.719 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:19:22.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:19:22.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:19:22.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:19:22.739 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:19:22.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:19:22.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:19:22.740 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:19:22.740 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:19:22.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:19:22.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:19:22.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:19:22.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:19:22.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:19:22.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:19:22.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:19:22.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:19:22.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:19:22.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:19:22.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:19:22.996 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:19:23.065 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:19:20
2026-05-29T14:19:23.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72057, datetime.datetime(2026, 5, 29, 14, 19, 20), datetime.datetime(2026, 5, 29, 14, 19, 19), 'salt', 15.54, 47.8, None, 20.54, 42.62, 11.01, 832.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:19:23.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:19:23.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:19:23.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:19:19, diff=4.071485s, valid=True
2026-05-29T14:19:23.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:19:23.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:19:23.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:19:12, diff=11.074368s, valid=True
2026-05-29T14:19:23.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:19:23.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:19:23.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:19:14, diff=9.081137s, valid=True
2026-05-29T14:19:23.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:19:23.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:19:23.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:19:23.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:19:23.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:19:23.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:19:23.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:19:12, diff=11.084197s, valid=True
2026-05-29T14:19:23.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:19:23.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:19:23.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:19:23.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989805.084862s, valid=True
2026-05-29T14:19:23.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:19:23.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:19:23.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:19:23.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:19:23.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:19:23.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:19:23.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:19:23.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:19:23.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:19:23.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:19:23.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:19:23.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:19:23.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:19:23.400 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:19:23.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:19:23.981 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:19:24.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:19:24.080 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:19:24.080 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:19:24.278 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:19:24.279 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:19:54.309 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:19:54.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:19:54.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:19:54.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:19:54.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:19:54.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:19:54.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-05-29T14:19:54.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:19:54.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T14:19:54.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:19:54.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:19:54.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:19:54.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-05-29T14:19:57.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-05-29T14:19:57.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:19:57.670 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:19:57.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:19:57.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:19:57.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:19:57.690 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:19:57.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:19:57.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:19:57.691 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:19:57.691 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:19:57.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:19:57.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:19:57.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:19:57.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:19:57.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:19:57.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:19:57.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:19:57.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:19:57.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:19:57.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:19:57.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:19:57.972 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:19:58.030 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:19:50
2026-05-29T14:19:58.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72058, datetime.datetime(2026, 5, 29, 14, 19, 50), datetime.datetime(2026, 5, 29, 14, 19, 50), 'salt', 15.37, 46.71, None, 21.56, 38.12, 11.33, 832.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:19:58.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:19:58.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:19:58.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:19:50, diff=8.037039s, valid=True
2026-05-29T14:19:58.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:19:58.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:19:58.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:20:12, diff=-13.960046s, valid=True
2026-05-29T14:19:58.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:19:58.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:19:58.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:19:46, diff=12.046744s, valid=True
2026-05-29T14:19:58.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:19:58.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:19:58.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:19:58.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:19:58.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:19:58.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:19:58.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:20:12, diff=-13.950168s, valid=True
2026-05-29T14:19:58.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:19:58.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:19:58.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:19:58.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989840.050493s, valid=True
2026-05-29T14:19:58.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:19:58.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:19:58.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:19:58.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:19:58.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:19:58.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:19:58.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:19:58.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:19:58.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:19:58.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:19:58.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:19:58.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:19:58.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:19:58.441 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:19:58.655 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:19:59.001 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:19:59.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:19:59.103 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:19:59.103 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:19:59.262 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:19:59.262 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:20:29.292 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:20:29.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:20:29.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:20:29.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:20:29.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:20:29.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:20: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-05-29T14:20:29.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:20:29.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-05-29T14:20:29.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:20:29.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:20:29.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:20:29.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-05-29T14:20:32.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T14:20:32.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:20:32.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:20:32.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:20:32.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:20:32.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:20:32.380 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:20:32.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:20:32.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:20:32.381 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:20:32.381 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:20:32.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:20:32.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:20:32.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:20:32.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:20:32.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:20:32.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:20:32.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:20:32.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:20:32.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:20:32.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:20:32.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:20:32.637 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:20:32.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:20:20
2026-05-29T14:20:32.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72059, datetime.datetime(2026, 5, 29, 14, 20, 20), datetime.datetime(2026, 5, 29, 14, 20, 20), 'salt', 15.34, 46.51, None, 21.24, 29.89, 11.39, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:20:32.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:20:32.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:20:32.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:20:20, diff=12.701939s, valid=True
2026-05-29T14:20:32.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:20:32.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:20:32.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:20:12, diff=20.704783s, valid=True
2026-05-29T14:20:32.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:20:32.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:20:32.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:20:17, diff=15.711546s, valid=True
2026-05-29T14:20:32.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:20:32.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:20:32.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:20:32.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:20:32.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:20:32.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:20:32.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:20:12, diff=20.714574s, valid=True
2026-05-29T14:20:32.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:20:32.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:20:32.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:20:32.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989874.715241s, valid=True
2026-05-29T14:20:32.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:20:32.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:20:32.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:20:32.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:20:32.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:20:32.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:20:32.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:20:32.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:20:32.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:20:32.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:20:32.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:20:32.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:20:32.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:20:33.028 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:20:33.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:20:33.607 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:20:33.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:20:33.709 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:20:33.709 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:20:33.866 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:20:33.866 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:21:03.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:21:03.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:21:03.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:21:04.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:21:04.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:21:04.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:21:04.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-05-29T14:21:04.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:21:04.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-05-29T14:21:04.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:21:04.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:21:04.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:21:04.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-05-29T14:21:07.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T14:21:07.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:21:07.148 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:21:07.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:21:07.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:21:07.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:21:07.169 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:21:07.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:21:07.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:21:07.169 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:21:07.169 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:21:07.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:21:07.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:21:07.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:21:07.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:21:07.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:21:07.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:21:07.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:21:07.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:21:07.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:21:07.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:21:07.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:21:07.425 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:21:07.492 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:20:50
2026-05-29T14:21:07.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72060, datetime.datetime(2026, 5, 29, 14, 20, 50), datetime.datetime(2026, 5, 29, 14, 20, 50), 'salt', 15.44, 46.58, None, 22.44, 17.9, 11.38, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:21:07.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:21:07.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:21:07.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:20:50, diff=17.498963s, valid=True
2026-05-29T14:21:07.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:21:07.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:21:07.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:21:12, diff=-4.498193s, valid=True
2026-05-29T14:21:07.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:21:07.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:21:07.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:20:49, diff=18.508283s, valid=True
2026-05-29T14:21:07.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:21:07.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:21:07.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:21:07.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:21:07.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:21:07.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:21:07.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:21:12, diff=-4.488693s, valid=True
2026-05-29T14:21:07.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:21:07.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:21:07.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:21:07.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989909.511978s, valid=True
2026-05-29T14:21:07.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:21:07.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:21:07.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:21:07.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:21:07.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:21:07.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:21:07.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:21:07.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:21:07.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:21:07.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:21:07.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:21:07.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:21:07.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:21:07.900 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:21:08.117 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:21:08.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:21:08.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:21:08.567 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:21:08.567 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:21:08.844 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:21:08.845 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:21:38.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:21:38.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:21:38.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:21:39.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:21:39.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:21:39.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:21:39.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-05-29T14:21:39.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:21:39.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-05-29T14:21:39.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:21:39.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:21:39.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:21:39.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-05-29T14:21:42.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-05-29T14:21:42.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:21:42.131 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:21:42.131 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:21:42.139 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:21:42.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:21:42.151 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:21:42.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:21:42.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:21:42.151 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:21:42.152 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:21:42.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:21:42.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:21:42.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:21:42.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:21:42.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:21:42.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:21:42.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:21:42.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:21:42.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:21:42.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:21:42.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:21:42.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:21:42.465 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:21:21
2026-05-29T14:21:42.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72061, datetime.datetime(2026, 5, 29, 14, 21, 21), datetime.datetime(2026, 5, 29, 14, 21, 20), 'salt', 15.47, 46.51, None, 22.79, 21.04, 11.4, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:21:42.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:21:42.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:21:42.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:21:20, diff=22.471684s, valid=True
2026-05-29T14:21:42.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:21:42.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:21:42.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:21:12, diff=30.474541s, valid=True
2026-05-29T14:21:42.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:21:42.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:21:42.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:21:20, diff=22.481265s, valid=True
2026-05-29T14:21:42.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:21:42.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:21:42.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:21:42.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:21:42.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:21:42.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:21:42.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:21:12, diff=30.484311s, valid=True
2026-05-29T14:21:42.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:21:42.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:21:42.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:21:42.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989944.484981s, valid=True
2026-05-29T14:21:42.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:21:42.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:21:42.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:21:42.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:21:42.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:21:42.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:21:42.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:21:42.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:21:42.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:21:42.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:21:42.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:21:42.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:21:42.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:21:42.800 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:21:43.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:21:43.364 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:21:43.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:21:43.466 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:21:43.466 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:21:43.625 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:21:43.625 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:22:13.655 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:22:13.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:22:13.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:22:13.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:22:13.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:22:14.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:22:14.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-05-29T14:22:14.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:22:14.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-05-29T14:22:14.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:22:14.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:22:14.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:22:14.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T14:22:16.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-05-29T14:22:16.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:22:16.803 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:22:16.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:22:16.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:22:16.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:22:16.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:22:16.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:22:16.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:22:16.824 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:22:16.824 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:22:16.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:22:16.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:22:16.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:22:16.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:22:16.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:22:17.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:22:17.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:22:17.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:22:17.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:22:17.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:22:17.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:22:17.075 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:22:17.135 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:21:51
2026-05-29T14:22:17.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72062, datetime.datetime(2026, 5, 29, 14, 21, 51), datetime.datetime(2026, 5, 29, 14, 21, 50), 'salt', 15.4, 45.51, None, 18.98, 22.45, 11.69, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:22:17.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:22:17.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:22:17.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:21:50, diff=27.141931s, valid=True
2026-05-29T14:22:17.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:22:17.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:22:17.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:22:12, diff=5.144734s, valid=True
2026-05-29T14:22:17.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:22:17.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:22:17.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:21:44, diff=33.151264s, valid=True
2026-05-29T14:22:17.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:22:17.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:22:17.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:22:17.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:22:17.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:22:17.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:22:17.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:22:12, diff=5.154275s, valid=True
2026-05-29T14:22:17.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:22:17.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:22:17.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:22:17.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=989979.154934s, valid=True
2026-05-29T14:22:17.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:22:17.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:22:17.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:22:17.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:22:17.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:22:17.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:22:17.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:22:17.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:22:17.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:22:17.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:22:17.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:22:17.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:22:17.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:22:17.470 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:22:17.686 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:22:18.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:22:18.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:22:18.138 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:22:18.138 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:22:18.295 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:22:18.295 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:22:48.325 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:22:48.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:22:48.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:22:48.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:22:48.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:22:48.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:22:48.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-05-29T14:22:48.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:22:48.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-05-29T14:22:48.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:22:48.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:22:48.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:22:48.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-05-29T14:22:51.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-05-29T14:22:51.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:22:51.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:22:51.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:22:51.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:22:51.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:22:51.443 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:22:51.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:22:51.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:22:51.444 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:22:51.444 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:22:51.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:22:51.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:22:51.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:22:51.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:22:51.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:22:51.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:22:51.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:22:51.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:22:51.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:22:51.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:22:51.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:22:51.697 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:22:51.756 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:22:51
2026-05-29T14:22:51.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72064, datetime.datetime(2026, 5, 29, 14, 22, 51), datetime.datetime(2026, 5, 29, 14, 22, 51), 'salt', 15.37, 46.87, None, 25.69, 26.88, 11.28, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:22:51.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:22:51.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:22:51.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:22:51, diff=0.762493s, valid=True
2026-05-29T14:22:51.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:22:51.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:22:51.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:23:12, diff=-20.234583s, valid=True
2026-05-29T14:22:51.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:22:51.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:22:51.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:22:45, diff=6.772183s, valid=True
2026-05-29T14:22:51.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:22:51.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:22:51.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:22:51.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:22:51.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:22:51.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:22:51.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:23:12, diff=-20.2247s, valid=True
2026-05-29T14:22:51.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:22:51.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:22:51.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:22:51.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990013.775986s, valid=True
2026-05-29T14:22:51.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:22:51.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:22:51.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:22:51.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:22:51.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:22:51.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:22:51.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:22:51.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:22:51.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:22:51.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:22:51.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:22:52.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:22:52.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:22:52.095 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:22:52.311 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:22:52.721 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:22:52.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:22:52.819 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:22:52.819 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:22:52.977 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:22:52.977 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:23:22.985 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:23:22.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:23:22.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:23:23.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:23:23.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:23:23.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:23:23.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-05-29T14:23:23.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:23:23.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-05-29T14:23:23.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:23:23.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:23:23.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:23:23.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-05-29T14:23:26.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-05-29T14:23:26.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:23:26.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:23:26.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:23:26.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:23:26.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:23:26.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:23:26.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:23:26.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:23:26.106 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:23:26.107 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:23:26.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:23:26.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:23:26.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:23:26.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:23:26.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:23:26.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:23:26.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:23:26.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:23:26.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:23:26.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:23:26.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:23:26.359 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:23:26.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:23:22
2026-05-29T14:23:26.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72065, datetime.datetime(2026, 5, 29, 14, 23, 22), datetime.datetime(2026, 5, 29, 14, 23, 21), 'salt', 15.34, 45.71, None, 23.96, 31.93, 11.63, 832.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:23:26.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:23:26.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:23:26.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:23:21, diff=5.426961s, valid=True
2026-05-29T14:23:26.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:23:26.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:23:26.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:23:12, diff=14.429783s, valid=True
2026-05-29T14:23:26.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:23:26.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:23:26.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:23:16, diff=10.436376s, valid=True
2026-05-29T14:23:26.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:23:26.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:23:26.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:23:26.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:23:26.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:23:26.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:23:26.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:23:12, diff=14.439378s, valid=True
2026-05-29T14:23:26.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:23:26.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:23:26.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:23:26.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990048.440043s, valid=True
2026-05-29T14:23:26.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:23:26.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:23:26.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:23:26.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:23:26.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:23:26.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:23:26.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:23:26.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:23:26.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:23:26.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:23:26.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:23:26.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:23:26.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:23:26.755 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:23:26.990 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:23:27.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:23:27.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:23:27.438 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:23:27.438 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:23:27.597 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:23:27.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:23:57.603 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:23:57.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:23:57.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:23:58.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:23:58.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:23:58.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:23:58.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-05-29T14:23:58.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:23:58.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-05-29T14:23:58.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:23:58.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:23:58.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:23:58.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-05-29T14:24:01.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-05-29T14:24:01.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:24:01.072 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:24:01.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:24:01.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:24:01.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:24:01.093 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:24:01.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:24:01.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:24:01.094 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:24:01.094 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:24:01.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:24:01.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:24:01.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:24:01.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:24:01.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:24:01.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:24:01.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:24:01.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:24:01.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:24:01.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:24:01.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:24:01.350 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:24:01.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:23:52
2026-05-29T14:24:01.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72066, datetime.datetime(2026, 5, 29, 14, 23, 52), datetime.datetime(2026, 5, 29, 14, 23, 52), 'salt', 15.47, 45.81, None, 23.5, 39.85, 11.61, 832.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:24:01.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:24:01.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:24:01.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:23:52, diff=9.420262s, valid=True
2026-05-29T14:24:01.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:24:01.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:24:01.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:24:12, diff=-10.576871s, valid=True
2026-05-29T14:24:01.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:24:01.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:24:01.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:23:47, diff=14.429701s, valid=True
2026-05-29T14:24:01.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:24:01.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:24:01.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:24:01.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:24:01.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:24:01.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:24:01.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:24:12, diff=-10.567231s, valid=True
2026-05-29T14:24:01.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:24:01.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:24:01.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:24:01.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990083.433434s, valid=True
2026-05-29T14:24:01.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:24:01.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:24:01.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:24:01.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:24:01.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:24:01.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:24:01.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:24:01.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:24:01.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:24:01.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:24:01.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:24:01.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:24:01.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:24:01.752 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:24:02.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:24:02.422 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:24:02.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:24:02.523 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:24:02.523 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:24:02.696 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:24:02.696 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:24:32.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:24:32.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:24:32.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:24:32.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:24:32.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:24:33.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:24:33.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-05-29T14:24:33.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:24:33.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-05-29T14:24:33.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:24:33.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:24:33.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:24:33.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-05-29T14:24:35.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-05-29T14:24:35.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:24:35.835 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:24:35.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:24:35.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:24:35.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:24:35.855 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:24:35.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:24:35.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:24:35.855 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:24:35.855 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:24:35.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:24:35.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:24:35.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:24:36.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:24:36.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:24:36.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:24:36.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:24:36.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:24:36.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:24:36.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:24:36.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:24:36.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:24:36.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:24:22
2026-05-29T14:24:36.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72067, datetime.datetime(2026, 5, 29, 14, 24, 22), datetime.datetime(2026, 5, 29, 14, 24, 22), 'salt', 15.5, 46.31, None, 25.62, 22.1, 11.46, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:24:36.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:24:36.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:24:36.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:24:22, diff=14.178067s, valid=True
2026-05-29T14:24:36.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:24:36.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:24:36.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:24:12, diff=24.180929s, valid=True
2026-05-29T14:24:36.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:24:36.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:24:36.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:24:18, diff=18.190613s, valid=True
2026-05-29T14:24:36.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:24:36.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:24:36.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:24:36.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:24:36.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:24:36.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:24:36.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:24:12, diff=24.194208s, valid=True
2026-05-29T14:24:36.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:24:36.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:24:36.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:24:36.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990118.194923s, valid=True
2026-05-29T14:24:36.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:24:36.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:24:36.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:24:36.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:24:36.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:24:36.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:24:36.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:24:36.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:24:36.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:24:36.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:24:36.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:24:36.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:24:36.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:24:36.513 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:24:36.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:24:37.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:24:37.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:24:37.182 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:24:37.182 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:24:37.357 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:24:37.357 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:25:07.363 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:25:07.363 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:25:07.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:25:07.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:25:07.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:25:07.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:25:07.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-05-29T14:25:07.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:25:07.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-05-29T14:25:07.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:25:07.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:25:07.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:25:07.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-05-29T14:25:10.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-05-29T14:25:10.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:25:10.497 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:25:10.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:25:10.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:25:10.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:25:10.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:25:10.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:25:10.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:25:10.520 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:25:10.520 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:25:10.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:25:10.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:25:10.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:25:10.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:25:10.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:25:10.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:25:10.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:25:10.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:25:10.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:25:10.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:25:10.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:25:10.778 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:25:10.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:24:52
2026-05-29T14:25:10.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72068, datetime.datetime(2026, 5, 29, 14, 24, 52), datetime.datetime(2026, 5, 29, 14, 24, 52), 'salt', 15.5, 46.11, None, 22.34, 42.85, 11.52, 832.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:25:10.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:25:10.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:25:10.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:24:52, diff=18.842948s, valid=True
2026-05-29T14:25:10.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:25:10.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:25:10.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:25:12, diff=-1.154128s, valid=True
2026-05-29T14:25:10.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:25:10.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:25:10.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:24:50, diff=20.852644s, valid=True
2026-05-29T14:25:10.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:25:10.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:25:10.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:25:10.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:25:10.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:25:10.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:25:10.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:25:12, diff=-1.144226s, valid=True
2026-05-29T14:25:10.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:25:10.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:25:10.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:25:10.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990152.856446s, valid=True
2026-05-29T14:25:10.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:25:10.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:25:10.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:25:10.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:25:10.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:25:10.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:25:10.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:25:10.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:25:10.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:25:10.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:25:11.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:25:11.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:25:11.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:25:11.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:25:11.488 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:25:11.871 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:25:11.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:25:11.971 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:25:11.971 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:25:12.250 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:25:12.250 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:25:42.281 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:25:42.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:25:42.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:25:42.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:25:42.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:25:42.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:25:42.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-05-29T14:25:42.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:25:42.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-05-29T14:25:42.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:25:42.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:25:42.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:25:42.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-05-29T14:25:45.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T14:25:45.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:25:45.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:25:45.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:25:45.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:25:45.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:25:45.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:25:45.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:25:45.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:25:45.586 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:25:45.586 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:25:45.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:25:45.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:25:45.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:25:45.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:25:45.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:25:45.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:25:45.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:25:45.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:25:45.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:25:45.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:25:45.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:25:45.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:25:45.918 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:25:23
2026-05-29T14:25:45.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72069, datetime.datetime(2026, 5, 29, 14, 25, 23), datetime.datetime(2026, 5, 29, 14, 25, 22), 'salt', 15.7, 45.68, None, 18.53, 26.09, 11.67, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:25:45.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:25:45.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:25:45.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:25:22, diff=23.92509s, valid=True
2026-05-29T14:25:45.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:25:45.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:25:45.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:25:12, diff=33.927986s, valid=True
2026-05-29T14:25:45.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:25:45.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:25:45.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:25:22, diff=23.934744s, valid=True
2026-05-29T14:25:45.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:25:45.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:25:45.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:25:45.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:25:45.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:25:45.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:25:45.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:25:12, diff=33.937819s, valid=True
2026-05-29T14:25:45.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:25:45.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:25:45.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:25:45.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990187.938493s, valid=True
2026-05-29T14:25:45.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:25:45.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:25:45.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:25:45.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:25:45.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:25:45.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:25:45.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:25:45.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:25:46.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:25:46.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:25:46.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:25:46.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:25:46.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:25:46.254 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:25:46.466 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:25:46.812 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:25:46.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:25:46.911 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:25:46.912 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:25:47.128 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:25:47.128 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:26:17.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:26:17.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:26:17.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:26:17.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:26:17.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:26:17.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:26:17.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-05-29T14:26:17.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:26:17.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-05-29T14:26:17.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:26:17.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:26:17.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:26:17.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-05-29T14:26:21.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-05-29T14:26:21.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:26:21.280 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:26:21.280 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:26:21.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:26:21.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:26:21.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:26:21.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:26:21.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:26:21.300 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:26:21.300 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:26:21.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:26:21.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T14:26:21.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:26:21.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T14:26:21.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:26:21.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:26:21.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:26:21.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:26:21.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:26:21.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:26:21.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:26:21.565 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:26:21.624 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:25:53
2026-05-29T14:26:21.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72070, datetime.datetime(2026, 5, 29, 14, 25, 53), datetime.datetime(2026, 5, 29, 14, 25, 52), 'salt', 15.67, 45.65, None, 21.28, 33.99, 11.68, 832.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:26:21.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:26:21.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T14:26:21.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:25:52, diff=29.633009s, valid=True
2026-05-29T14:26:21.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:26:21.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:26:21.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:26:12, diff=9.637024s, valid=True
2026-05-29T14:26:21.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:26:21.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T14:26:21.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:25:46, diff=35.646833s, valid=True
2026-05-29T14:26:21.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:26:21.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:26:21.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:26:21.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:26:21.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:26:21.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:26:21.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:26:12, diff=9.651105s, valid=True
2026-05-29T14:26:21.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:26:21.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:26:21.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:26:21.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990223.651796s, valid=True
2026-05-29T14:26:21.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:26:21.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:26:21.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:26:21.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:26:21.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:26:21.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:26:21.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:26:21.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:26:21.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:26:21.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:26:21.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:26:21.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:26:22.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:26:22.044 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:26:22.273 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:26:22.634 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:26:22.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:26:22.745 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:26:22.745 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:26:22.898 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:26:22.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:26:52.910 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:26:52.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:26:52.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:26:53.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:26:53.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:26:53.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:26:53.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-05-29T14:26:53.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:26:53.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-05-29T14:26:53.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:26:53.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:26:53.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:26:53.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-05-29T14:26:56.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-05-29T14:26:56.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:26:56.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:26:56.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:26:56.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:26:56.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:26:56.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:26:56.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:26:56.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:26:56.390 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:26:56.390 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:26:56.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:26:56.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:26:56.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:26:56.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:26:56.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:26:56.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:26:56.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:26:56.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:26:56.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:26:56.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:26:56.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:26:56.662 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:26:56.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:26:53
2026-05-29T14:26:56.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72072, datetime.datetime(2026, 5, 29, 14, 26, 53), datetime.datetime(2026, 5, 29, 14, 26, 53), 'salt', 15.77, 43.99, None, 23.11, 29.06, 12.22, 832.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:26:56.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:26:56.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:26:56.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:26:53, diff=3.726501s, valid=True
2026-05-29T14:26:56.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:26:56.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:26:56.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:27:12, diff=-15.270672s, valid=True
2026-05-29T14:26:56.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:26:56.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:26:56.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:26:47, diff=9.736051s, valid=True
2026-05-29T14:26:56.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:26:56.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:26:56.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:26:56.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:26:56.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:26:56.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:26:56.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:27:12, diff=-15.260943s, valid=True
2026-05-29T14:26:56.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:26:56.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:26:56.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:26:56.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990258.739723s, valid=True
2026-05-29T14:26:56.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:26:56.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:26:56.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:26:56.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:26:56.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:26:56.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:26:56.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:26:56.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:26:56.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:26:56.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:26:56.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:26:56.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:26:57.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:26:57.053 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:26:57.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:26:57.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:26:57.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:26:57.712 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:26:57.712 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:26:57.975 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:26:57.975 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:27:28.005 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:27:28.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:27:28.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:27:28.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:27:28.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:27:28.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:27:28.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-05-29T14:27:28.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:27:28.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-05-29T14:27:28.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:27:28.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:27:28.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:27:28.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-05-29T14:27:31.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-05-29T14:27:31.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:27:31.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:27:31.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:27:31.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:27:31.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:27:31.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:27:31.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:27:31.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:27:31.030 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:27:31.030 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:27:31.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:27:31.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:27:31.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:27:31.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:27:31.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:27:31.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:27:31.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:27:31.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:27:31.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:27:31.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:27:31.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:27:31.286 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:27:31.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:27:23
2026-05-29T14:27:31.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72073, datetime.datetime(2026, 5, 29, 14, 27, 23), datetime.datetime(2026, 5, 29, 14, 27, 23), 'salt', 15.8, 44.09, None, 23.39, 32.42, 12.18, 832.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:27:31.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:27:31.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:27:31.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:27:23, diff=8.357937s, valid=True
2026-05-29T14:27:31.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:27:31.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:27:31.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:27:12, diff=19.360845s, valid=True
2026-05-29T14:27:31.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:27:31.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:27:31.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:27:17, diff=14.367566s, valid=True
2026-05-29T14:27:31.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:27:31.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:27:31.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:27:31.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:27:31.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:27:31.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:27:31.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:27:12, diff=19.370649s, valid=True
2026-05-29T14:27:31.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:27:31.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:27:31.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:27:31.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990293.371311s, valid=True
2026-05-29T14:27:31.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:27:31.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:27:31.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:27:31.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:27:31.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:27:31.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:27:31.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:27:31.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:27:31.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:27:31.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:27:31.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:27:31.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:27:31.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:27:31.759 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:27:31.981 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:27:32.327 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:27:32.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:27:32.431 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:27:32.431 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:27:32.646 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:27:32.646 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:28:02.675 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:28:02.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:28:02.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:28:02.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:28:02.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:28:03.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:28:03.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-05-29T14:28:03.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:28:03.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-05-29T14:28:03.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:28:03.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:28:03.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:28:03.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-05-29T14:28:06.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-05-29T14:28:06.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:28:06.631 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:28:06.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:28:06.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:28:06.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:28:06.651 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:28:06.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:28:06.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:28:06.651 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:28:06.651 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:28:06.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:28:06.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:28:06.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:28:06.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:28:06.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:28:06.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:28:06.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:28:06.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:28:06.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:28:06.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:28:06.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:28:06.915 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:28:06.978 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:27:54
2026-05-29T14:28:06.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72074, datetime.datetime(2026, 5, 29, 14, 27, 54), datetime.datetime(2026, 5, 29, 14, 27, 53), 'salt', 15.73, 44.12, None, 19.13, 24.61, 12.16, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:28:06.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:28:06.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:28:06.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:27:53, diff=13.985015s, valid=True
2026-05-29T14:28:06.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:28:06.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:28:06.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:28:12, diff=-5.012035s, valid=True
2026-05-29T14:28:06.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:28:06.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:28:06.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:27:49, diff=17.994785s, valid=True
2026-05-29T14:28:06.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:28:06.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:28:06.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:28:06.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:28:06.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:28:06.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:28:06.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:28:12, diff=-5.002068s, valid=True
2026-05-29T14:28:06.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:28:06.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:28:06.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:28:06.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990328.998591s, valid=True
2026-05-29T14:28:07.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:28:07.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:28:07.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:28:07.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:28:07.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:28:07.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:28:07.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:28:07.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:28:07.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:28:07.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:28:07.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:28:07.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:28:07.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:28:07.315 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:28:07.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:28:07.897 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:28:08.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:28:08.000 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:28:08.000 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:28:08.177 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:28:08.177 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:28:38.189 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:28:38.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:28:38.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:28:38.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:28:38.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:28:38.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:28:38.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-05-29T14:28:38.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:28:38.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-05-29T14:28:38.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:28:38.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:28:38.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:28:38.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-05-29T14:28:41.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-05-29T14:28:41.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:28:41.400 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:28:41.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:28:41.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:28:41.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:28:41.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:28:41.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:28:41.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:28:41.420 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:28:41.420 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:28:41.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:28:41.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:28:41.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:28:41.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:28:41.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:28:41.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:28:41.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:28:41.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:28:41.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:28:41.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:28:41.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:28:41.688 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:28:41.746 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:28:24
2026-05-29T14:28:41.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72075, datetime.datetime(2026, 5, 29, 14, 28, 24), datetime.datetime(2026, 5, 29, 14, 28, 24), 'salt', 15.8, 43.52, None, 20.75, 22.36, 12.37, 832.26, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:28:41.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:28:41.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:28:41.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:28:24, diff=17.752875s, valid=True
2026-05-29T14:28:41.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:28:41.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:28:41.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:28:12, diff=29.755704s, valid=True
2026-05-29T14:28:41.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:28:41.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:28:41.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:28:20, diff=21.762334s, valid=True
2026-05-29T14:28:41.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:28:41.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:28:41.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:28:41.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:28:41.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:28:41.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:28:41.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:28:12, diff=29.765339s, valid=True
2026-05-29T14:28:41.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:28:41.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:28:41.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:28:41.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990363.765988s, valid=True
2026-05-29T14:28:41.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:28:41.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:28:41.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:28:41.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:28:41.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:28:41.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:28:41.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:28:41.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:28:41.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:28:41.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:28:41.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:28:41.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:28:42.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:28:42.082 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:28:42.298 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:28:42.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:28:42.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:28:42.741 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:28:42.741 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:28:42.912 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:28:42.912 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:29:12.941 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:29:12.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:29:12.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:29:13.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:29:13.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:29:13.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:29:13.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-05-29T14:29:13.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:29:13.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-05-29T14:29:13.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:29:13.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:29:13.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:29:13.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-05-29T14:29:16.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-05-29T14:29:16.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:29:16.864 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:29:16.864 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:29:16.874 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:29:16.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:29:16.888 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:29:16.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:29:16.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:29:16.888 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:29:16.888 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:29:16.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:29:16.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:29:16.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:29:17.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:29:17.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:29:17.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:29:17.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:29:17.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:29:17.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:29:17.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:29:17.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:29:17.176 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:29:17.245 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:28:54
2026-05-29T14:29:17.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72076, datetime.datetime(2026, 5, 29, 14, 28, 54), datetime.datetime(2026, 5, 29, 14, 28, 54), 'salt', 15.6, 43.26, None, 12.88, 14.52, 12.43, 832.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:29:17.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:29:17.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:29:17.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:28:54, diff=23.252032s, valid=True
2026-05-29T14:29:17.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:29:17.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:29:17.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:29:12, diff=5.25486s, valid=True
2026-05-29T14:29:17.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:29:17.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:29:17.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:28:52, diff=25.261559s, valid=True
2026-05-29T14:29:17.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:29:17.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:29:17.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:29:17.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:29:17.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:29:17.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:29:17.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:29:12, diff=5.264586s, valid=True
2026-05-29T14:29:17.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:29:17.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:29:17.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:29:17.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990399.265254s, valid=True
2026-05-29T14:29:17.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:29:17.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:29:17.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:29:17.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:29:17.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:29:17.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:29:17.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:29:17.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:29:17.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:29:17.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:29:17.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:29:17.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:29:17.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:29:17.587 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:29:17.820 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:29:18.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:29:18.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:29:18.362 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:29:18.362 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:29:18.536 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:29:18.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:29:48.538 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:29:48.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:29:48.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:29:49.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:29:49.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:29:49.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:29:49.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-05-29T14:29:49.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:29:49.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-05-29T14:29:49.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:29:49.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:29:49.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:29:49.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-05-29T14:29: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-05-29T14:29:52.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:29:52.099 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:29:52.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:29:52.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:29:52.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:29:52.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:29:52.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:29:52.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:29:52.122 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:29:52.123 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:29:52.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:29:52.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:29:52.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:29:52.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:29:52.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:29:52.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:29:52.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:29:52.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:29:52.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:29:52.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:29:52.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:29:52.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:29:52.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:29:24
2026-05-29T14:29:52.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72077, datetime.datetime(2026, 5, 29, 14, 29, 24), datetime.datetime(2026, 5, 29, 14, 29, 24), 'salt', 15.5, 43.59, None, 15.24, 13.38, 12.32, 832.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:29:52.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:29:52.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:29:52.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:29:24, diff=28.451731s, valid=True
2026-05-29T14:29:52.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:29:52.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:29:52.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:29:12, diff=40.454585s, valid=True
2026-05-29T14:29:52.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:29:52.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:29:52.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:29:23, diff=29.461275s, valid=True
2026-05-29T14:29:52.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:29:52.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:29:52.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:29:52.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:29:52.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:29:52.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:29:52.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:29:12, diff=40.464305s, valid=True
2026-05-29T14:29:52.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:29:52.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:29:52.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:29:52.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990434.464968s, valid=True
2026-05-29T14:29:52.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:29:52.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:29:52.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:29:52.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:29:52.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:29:52.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:29:52.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:29:52.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:29:52.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:29:52.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:29:52.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:29:52.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:29:52.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:29:52.779 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:29:53.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:29:53.372 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:29:53.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:29: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-05-29T14:29: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-05-29T14:29:54.119 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:29:54.119 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:30:24.148 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:30:24.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:30:24.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:30:24.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:30:24.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:30:24.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:30:24.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-05-29T14:30:24.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:30:24.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-05-29T14:30:24.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:30:24.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:30:24.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:30:24.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-05-29T14:30: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-05-29T14:30:27.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:30:27.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:30:27.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:30:27.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:30:27.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:30:27.312 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:30:27.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:30:27.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:30:27.313 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:30:27.313 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:30:27.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:30:27.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:30:27.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:30:27.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:30:27.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:30:27.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:30:27.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:30:27.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:30:27.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:30:27.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:30:27.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:30:27.567 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:30:27.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:30:25
2026-05-29T14:30:27.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72079, datetime.datetime(2026, 5, 29, 14, 30, 25), datetime.datetime(2026, 5, 29, 14, 30, 24), 'salt', 15.44, 44.68, None, 25.16, 37.65, 11.97, 832.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:30:27.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:30:27.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:30:27.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:30:24, diff=3.633116s, valid=True
2026-05-29T14:30:27.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:30:27.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:30:27.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:30:12, diff=15.635945s, valid=True
2026-05-29T14:30:27.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:30:27.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:30:27.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:30:19, diff=8.642592s, valid=True
2026-05-29T14:30:27.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:30:27.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:30:27.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:30:27.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:30:27.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:30:27.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:30:27.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:30:12, diff=15.645587s, valid=True
2026-05-29T14:30:27.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:30:27.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:30:27.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:30:27.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990469.646246s, valid=True
2026-05-29T14:30:27.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:30:27.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:30:27.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:30:27.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:30:27.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:30:27.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:30:27.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:30:27.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:30:27.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:30:27.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:30:27.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:30:27.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:30:27.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:30:27.962 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:30:28.251 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:30:28.599 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:30:28.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:30:28.699 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:30:28.699 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:30:28.863 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:30:28.863 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:30:58.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:30:58.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:30:58.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:30:59.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:30:59.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:30:59.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:30:59.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-05-29T14:30:59.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:30:59.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-05-29T14:30:59.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:30:59.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:30:59.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:30:59.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-05-29T14:31:02.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-05-29T14:31:02.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:31:02.866 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:31:02.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:31:02.874 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:31:02.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:31:02.887 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:31:02.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:31:02.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:31:02.887 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:31:02.887 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:31:02.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:31:02.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:31:02.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:31:03.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:31:03.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:31:03.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:31:03.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:31:03.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:31:03.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:31:03.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:31:03.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:31:03.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:31:03.224 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:30:55
2026-05-29T14:31:03.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72080, datetime.datetime(2026, 5, 29, 14, 30, 55), datetime.datetime(2026, 5, 29, 14, 30, 55), 'salt', 15.27, 46.18, None, 17.93, 33.31, 11.48, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:31:03.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:31:03.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:31:03.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:30:55, diff=8.23058s, valid=True
2026-05-29T14:31:03.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:31:03.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:31:03.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:31:12, diff=-8.766431s, valid=True
2026-05-29T14:31:03.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:31:03.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:31:03.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:30:50, diff=13.24023s, valid=True
2026-05-29T14:31:03.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:31:03.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:31:03.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:31:03.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:31:03.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:31:03.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:31:03.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:31:12, diff=-8.756644s, valid=True
2026-05-29T14:31:03.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:31:03.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:31:03.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:31:03.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990505.244016s, valid=True
2026-05-29T14:31:03.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:31:03.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:31:03.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:31:03.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:31:03.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:31:03.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:31:03.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:31:03.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:31:03.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:31:03.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:31:03.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:31:03.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:31:03.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:31:03.561 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:31:03.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:31:04.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:31:04.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:31:04.226 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:31:04.226 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:31:04.468 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:31:04.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:31:34.480 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:31:34.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:31:34.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:31:35.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:31:35.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:31:35.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:31:35.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-05-29T14:31:35.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:31:35.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-05-29T14:31:35.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:31:35.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:31:35.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:31:35.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-05-29T14:31:37.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-05-29T14:31:37.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:31:37.949 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:31:37.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:31:37.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:31:37.972 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:31:37.972 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:31:37.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:31:37.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:31:37.972 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:31:37.972 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:31:37.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:31:38.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:31:38.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:31:38.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:31:38.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:31:38.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:31:38.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:31:38.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:31:38.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:31:38.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:31:38.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:31:38.229 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:31:38.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:31:25
2026-05-29T14:31:38.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72081, datetime.datetime(2026, 5, 29, 14, 31, 25), datetime.datetime(2026, 5, 29, 14, 31, 25), 'salt', 15.37, 47.04, None, 20.75, 43.67, 11.23, 832.26, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:31:38.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:31:38.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:31:38.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:31:25, diff=13.296109s, valid=True
2026-05-29T14:31:38.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:31:38.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:31:38.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:31:12, diff=26.298936s, valid=True
2026-05-29T14:31:38.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:31:38.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:31:38.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:31:20, diff=18.305519s, valid=True
2026-05-29T14:31:38.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:31:38.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:31:38.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:31:38.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:31:38.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:31:38.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:31:38.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:31:12, diff=26.308544s, valid=True
2026-05-29T14:31:38.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:31:38.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:31:38.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:31:38.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990540.309213s, valid=True
2026-05-29T14:31:38.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:31:38.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:31:38.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:31:38.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:31:38.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:31:38.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:31:38.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:31:38.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:31:38.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:31:38.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:31:38.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:31:38.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:31:38.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:31:38.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:31:38.905 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:31:39.254 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:31:39.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:31:39.355 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:31:39.355 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:31:39.526 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:31:39.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:32:09.556 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:32:09.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:32:09.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:32:09.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:32:09.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:32:09.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:32:09.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-05-29T14:32:09.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:32:09.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-05-29T14:32:09.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:32:09.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:32:09.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:32:09.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-05-29T14:32:12.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-05-29T14:32:12.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:32:12.615 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:32:12.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:32:12.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:32:12.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:32:12.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:32:12.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:32:12.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:32:12.636 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:32:12.636 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:32:12.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:32:12.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:32:12.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:32:12.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:32:12.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:32:12.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:32:12.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:32:12.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:32:12.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:32:12.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:32:12.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:32:12.915 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:32:12.978 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:31:56
2026-05-29T14:32:12.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72082, datetime.datetime(2026, 5, 29, 14, 31, 56), datetime.datetime(2026, 5, 29, 14, 31, 55), 'salt', 15.4, 45.98, None, 23.92, 36.17, 11.55, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:32:12.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:32:12.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:32:12.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:31:55, diff=17.984527s, valid=True
2026-05-29T14:32:12.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:32:12.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:32:12.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:32:12, diff=0.987373s, valid=True
2026-05-29T14:32:12.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:32:12.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:32:12.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:31:50, diff=22.994029s, valid=True
2026-05-29T14:32:12.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:32:12.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:32:12.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:32:12.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:32:12.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:32:12.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:32:12.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:32:12, diff=0.997015s, valid=True
2026-05-29T14:32:12.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:32:12.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:32:12.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:32:12.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990574.997673s, valid=True
2026-05-29T14:32:12.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:32:12.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:32:12.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:32:12.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:32:12.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:32:13.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:32:13.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:32:13.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:32:13.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:32:13.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:32:13.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:32:13.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:32:13.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:32:13.311 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:32:13.528 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:32:13.880 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:32:13.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:32:13.979 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:32:13.979 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:32:14.269 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:32:14.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:32:44.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:32:44.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:32:44.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:32:44.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:32:44.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:32:44.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:32:44.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-05-29T14:32:44.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:32:44.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-05-29T14:32:44.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:32:44.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:32:44.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:32:44.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-05-29T14:32:47.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-05-29T14:32:47.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:32:47.562 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:32:47.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:32:47.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:32:47.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:32:47.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:32:47.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:32:47.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:32:47.584 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:32:47.584 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:32:47.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:32:47.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:32:47.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:32:47.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:32:47.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:32:47.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:32:47.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:32:47.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:32:47.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:32:47.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:32:47.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:32:47.859 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:32:47.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:32:26
2026-05-29T14:32:47.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72083, datetime.datetime(2026, 5, 29, 14, 32, 26), datetime.datetime(2026, 5, 29, 14, 32, 25), 'salt', 15.27, 45.65, None, 21.52, 40.41, 11.65, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:32:47.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:32:47.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:32:47.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:32:25, diff=22.930304s, valid=True
2026-05-29T14:32:47.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:32:47.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:32:47.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:32:12, diff=35.933197s, valid=True
2026-05-29T14:32:47.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:32:47.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:32:47.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:32:22, diff=25.939967s, valid=True
2026-05-29T14:32:47.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:32:47.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:32:47.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:32:47.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:32:47.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:32:47.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:32:47.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:32:12, diff=35.943046s, valid=True
2026-05-29T14:32:47.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:32:47.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:32:47.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:32:47.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990609.943715s, valid=True
2026-05-29T14:32:47.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:32:47.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:32:47.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:32:47.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:32:47.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:32:48.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:32:48.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:32:48.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:32:48.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:32:48.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:32:48.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:32:48.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:32:48.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:32:48.334 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:32:48.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:32:48.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:32:49.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:32:49.027 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:32:49.027 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:32:49.289 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:32:49.289 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:33:19.319 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:33:19.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:33:19.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:33:19.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:33:19.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:33:19.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:33:19.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-05-29T14:33:19.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:33:19.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-05-29T14:33:19.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:33:19.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:33:19.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:33:19.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-05-29T14:33:22.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-05-29T14:33:22.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:33:22.323 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:33:22.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:33:22.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:33:22.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:33:22.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:33:22.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:33:22.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:33:22.344 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:33:22.344 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:33:22.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:33:22.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:33:22.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:33:22.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:33:22.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:33:22.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:33:22.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:33:22.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:33:22.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:33:22.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:33:22.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:33:22.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:33:22.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:32:56
2026-05-29T14:33:22.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72084, datetime.datetime(2026, 5, 29, 14, 32, 56), datetime.datetime(2026, 5, 29, 14, 32, 56), 'salt', 15.17, 46.14, None, 16.37, 32.63, 11.48, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:33:22.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:33:22.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:33:22.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:32:56, diff=26.683834s, valid=True
2026-05-29T14:33:22.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:33:22.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:33:22.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:33:12, diff=10.686704s, valid=True
2026-05-29T14:33:22.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:33:22.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:33:22.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:32:53, diff=29.693378s, valid=True
2026-05-29T14:33:22.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:33:22.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:33:22.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:33:22.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:33:22.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:33:22.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:33:22.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:33:12, diff=10.696502s, valid=True
2026-05-29T14:33:22.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:33:22.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:33:22.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:33:22.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990644.697185s, valid=True
2026-05-29T14:33:22.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:33:22.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:33:22.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:33:22.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:33:22.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:33:22.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:33:22.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:33:22.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:33:22.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:33:22.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:33:22.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:33:22.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:33:22.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:33:23.024 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:33:23.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:33:23.611 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:33:23.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:33:23.714 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:33:23.714 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:33:23.947 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:33:23.947 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:33:53.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:33:53.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:33:53.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:33:54.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:33:54.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:33:54.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:33:54.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-05-29T14:33:54.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:33:54.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-05-29T14:33:54.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:33:54.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:33:54.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:33:54.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-05-29T14:33:57.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-05-29T14:33:57.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:33:57.301 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:33:57.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:33:57.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:33:57.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:33:57.327 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:33:57.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:33:57.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:33:57.327 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:33:57.328 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:33:57.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:33:57.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:33:57.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:33:57.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:33:57.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:33:57.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:33:57.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:33:57.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:33:57.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:33:57.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:33:57.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:33:57.613 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:33:57.671 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:33:56
2026-05-29T14:33:57.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72086, datetime.datetime(2026, 5, 29, 14, 33, 56), datetime.datetime(2026, 5, 29, 14, 33, 56), 'salt', 15.3, 47.0, None, 20.08, 33.1, 11.23, 832.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:33:57.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:33:57.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:33:57.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:33:56, diff=1.677435s, valid=True
2026-05-29T14:33:57.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:33:57.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:33:57.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:34:12, diff=-14.319733s, valid=True
2026-05-29T14:33:57.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:33:57.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:33:57.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:33:51, diff=6.688711s, valid=True
2026-05-29T14:33:57.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:33:57.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:33:57.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:33:57.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:33:57.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:33:57.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:33:57.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:34:12, diff=-14.306612s, valid=True
2026-05-29T14:33:57.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:33:57.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:33:57.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:33:57.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990679.694511s, valid=True
2026-05-29T14:33:57.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:33:57.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:33:57.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:33:57.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:33:57.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:33:57.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:33:57.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:33:57.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:33:57.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:33:57.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:33:57.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:33:57.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:33:58.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:33:58.090 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:33:58.320 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:33:58.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:33:58.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:33:58.787 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:33:58.787 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:33:59.049 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:33:59.049 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:34:29.055 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:34:29.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:34:29.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:34:29.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:34:29.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:34:29.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:34:29.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-05-29T14:34:29.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:34:29.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-05-29T14:34:29.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:34:29.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:34:29.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:34:29.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-05-29T14:34:32.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-05-29T14:34:32.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:34:32.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:34:32.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:34:32.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:34:32.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:34:32.247 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:34:32.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:34:32.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:34:32.248 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:34:32.248 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:34:32.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:34:32.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:34:32.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:34:32.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:34:32.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:34:32.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:34:32.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:34:32.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:34:32.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:34:32.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:34:32.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:34:32.560 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:34:32.622 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:34:27
2026-05-29T14:34:32.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72087, datetime.datetime(2026, 5, 29, 14, 34, 27), datetime.datetime(2026, 5, 29, 14, 34, 26), 'salt', 15.44, 46.44, None, 19.65, 35.77, 11.42, 832.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:34:32.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:34:32.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:34:32.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:34:26, diff=6.631682s, valid=True
2026-05-29T14:34:32.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:34:32.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:34:32.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:34:12, diff=20.634559s, valid=True
2026-05-29T14:34:32.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:34:32.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:34:32.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:34:22, diff=10.641385s, valid=True
2026-05-29T14:34:32.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:34:32.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:34:32.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:34:32.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:34:32.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:34:32.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:34:32.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:34:12, diff=20.645552s, valid=True
2026-05-29T14:34:32.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:34:32.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:34:32.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:34:32.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990714.646745s, valid=True
2026-05-29T14:34:32.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:34:32.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:34:32.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:34:32.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:34:32.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:34:32.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:34:32.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:34:32.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:34:32.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:34:32.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:34:32.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:34:32.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:34:32.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:34:33.020 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:34:33.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:34:33.621 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:34:33.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:34:33.724 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:34:33.724 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:34:33.954 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:34:33.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:35:03.978 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:35:03.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:35:03.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:35:04.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:35:04.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:35:04.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:35:04.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-05-29T14:35:04.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:35:04.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-05-29T14:35:04.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:35:04.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:35:04.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:35:04.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T14:35:07.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T14:35:07.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:35:07.123 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:35:07.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:35:07.131 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:35:07.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:35:07.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:35:07.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:35:07.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:35:07.143 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:35:07.143 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:35:07.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:35:07.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:35:07.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:35:07.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:35:07.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:35:07.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:35:07.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:35:07.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:35:07.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:35:07.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:35:07.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:35:07.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:35:07.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:34:57
2026-05-29T14:35:07.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72088, datetime.datetime(2026, 5, 29, 14, 34, 57), datetime.datetime(2026, 5, 29, 14, 34, 56), 'salt', 15.37, 45.08, None, 19.3, 43.23, 11.83, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:35:07.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:35:07.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:35:07.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:34:56, diff=11.463037s, valid=True
2026-05-29T14:35:07.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:35:07.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:35:07.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:35:12, diff=-4.534173s, valid=True
2026-05-29T14:35:07.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:35:07.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:35:07.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:34:52, diff=15.472377s, valid=True
2026-05-29T14:35:07.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:35:07.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:35:07.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:35:07.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:35:07.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:35:07.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:35:07.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:35:12, diff=-4.524604s, valid=True
2026-05-29T14:35:07.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:35:07.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:35:07.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:35:07.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990749.476053s, valid=True
2026-05-29T14:35:07.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:35:07.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:35:07.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:35:07.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:35:07.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:35:07.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:35:07.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:35:07.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:35:07.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:35:07.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:35:07.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:35:07.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:35:07.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:35:07.803 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:35:08.022 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:35:08.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:35:08.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:35:08.485 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:35:08.485 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:35:08.660 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:35:08.660 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:35:38.690 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:35:38.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:35:38.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:35:39.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:35:39.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:35:39.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:35:39.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-05-29T14:35:39.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:35:39.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-05-29T14:35:39.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:35:39.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:35:39.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:35:39.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-05-29T14:35:42.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-05-29T14:35:42.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:35:42.100 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:35:42.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:35:42.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:35:42.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:35:42.120 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:35:42.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:35:42.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:35:42.120 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:35:42.120 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:35:42.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:35:42.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:35:42.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:35:42.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:35:42.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:35:42.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:35:42.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:35:42.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:35:42.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:35:42.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:35:42.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:35:42.374 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:35:42.433 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:35:27
2026-05-29T14:35:42.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72089, datetime.datetime(2026, 5, 29, 14, 35, 27), datetime.datetime(2026, 5, 29, 14, 35, 27), 'salt', 15.34, 45.65, None, 16.3, 43.51, 11.66, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:35:42.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:35:42.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:35:42.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:35:27, diff=15.439937s, valid=True
2026-05-29T14:35:42.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:35:42.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:35:42.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:35:12, diff=30.442818s, valid=True
2026-05-29T14:35:42.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:35:42.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:35:42.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:35:22, diff=20.449408s, valid=True
2026-05-29T14:35:42.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:35:42.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:35:42.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:35:42.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:35:42.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:35:42.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:35:42.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:35:12, diff=30.453571s, valid=True
2026-05-29T14:35:42.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:35:42.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:35:42.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:35:42.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990784.454673s, valid=True
2026-05-29T14:35:42.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:35:42.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:35:42.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:35:42.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:35:42.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:35:42.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:35:42.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:35:42.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:35:42.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:35:42.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:35:42.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:35:42.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:35:42.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:35:42.779 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:35:42.998 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:35:43.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:35:43.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:35:43.515 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:35:43.515 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:35:43.683 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:35:43.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:36:13.713 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:36:13.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:36:13.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:36:14.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:36:14.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:36:14.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:36:14.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-05-29T14:36:14.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:36:14.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-05-29T14:36:14.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:36:14.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:36:14.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:36:14.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T14:36:16.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-05-29T14:36:16.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:36:16.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:36:16.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:36:16.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:36:16.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:36:16.916 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:36:16.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:36:16.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:36:16.917 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:36:16.917 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:36:16.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:36:17.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:36:17.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:36:17.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:36:17.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:36:17.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:36:17.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:36:17.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:36:17.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:36:17.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:36:17.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:36:17.174 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:36:17.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:35:57
2026-05-29T14:36:17.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72090, datetime.datetime(2026, 5, 29, 14, 35, 57), datetime.datetime(2026, 5, 29, 14, 35, 57), 'salt', 15.27, 45.81, None, 18.84, 34.27, 11.59, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:36:17.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:36:17.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:36:17.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:35:57, diff=20.237423s, valid=True
2026-05-29T14:36:17.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:36:17.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:36:17.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:36:12, diff=5.240257s, valid=True
2026-05-29T14:36:17.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:36:17.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:36:17.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:35:52, diff=25.246989s, valid=True
2026-05-29T14:36:17.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:36:17.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:36:17.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:36:17.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:36:17.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:36:17.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:36:17.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:36:12, diff=5.249984s, valid=True
2026-05-29T14:36:17.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:36:17.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:36:17.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:36:17.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990819.250638s, valid=True
2026-05-29T14:36:17.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:36:17.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:36:17.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:36:17.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:36:17.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:36:17.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:36:17.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:36:17.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:36:17.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:36:17.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:36:17.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:36:17.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:36:17.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:36:17.563 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:36:17.796 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:36:18.144 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:36:18.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:36:18.245 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:36:18.245 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:36:18.420 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:36:18.420 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:36:48.450 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:36:48.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:36:48.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:36:48.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:36:48.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:36:48.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:36:48.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-05-29T14:36:48.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:36:48.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-05-29T14:36:48.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:36:48.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:36:48.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:36: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-05-29T14:36:51.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-05-29T14:36:51.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:36:51.888 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:36:51.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:36:51.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:36:51.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:36:51.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:36:51.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:36:51.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:36:51.909 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:36:51.909 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:36:51.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:36:52.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:36:52.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:36:52.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:36:52.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:36:52.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:36:52.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:36:52.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:36:52.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:36:52.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:36:52.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:36:52.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:36:52.280 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:36:28
2026-05-29T14:36:52.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72091, datetime.datetime(2026, 5, 29, 14, 36, 28), datetime.datetime(2026, 5, 29, 14, 36, 27), 'salt', 15.37, 47.07, None, 25.65, 27.3, 11.22, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:36:52.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:36:52.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:36:52.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:36:27, diff=25.287729s, valid=True
2026-05-29T14:36:52.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:36:52.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:36:52.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:36:12, diff=40.291151s, valid=True
2026-05-29T14:36:52.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:36:52.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:36:52.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:36:23, diff=29.299111s, valid=True
2026-05-29T14:36:52.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:36:52.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:36:52.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:36:52.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:36:52.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:36:52.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:36:52.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:36:12, diff=40.302769s, valid=True
2026-05-29T14:36:52.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:36:52.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:36:52.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:36:52.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990854.303555s, valid=True
2026-05-29T14:36:52.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:36:52.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:36:52.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:36:52.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:36:52.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:36:52.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:36:52.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:36:52.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:36:52.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:36:52.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:36:52.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:36:52.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:36:52.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:36:52.625 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:36:52.944 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:36:53.292 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:36:53.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:36:53.393 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:36:53.393 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:36:53.570 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:36:53.570 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:37:23.585 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:37:23.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:37:23.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:37:23.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:37:23.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:37:24.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:37:24.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-05-29T14:37:24.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:37:24.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-05-29T14:37:24.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:37:24.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:37:24.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:37:24.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-05-29T14:37:26.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-05-29T14:37:26.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:37:26.860 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:37:26.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:37:26.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:37:26.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:37:26.880 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:37:26.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:37:26.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:37:26.880 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:37:26.880 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:37:26.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:37:26.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:37:26.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:37:27.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:37:27.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:37:27.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:37:27.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:37:27.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:37:27.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:37:27.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:37:27.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:37:27.130 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:37:27.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:36:58
2026-05-29T14:37:27.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72092, datetime.datetime(2026, 5, 29, 14, 36, 58), datetime.datetime(2026, 5, 29, 14, 36, 57), 'salt', 15.47, 45.55, None, 24.91, 20.25, 11.7, 832.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:37:27.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:37:27.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:37:27.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:36:57, diff=30.194408s, valid=True
2026-05-29T14:37:27.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:37:27.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:37:27.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:37:12, diff=15.197219s, valid=True
2026-05-29T14:37:27.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:37:27.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:37:27.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:36:54, diff=33.204064s, valid=True
2026-05-29T14:37:27.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:37:27.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:37:27.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:37:27.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:37:27.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:37:27.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:37:27.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:37:12, diff=15.207099s, valid=True
2026-05-29T14:37:27.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:37:27.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:37:27.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:37:27.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990889.207764s, valid=True
2026-05-29T14:37:27.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:37:27.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:37:27.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:37:27.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:37:27.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:37:27.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:37:27.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:37:27.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:37:27.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:37:27.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:37:27.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:37:27.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:37:27.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:37:27.525 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:37:27.731 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:37:28.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:37:28.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:37:28.177 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:37:28.177 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:37:28.457 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:37:28.457 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:37:58.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:37:58.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:37:58.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:37:58.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:37:58.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:37:58.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:37: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-05-29T14:37:58.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:37:58.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-05-29T14:37:58.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:37:58.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:37:58.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:37:58.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-05-29T14:38:01.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-05-29T14:38:01.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:38:01.720 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:38:01.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:38:01.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:38:01.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:38:01.741 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:38:01.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:38:01.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:38:01.742 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:38:01.742 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:38:01.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:38:01.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:38:01.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:38:01.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:38:01.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:38:01.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:38:01.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:38:01.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:38:01.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:38:02.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:38:02.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:38:02.001 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:38:02.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:37:58
2026-05-29T14:38:02.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72094, datetime.datetime(2026, 5, 29, 14, 37, 58), datetime.datetime(2026, 5, 29, 14, 37, 58), 'salt', 15.5, 44.82, None, 22.05, 34.57, 11.92, 832.02, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:38:02.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:38:02.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:38:02.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:37:58, diff=4.069942s, valid=True
2026-05-29T14:38:02.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:38:02.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:38:02.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:38:12, diff=-9.925702s, valid=True
2026-05-29T14:38:02.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:38:02.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:38:02.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:37:57, diff=5.084199s, valid=True
2026-05-29T14:38:02.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:38:02.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:38:02.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:38:02.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:38:02.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:38:02.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:38:02.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:38:12, diff=-9.912667s, valid=True
2026-05-29T14:38:02.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:38:02.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:38:02.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:38:02.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990924.088s, valid=True
2026-05-29T14:38:02.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:38:02.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:38:02.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:38:02.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:38:02.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:38:02.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:38:02.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:38:02.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:38:02.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:38:02.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:38:02.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:38:02.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:38:02.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:38:02.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:38:02.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:38:03.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:38:03.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:38:03.155 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:38:03.155 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:38:03.368 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:38:03.368 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:38:33.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:38:33.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:38:33.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:38:33.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:38:33.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:38:33.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:38:33.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-05-29T14:38:33.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:38:33.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-05-29T14:38:33.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:38:33.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:38:33.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:38:33.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-05-29T14:38:36.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-05-29T14:38:36.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:38:36.492 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:38:36.492 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:38:36.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:38:36.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:38:36.512 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:38:36.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:38:36.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:38:36.512 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:38:36.512 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:38:36.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:38:36.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:38:36.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:38:36.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:38:36.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:38:36.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:38:36.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:38:36.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:38:36.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:38:36.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:38:36.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:38:36.767 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:38:36.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:38:28
2026-05-29T14:38:36.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72095, datetime.datetime(2026, 5, 29, 14, 38, 28), datetime.datetime(2026, 5, 29, 14, 38, 28), 'salt', 15.7, 46.14, None, 22.62, 24.96, 11.53, 832.02, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:38:36.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:38:36.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:38:36.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:38:28, diff=8.832753s, valid=True
2026-05-29T14:38:36.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:38:36.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:38:36.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:38:12, diff=24.835644s, valid=True
2026-05-29T14:38:36.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:38:36.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:38:36.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:38:24, diff=12.84227s, valid=True
2026-05-29T14:38:36.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:38:36.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:38:36.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:38:36.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:38:36.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:38:36.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:38:36.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:38:12, diff=24.845342s, valid=True
2026-05-29T14:38:36.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:38:36.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:38:36.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:38:36.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990958.846028s, valid=True
2026-05-29T14:38:36.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:38:36.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:38:36.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:38:36.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:38:36.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:38:36.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:38:36.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:38:36.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:38:36.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:38:36.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:38:37.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:38:37.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:38:37.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:38:37.161 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:38:37.368 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:38:37.708 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:38:37.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:38:37.808 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:38:37.808 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:38:38.079 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:38:38.079 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:39:08.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:39:08.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:39:08.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:39:08.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:39:08.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:39:08.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:39:08.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-05-29T14:39:08.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:39:08.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-05-29T14:39:08.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:39:08.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:39:08.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:39:08.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-05-29T14:39:11.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-05-29T14:39:11.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:39:11.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:39:11.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:39:11.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:39:11.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:39:11.295 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:39:11.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:39:11.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:39:11.296 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:39:11.296 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:39:11.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:39:11.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:39:11.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:39:11.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:39:11.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:39:11.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:39:11.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:39:11.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:39:11.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:39:11.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:39:11.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:39:11.552 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:39:11.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:38:59
2026-05-29T14:39:11.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72096, datetime.datetime(2026, 5, 29, 14, 38, 59), datetime.datetime(2026, 5, 29, 14, 38, 58), 'salt', 15.67, 45.28, None, 21.17, 30.92, 11.8, 832.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:39:11.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:39:11.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:39:11.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:38:58, diff=13.616615s, valid=True
2026-05-29T14:39:11.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:39:11.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:39:11.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:39:12, diff=-0.380528s, valid=True
2026-05-29T14:39:11.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:39:11.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:39:11.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:38:54, diff=17.626021s, valid=True
2026-05-29T14:39:11.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:39:11.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:39:11.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:39:11.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:39:11.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:39:11.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:39:11.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:39:12, diff=-0.370895s, valid=True
2026-05-29T14:39:11.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:39:11.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:39:11.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:39:11.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=990993.629781s, valid=True
2026-05-29T14:39:11.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:39:11.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:39:11.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:39:11.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:39:11.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:39:11.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:39:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:39:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:39:11.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:39:11.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:39:11.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:39:11.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:39:11.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:39:12.019 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:39:12.229 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:39:12.571 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:39:12.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:39:12.673 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:39:12.673 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:39:12.947 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:39:12.947 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:39:42.977 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:39:42.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:39:42.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:39:43.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:39:43.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:39:43.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:39:43.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-05-29T14:39:43.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:39:43.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-05-29T14:39:43.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:39:43.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:39:43.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:39:43.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-05-29T14:39:46.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-05-29T14:39:46.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:39:46.657 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:39:46.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:39:46.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:39:46.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:39:46.677 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:39:46.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:39:46.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:39:46.677 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:39:46.677 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:39:46.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:39:46.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:39:46.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:39:46.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:39:46.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:39:46.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:39:46.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:39:46.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:39:46.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:39:46.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:39:46.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:39:46.937 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:39:46.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:39:29
2026-05-29T14:39:46.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72097, datetime.datetime(2026, 5, 29, 14, 39, 29), datetime.datetime(2026, 5, 29, 14, 39, 29), 'salt', 15.73, 43.86, None, 22.34, 28.34, 12.25, 832.26, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:39:46.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:39:46.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:39:47.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:39:29, diff=18.0016s, valid=True
2026-05-29T14:39:47.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:39:47.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:39:47.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:39:12, diff=35.00445s, valid=True
2026-05-29T14:39:47.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:39:47.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:39:47.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:39:24, diff=23.011103s, valid=True
2026-05-29T14:39:47.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:39:47.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:39:47.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:39:47.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:39:47.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:39:47.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:39:47.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:39:12, diff=35.014129s, valid=True
2026-05-29T14:39:47.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:39:47.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:39:47.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:39:47.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991029.014805s, valid=True
2026-05-29T14:39:47.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:39:47.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:39:47.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:39:47.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:39:47.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:39:47.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:39:47.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:39:47.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:39:47.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:39:47.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:39:47.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:39:47.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:39:47.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:39:47.331 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:39:47.537 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:39:47.879 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:39:47.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:39:47.981 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:39:47.982 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:39:48.248 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:39:48.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:40:18.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:40:18.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:40:18.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:40:18.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:40:18.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:40:19.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:40:19.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-05-29T14:40:19.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:40:19.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-05-29T14:40:19.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:40:19.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:40:19.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:40:19.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-05-29T14:40:21.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-05-29T14:40:21.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:40:21.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:40:21.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:40:21.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:40:21.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:40:21.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:40:21.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:40:21.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:40:21.765 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:40:21.765 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:40:21.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:40:21.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:40:21.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:40:21.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:40:21.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:40:21.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:40:21.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:40:22.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:40:22.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:40:22.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:40:22.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:40:22.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:40:22.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:39:59
2026-05-29T14:40:22.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72098, datetime.datetime(2026, 5, 29, 14, 39, 59), datetime.datetime(2026, 5, 29, 14, 39, 59), 'salt', 15.8, 43.86, None, 19.8, 23.2, 12.26, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:40:22.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:40:22.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:40:22.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:39:59, diff=23.108648s, valid=True
2026-05-29T14:40:22.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:40:22.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:40:22.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:40:12, diff=10.11185s, valid=True
2026-05-29T14:40:22.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:40:22.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:40:22.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:39:54, diff=28.119377s, valid=True
2026-05-29T14:40:22.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:40:22.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:40:22.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:40:22.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:40:22.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:40:22.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:40:22.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:40:12, diff=10.122698s, valid=True
2026-05-29T14:40:22.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:40:22.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:40:22.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:40:22.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991064.123414s, valid=True
2026-05-29T14:40:22.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:40:22.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:40:22.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:40:22.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:40:22.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:40:22.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:40:22.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:40:22.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:40:22.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:40:22.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:40:22.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:40:22.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:40:22.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:40:22.511 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:40:22.769 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:40:23.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:40:23.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:40:23.206 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:40:23.206 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:40:23.473 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:40:23.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:40:53.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:40:53.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:40:53.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:40:53.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:40:53.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:40:53.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:40:53.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-05-29T14:40:53.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:40:53.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-05-29T14:40:53.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:40:53.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:40:53.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:40:53.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-05-29T14:40:56.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-05-29T14:40:56.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:40:56.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:40:56.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:40:56.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:40:56.643 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:40:56.643 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:40:56.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:40:56.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:40:56.643 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:40:56.643 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:40:56.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:40:56.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:40:56.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:40:56.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:40:56.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:40:56.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:40:56.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:40:56.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:40:56.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:40:56.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:40:56.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:40:56.902 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:40:56.973 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:40:29
2026-05-29T14:40:56.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72099, datetime.datetime(2026, 5, 29, 14, 40, 29), datetime.datetime(2026, 5, 29, 14, 40, 29), 'salt', 15.63, 43.89, None, 20.4, 33.85, 12.23, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:40:56.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:40:56.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:40:56.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:40:29, diff=27.980011s, valid=True
2026-05-29T14:40:56.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:40:56.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:40:56.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:40:12, diff=44.982928s, valid=True
2026-05-29T14:40:56.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:40:56.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:40:56.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:40:25, diff=31.98979s, valid=True
2026-05-29T14:40:56.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:40:56.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:40:56.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:40:56.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:40:56.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:40:56.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:40:56.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:40:12, diff=44.993043s, valid=True
2026-05-29T14:40:56.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:40:56.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:40:56.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:40:56.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991098.993755s, valid=True
2026-05-29T14:40:56.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:40:56.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:40:56.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:40:56.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:40:56.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:40:57.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:40:57.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:40:57.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:40:57.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:40:57.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:40:57.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:40:57.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:40:57.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:40:57.323 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:40:57.558 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:40:57.912 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:40:58.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:40:58.014 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:40:58.014 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:40:58.170 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:40:58.170 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:41:28.200 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:41:28.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:41:28.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:41:28.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:41:28.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:41:28.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:41:28.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-05-29T14:41:28.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:41:28.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-05-29T14:41:28.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:41:28.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:41:28.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:41:28.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-05-29T14:41:31.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-05-29T14:41:31.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:41:31.967 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:41:31.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:41:31.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:41:31.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:41:31.986 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:41:31.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:41:31.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:41:31.986 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:41:31.986 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:41:31.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:41:32.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:41:32.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:41:32.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:41:32.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:41:32.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:41:32.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:41:32.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:41:32.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:41:32.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:41:32.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:41:32.313 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:41:32.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:41:30
2026-05-29T14:41:32.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72101, datetime.datetime(2026, 5, 29, 14, 41, 30), datetime.datetime(2026, 5, 29, 14, 41, 29), 'salt', 15.6, 44.45, None, 21.84, 41.75, 12.05, 831.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:41:32.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:41:32.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:41:32.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:41:29, diff=3.38646s, valid=True
2026-05-29T14:41:32.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:41:32.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:41:32.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:41:12, diff=20.389356s, valid=True
2026-05-29T14:41:32.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:41:32.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:41:32.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:41:27, diff=5.395937s, valid=True
2026-05-29T14:41:32.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:41:32.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:41:32.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:41:32.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:41:32.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:41:32.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:41:32.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:41:12, diff=20.398997s, valid=True
2026-05-29T14:41:32.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:41:32.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:41:32.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:41:32.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991134.399652s, valid=True
2026-05-29T14:41:32.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:41:32.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:41:32.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:41:32.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:41:32.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:41:32.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:41:32.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:41:32.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:41:32.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:41:32.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:41:32.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:41:32.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:41:32.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:41:32.725 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:41:32.946 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:41:33.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:41:33.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:41:33.438 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:41:33.438 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:41:33.701 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:41:33.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:42:03.732 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:42:03.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:42:03.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:42:04.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:42:04.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:42:04.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:42:04.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T14:42:04.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:42:04.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-05-29T14:42:04.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:42:04.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:42:04.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:42:04.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-05-29T14:42:06.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-05-29T14:42:06.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:42:06.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:42:06.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:42:06.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:42:06.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:42:06.999 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:42:06.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:42:07.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:42:07.000 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:42:07.000 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:42:07.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:42:07.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:42:07.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:42:07.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:42:07.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:42:07.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:42:07.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:42:07.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:42:07.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:42:07.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:42:07.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:42:07.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:42:07.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:42:00
2026-05-29T14:42:07.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72102, datetime.datetime(2026, 5, 29, 14, 42), datetime.datetime(2026, 5, 29, 14, 42), 'salt', 15.67, 45.08, None, 22.37, 38.09, 11.86, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:42:07.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:42:07.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:42:07.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:42:00, diff=7.324512s, valid=True
2026-05-29T14:42:07.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:42:07.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:42:07.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:42:12, diff=-4.672623s, valid=True
2026-05-29T14:42:07.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:42:07.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:42:07.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:41:58, diff=9.334054s, valid=True
2026-05-29T14:42:07.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:42:07.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:42:07.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:42:07.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:42:07.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:42:07.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:42:07.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:42:12, diff=-4.662876s, valid=True
2026-05-29T14:42:07.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:42:07.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:42:07.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:42:07.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991169.337791s, valid=True
2026-05-29T14:42:07.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:42:07.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:42:07.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:42:07.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:42:07.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:42:07.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:42:07.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:42:07.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:42:07.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:42:07.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:42:07.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:42:07.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:42:07.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:42:07.651 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:42:07.856 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:42:08.193 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:42:08.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:42: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-05-29T14:42: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-05-29T14:42:08.567 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:42:08.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:42:38.595 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:42:38.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:42:38.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:42:38.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:42:38.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:42:39.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:42:39.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-05-29T14:42:39.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:42:39.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-05-29T14:42:39.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:42:39.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:42:39.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:42:39.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-05-29T14:42:41.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T14:42:41.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:42:41.831 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:42:41.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:42:41.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:42:41.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:42:41.852 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:42:41.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:42:41.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:42:41.852 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:42:41.852 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:42:41.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:42:41.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:42:41.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:42:42.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:42:42.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:42:42.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:42:42.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:42:42.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:42:42.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:42:42.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:42:42.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:42:42.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:42:42.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:42:30
2026-05-29T14:42:42.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72103, datetime.datetime(2026, 5, 29, 14, 42, 30), datetime.datetime(2026, 5, 29, 14, 42, 30), 'salt', 15.37, 44.02, None, 19.76, 39.76, 12.17, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:42:42.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:42:42.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:42:42.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:42:30, diff=12.188766s, valid=True
2026-05-29T14:42:42.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:42:42.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:42:42.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:42:12, diff=30.191581s, valid=True
2026-05-29T14:42:42.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:42:42.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:42:42.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:42:29, diff=13.198201s, valid=True
2026-05-29T14:42:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:42:42.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:42:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:42:42.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:42:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:42:42.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:42:42.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:42:12, diff=30.201211s, valid=True
2026-05-29T14:42:42.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:42:42.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:42:42.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:42:42.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991204.201859s, valid=True
2026-05-29T14:42:42.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:42:42.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:42:42.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:42:42.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:42:42.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:42:42.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:42:42.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:42:42.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:42:42.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:42:42.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:42:42.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:42:42.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:42:42.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:42:42.521 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:42:42.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:42:43.089 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:42:43.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:42:43.189 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:42:43.189 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:42:43.363 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:42:43.363 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:43:13.381 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:43:13.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:43:13.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:43:13.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:43:13.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:43:13.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:43:13.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-05-29T14:43:13.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:43:13.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-05-29T14:43:13.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:43:13.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:43:13.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:43:13.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-05-29T14:43:16.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-05-29T14:43:16.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:43:16.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:43:16.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:43:16.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:43:16.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:43:16.540 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:43:16.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:43:16.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:43:16.540 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:43:16.540 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:43:16.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:43:16.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:43:16.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:43:16.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:43:16.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:43:16.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:43:16.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:43:16.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:43:16.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:43:16.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:43:16.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:43:16.804 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:43:16.866 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:43:00
2026-05-29T14:43:16.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72104, datetime.datetime(2026, 5, 29, 14, 43), datetime.datetime(2026, 5, 29, 14, 43), 'salt', 15.37, 44.98, None, 17.64, 39.76, 11.86, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:43:16.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:43:16.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:43:16.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:43:00, diff=16.872744s, valid=True
2026-05-29T14:43:16.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:43:16.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:43:16.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:43:12, diff=4.875592s, valid=True
2026-05-29T14:43:16.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:43:16.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:43:16.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:42:56, diff=20.882282s, valid=True
2026-05-29T14:43:16.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:43:16.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:43:16.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:43:16.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:43:16.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:43:16.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:43:16.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:43:12, diff=4.885336s, valid=True
2026-05-29T14:43:16.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:43:16.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:43:16.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:43:16.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991238.885991s, valid=True
2026-05-29T14:43:16.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:43:16.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:43:16.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:43:16.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:43:16.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:43:16.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:43:16.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:43:16.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:43:16.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:43:17.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:43:17.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:43:17.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:43:17.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:43:17.207 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:43:17.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:43:17.831 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:43:17.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:43:17.939 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:43:17.939 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:43:18.201 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:43:18.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:43:48.232 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:43:48.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:43:48.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:43:48.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:43:48.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:43:48.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:43:48.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-05-29T14:43:48.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:43:48.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-05-29T14:43:48.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:43:48.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:43:48.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:43: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-05-29T14:43:51.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-05-29T14:43:51.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:43:51.457 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:43:51.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:43:51.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:43:51.478 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:43:51.478 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:43:51.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:43:51.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:43:51.478 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:43:51.479 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:43:51.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:43:51.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:43:51.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:43:51.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:43:51.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:43:51.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:43:51.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:43:51.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:43:51.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:43:51.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:43:51.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:43:51.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:43:51.795 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:43:31
2026-05-29T14:43:51.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72105, datetime.datetime(2026, 5, 29, 14, 43, 31), datetime.datetime(2026, 5, 29, 14, 43, 30), 'salt', 15.23, 44.95, None, 20.32, 38.84, 11.86, 831.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:43:51.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:43:51.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:43:51.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:43:30, diff=21.801319s, valid=True
2026-05-29T14:43:51.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:43:51.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:43:51.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:43:12, diff=39.804133s, valid=True
2026-05-29T14:43:51.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:43:51.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:43:51.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:43:27, diff=24.810674s, valid=True
2026-05-29T14:43:51.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:43:51.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:43:51.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:43:51.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:43:51.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:43:51.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:43:51.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:43:12, diff=39.813686s, valid=True
2026-05-29T14:43:51.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:43:51.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:43:51.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:43:51.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991273.81434s, valid=True
2026-05-29T14:43:51.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:43:51.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:43:51.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:43:51.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:43:51.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:43:51.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:43:51.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:43:51.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:43:51.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:43:51.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:43:52.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:43:52.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:43:52.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:43:52.129 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:43:52.350 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:43:52.686 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:43:52.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:43:52.784 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:43:52.785 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:43:53.039 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:43:53.039 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:44:23.069 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:44:23.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:44:23.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:44:23.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:44:23.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:44:23.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:44:23.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-05-29T14:44:23.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:44:23.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-05-29T14:44:23.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:44:23.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:44:23.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:44: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-05-29T14:44:26.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-05-29T14:44:26.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:44:26.451 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:44:26.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:44:26.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:44:26.471 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:44:26.471 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:44:26.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:44:26.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:44:26.472 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:44:26.472 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:44:26.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:44:26.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:44:26.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:44:26.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:44:26.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:44:26.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:44:26.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:44:26.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:44:26.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:44:26.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:44:26.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:44:26.723 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:44:26.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:44:01
2026-05-29T14:44:26.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72106, datetime.datetime(2026, 5, 29, 14, 44, 1), datetime.datetime(2026, 5, 29, 14, 44), 'salt', 15.2, 45.35, None, 16.66, 39.36, 11.73, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:44:26.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:44:26.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:44:26.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:00, diff=26.787184s, valid=True
2026-05-29T14:44:26.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:44:26.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:44:26.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=14.790027s, valid=True
2026-05-29T14:44:26.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:44:26.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:44:26.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:43:57, diff=29.796788s, valid=True
2026-05-29T14:44:26.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:44:26.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:44:26.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:44:26.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:44:26.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:44:26.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:44:26.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=14.799872s, valid=True
2026-05-29T14:44:26.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:44:26.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:44:26.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:44:26.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991308.800536s, valid=True
2026-05-29T14:44:26.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:44:26.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:44:26.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:44:26.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:44:26.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:44:26.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:44:26.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:44:26.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:44:26.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:44:26.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:44:26.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:44:27.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:44:27.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:44:27.115 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:44:27.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:44:27.728 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:44:27.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:44:27.825 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:44:27.825 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:44:27.978 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:44:27.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:44:58.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:44:58.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:44:58.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:44:58.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:44:58.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:44:58.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:44:58.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T14:44:58.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:44:58.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-05-29T14:44:58.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:44:58.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:44:58.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:44:58.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-05-29T14:45:01.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T14:45:01.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:45:01.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:45:01.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:45:01.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:45:01.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:45:01.184 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:45:01.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:45:01.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:45:01.184 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:45:01.184 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:45:01.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:45:01.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:45:01.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:45:01.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:45:01.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:45:01.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:45:01.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:45:01.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T14:45:01.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:45:01.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:45:01.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:45:01.442 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:45:01.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:44:31
2026-05-29T14:45:01.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72107, datetime.datetime(2026, 5, 29, 14, 44, 31), datetime.datetime(2026, 5, 29, 14, 44, 31), 'salt', 15.24, 46.14, None, 14.08, 29.65, 11.49, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:45:01.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:45:01.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:45:01.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:31, diff=30.51487s, valid=True
2026-05-29T14:45:01.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:45:01.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:45:01.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=49.519098s, valid=True
2026-05-29T14:45:01.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:45:01.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:45:01.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:27, diff=34.526134s, valid=True
2026-05-29T14:45:01.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:45:01.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:45:01.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:45:01.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:45:01.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:45:01.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T14:45:01.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=49.529558s, valid=True
2026-05-29T14:45:01.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:45:01.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:45:01.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:45:01.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991343.530262s, valid=True
2026-05-29T14:45:01.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:45:01.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:45:01.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:45:01.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:45:01.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:45:01.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:45:01.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:45:01.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:45:01.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:45:01.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:45:01.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:45:01.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:45:01.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:45:01.890 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:45:02.099 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:45:02.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:45:02.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:45:02.542 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:45:02.542 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:45:02.809 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:45:02.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:45:32.839 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:45:32.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:45:32.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:45:33.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:45:33.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:45:33.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:45:33.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T14:45:33.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:45:33.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-05-29T14:45:33.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:45:33.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:45:33.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:45:33.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-05-29T14:45:36.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-05-29T14:45:36.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:45:36.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:45:36.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:45:36.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:45:36.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:45:36.031 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:45:36.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:45:36.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:45:36.031 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:45:36.031 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:45:36.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:45:36.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:45:36.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:45:36.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:45:36.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:45:36.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T14:45:36.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:45:36.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T14:45:36.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:45:36.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:45:36.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:45:36.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:45:36.342 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:45:32
2026-05-29T14:45:36.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72109, datetime.datetime(2026, 5, 29, 14, 45, 32), datetime.datetime(2026, 5, 29, 14, 45, 31), 'salt', 14.84, 45.05, None, 22.02, 40.13, 11.8, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:45:36.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:45:36.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:45:36.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:45:31, diff=5.348665s, valid=True
2026-05-29T14:45:36.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:45:36.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T14:45:36.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=84.35151s, valid=True
2026-05-29T14:45:36.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:45:36.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:45:36.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:45:28, diff=8.358329s, valid=True
2026-05-29T14:45:36.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:45:36.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:45:36.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:45:36.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:45:36.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:45:36.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T14:45:36.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=84.361354s, valid=True
2026-05-29T14:45:36.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:45:36.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:45:36.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:45:36.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991378.362026s, valid=True
2026-05-29T14:45:36.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:45:36.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:45:36.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:45:36.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:45:36.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:45:36.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:45:36.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:45:36.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:45:36.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:45:36.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:45:36.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:45:36.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:45:36.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:45:36.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:45:36.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:45:37.284 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:45:37.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:45:37.384 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:45:37.384 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:45:37.636 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:45:37.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:46:07.663 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:46:07.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:46:07.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:46:08.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:46:08.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:46:08.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:46:08.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-05-29T14:46:08.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:46:08.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T14:46:08.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:46:08.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:46:08.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:46:08.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-05-29T14:46:11.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-05-29T14:46:11.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:46:11.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:46:11.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:46:11.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:46:11.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:46:11.114 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:46:11.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:46:11.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:46:11.114 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:46:11.114 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:46:11.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:46:11.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:46:11.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:46:11.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:46:11.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:46:11.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T14:46:11.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:46:11.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T14:46:11.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:46:11.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:46:11.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:46:11.366 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:46:11.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:46:02
2026-05-29T14:46:11.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72110, datetime.datetime(2026, 5, 29, 14, 46, 2), datetime.datetime(2026, 5, 29, 14, 46, 1), 'salt', 14.87, 46.04, None, 21.07, 13.37, 11.49, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:46:11.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:46:11.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:46:11.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:46:01, diff=10.438805s, valid=True
2026-05-29T14:46:11.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:46:11.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T14:46:11.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=119.441638s, valid=True
2026-05-29T14:46:11.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:46:11.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:46:11.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:45:59, diff=12.448273s, valid=True
2026-05-29T14:46:11.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:46:11.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:46:11.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:46:11.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:46:11.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:46:11.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T14:46:11.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=119.451336s, valid=True
2026-05-29T14:46:11.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:46:11.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:46:11.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:46:11.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991413.451996s, valid=True
2026-05-29T14:46:11.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:46:11.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:46:11.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:46:11.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:46:11.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:46:11.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:46:11.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:46:11.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:46:11.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:46:11.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:46:11.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:46:11.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:46:11.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:46:11.766 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:46:11.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:46:12.306 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:46:12.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:46:12.405 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:46:12.405 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:46:12.708 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:46:12.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:46:42.720 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:46:42.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:46:42.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:46:43.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:46:43.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:46:43.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:46:43.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-05-29T14:46:43.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:46:43.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-05-29T14:46:43.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:46:43.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:46:43.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:46:43.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-05-29T14:46:45.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-05-29T14:46:45.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:46:45.822 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:46:45.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:46:45.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:46:45.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:46:45.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:46:45.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:46:45.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:46:45.844 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:46:45.844 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:46:45.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:46:45.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:46:45.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:46:46.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:46:46.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:46:46.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T14:46:46.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:46:46.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T14:46:46.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:46:46.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:46:46.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:46:46.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:46:46.168 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:46:32
2026-05-29T14:46:46.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72111, datetime.datetime(2026, 5, 29, 14, 46, 32), datetime.datetime(2026, 5, 29, 14, 46, 31), 'salt', 15.17, 45.88, None, 18.7, 42.92, 11.57, 832.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:46:46.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:46:46.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:46:46.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:46:31, diff=15.175009s, valid=True
2026-05-29T14:46:46.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:46:46.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T14:46:46.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=154.177848s, valid=True
2026-05-29T14:46:46.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:46:46.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:46:46.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:46:31, diff=15.184596s, valid=True
2026-05-29T14:46:46.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:46:46.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:46:46.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:46:46.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:46:46.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:46:46.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T14:46:46.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=154.187636s, valid=True
2026-05-29T14:46:46.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:46:46.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:46:46.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:46:46.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991448.188302s, valid=True
2026-05-29T14:46:46.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:46:46.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:46:46.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:46:46.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:46:46.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:46:46.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:46:46.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:46:46.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:46:46.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:46:46.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:46:46.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:46:46.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:46:46.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:46:46.565 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:46:46.770 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:46:47.103 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:46:47.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:46:47.203 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:46:47.203 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:46:47.375 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:46:47.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:47:17.400 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:47:17.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:47:17.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:47:17.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:47:17.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:47:18.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:47:18.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-05-29T14:47:18.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:47:18.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-05-29T14:47:18.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:47:18.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:47:18.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:47:18.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-05-29T14:47:20.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-05-29T14:47:20.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:47:20.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:47:20.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:47:20.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:47:20.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:47:20.726 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:47:20.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:47:20.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:47:20.727 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:47:20.727 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:47:20.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:47:20.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:47:20.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:47:20.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:47:20.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:47:20.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:47:20.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:47:20.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:47:20.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:47:20.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:47:20.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:47:20.976 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:47:21.034 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:47:02
2026-05-29T14:47:21.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72112, datetime.datetime(2026, 5, 29, 14, 47, 2), datetime.datetime(2026, 5, 29, 14, 47, 2), 'salt', 15.04, 45.58, None, 23.36, 45.74, 11.65, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:47:21.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:47:21.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:47:21.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:47:02, diff=19.040283s, valid=True
2026-05-29T14:47:21.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:47:21.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:47:21.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=189.043085s, valid=True
2026-05-29T14:47:21.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:47:21.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:47:21.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:47:02, diff=19.049614s, valid=True
2026-05-29T14:47:21.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:47:21.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:47:21.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:47:21.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:47:21.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:47:21.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:47:21.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=189.052597s, valid=True
2026-05-29T14:47:21.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:47:21.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:47:21.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:47:21.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991483.053259s, valid=True
2026-05-29T14:47:21.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:47:21.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:47:21.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:47:21.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:47:21.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:47:21.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:47:21.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:47:21.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:47:21.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:47:21.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:47:21.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:47:21.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:47:21.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:47:21.372 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:47:21.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:47:21.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:47:22.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:47:22.020 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:47:22.021 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:47:22.203 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:47:22.204 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:47:52.233 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:47:52.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:47:52.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:47:52.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:47:52.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:47:52.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:47:52.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-05-29T14:47:52.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:47:52.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T14:47:52.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:47:52.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:47:52.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:47:52.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T14:47:55.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-05-29T14:47:55.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:47:55.370 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:47:55.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:47:55.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:47:55.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:47:55.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:47:55.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:47:55.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:47:55.390 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:47:55.390 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:47:55.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:47:55.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:47:55.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:47:55.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:47:55.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:47:55.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:47:55.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:47:55.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T14:47:55.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:47:55.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:47:55.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:47:55.647 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:47:55.706 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:47:32
2026-05-29T14:47:55.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72113, datetime.datetime(2026, 5, 29, 14, 47, 32), datetime.datetime(2026, 5, 29, 14, 47, 32), 'salt', 15.07, 44.68, None, 25.3, 44.19, 11.93, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:47:55.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:47:55.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:47:55.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:47:32, diff=23.712543s, valid=True
2026-05-29T14:47:55.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:47:55.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:47:55.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=223.715376s, valid=True
2026-05-29T14:47:55.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:47:55.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:47:55.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:47:28, diff=27.72186s, valid=True
2026-05-29T14:47:55.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:47:55.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:47:55.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:47:55.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:47:55.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:47:55.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T14:47:55.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=223.724857s, valid=True
2026-05-29T14:47:55.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:47:55.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:47:55.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:47:55.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991517.725504s, valid=True
2026-05-29T14:47:55.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:47:55.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:47:55.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:47:55.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:47:55.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:47:55.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:47:55.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:47:55.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:47:55.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:47:55.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:47:55.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:47:56.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:47:56.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:47:56.096 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:47:56.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:47:56.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:47:56.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:47:56.763 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:47:56.763 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:47:57.015 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:47:57.015 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:48:27.036 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:48:27.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:48:27.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:48:27.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:48:27.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:48:27.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:48:27.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-05-29T14:48:27.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:48: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-05-29T14:48:27.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:48:27.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:48:27.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:48:27.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-05-29T14:48:30.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-05-29T14:48:30.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:48:30.194 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:48:30.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:48:30.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:48:30.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:48:30.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:48:30.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:48:30.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:48:30.215 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:48:30.215 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:48:30.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:48:30.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:48:30.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:48:30.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:48:30.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:48:30.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:48:30.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:48:30.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:48:30.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:48:30.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:48:30.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:48:30.482 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:48:30.541 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:48:03
2026-05-29T14:48:30.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72114, datetime.datetime(2026, 5, 29, 14, 48, 3), datetime.datetime(2026, 5, 29, 14, 48, 2), 'salt', 15.04, 44.95, None, 23.25, 39.43, 11.85, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:48:30.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:48:30.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:48:30.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:48:02, diff=28.548146s, valid=True
2026-05-29T14:48:30.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:48:30.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:48:30.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=258.551026s, valid=True
2026-05-29T14:48:30.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:48:30.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:48:30.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:47:59, diff=31.557893s, valid=True
2026-05-29T14:48:30.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:48:30.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:48:30.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:48:30.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:48:30.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:48:30.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:48:30.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=258.561027s, valid=True
2026-05-29T14:48:30.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:48:30.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:48:30.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:48:30.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991552.561724s, valid=True
2026-05-29T14:48:30.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:48:30.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:48:30.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:48:30.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:48:30.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:48:30.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:48:30.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:48:30.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:48:30.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:48:30.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:48:30.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:48:30.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:48:30.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:48:30.889 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:48:31.103 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:48:31.523 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:48:31.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:48:31.628 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:48:31.629 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:48:35.120 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:48:35.120 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:49:05.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:49:05.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:49:05.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:49:05.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:49:05.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:49:05.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:49:05.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-05-29T14:49:05.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:49:05.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-05-29T14:49:05.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:49:05.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:49:05.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:49:05.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-05-29T14:49:08.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-05-29T14:49:08.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:49:08.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:49:08.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:49:08.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:49:08.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:49:08.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:49:08.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:49:08.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:49:08.106 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:49:08.106 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:49:08.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:49:08.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:49:08.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:49:08.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:49:08.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:49:08.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:49:08.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:49:08.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:49:08.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:49:08.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:49:08.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:49:08.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:49:08.495 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:49:03
2026-05-29T14:49:08.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72116, datetime.datetime(2026, 5, 29, 14, 49, 3), datetime.datetime(2026, 5, 29, 14, 49, 2), 'salt', 15.04, 46.54, None, 24.56, 38.54, 11.35, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:49:08.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:49:08.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:49:08.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:49:02, diff=6.501436s, valid=True
2026-05-29T14:49:08.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:49:08.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:49:08.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=296.504242s, valid=True
2026-05-29T14:49:08.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:49:08.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:49:08.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:48:59, diff=9.510893s, valid=True
2026-05-29T14:49:08.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:49:08.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:49:08.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:49:08.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:49:08.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:49:08.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:49:08.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:44:12, diff=296.513883s, valid=True
2026-05-29T14:49:08.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:49:08.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:49:08.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:49:08.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991590.514534s, valid=True
2026-05-29T14:49:08.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:49:08.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:49:08.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:49:08.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:49:08.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:49:08.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:49:08.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:49:08.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:49:08.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:49:08.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:49:08.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:49:08.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:49:08.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:49:08.836 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:49:09.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:49:09.396 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:49:09.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:49:09.499 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:49:09.499 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:49:09.939 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:49:09.939 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:49:39.963 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:49:39.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:49:39.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:49:40.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:49:40.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:49:40.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:49:40.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-05-29T14:49:40.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:49:40.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-05-29T14:49:40.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:49:40.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:49:40.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:49:40.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-05-29T14:49:43.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-05-29T14:49:43.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:49:43.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:49:43.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:49:43.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:49:43.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:49:43.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:49:43.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:49:43.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:49:43.350 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:49:43.350 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:49:43.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:49:43.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:49:43.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:49:43.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:49:43.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:49:43.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:49:43.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:49:43.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:49:43.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:49:43.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:49:43.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:49:43.624 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:49:43.682 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:49:33
2026-05-29T14:49:43.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72117, datetime.datetime(2026, 5, 29, 14, 49, 33), datetime.datetime(2026, 5, 29, 14, 49, 33), 'salt', 15.04, 46.97, None, 23.71, 36.59, 11.22, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:49:43.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:49:43.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:49:43.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:49:33, diff=10.689836s, valid=True
2026-05-29T14:49:43.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:49:43.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:49:43.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:50:12, diff=-28.305076s, valid=True
2026-05-29T14:49:43.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:49:43.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:49:43.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:49:29, diff=14.705425s, valid=True
2026-05-29T14:49:43.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:49:43.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:49:43.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:49:43.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:49:43.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:49:43.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:49:43.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:50:12, diff=-28.291385s, valid=True
2026-05-29T14:49:43.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:49:43.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:49:43.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:49:43.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991625.709319s, valid=True
2026-05-29T14:49:43.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:49:43.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:49:43.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:49:43.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:49:43.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:49:43.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:49:43.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:49:43.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:49:43.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:49:43.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:49:43.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:49:43.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:49:43.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:49:44.037 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:49:44.262 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:49:44.611 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:49:44.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:49:44.716 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:49:44.716 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:49:44.926 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:49:44.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:50:14.956 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:50:14.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:50:14.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:50:15.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:50:15.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:50:15.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:50:15.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-05-29T14:50:15.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:50:15.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-05-29T14:50:15.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:50:15.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:50:15.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:50:15.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-05-29T14:50:18.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-05-29T14:50:18.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:50:18.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:50:18.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:50:18.050 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:50:18.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:50:18.062 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:50:18.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:50:18.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:50:18.062 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:50:18.063 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:50:18.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:50:18.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:50:18.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:50:18.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:50:18.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:50:18.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:50:18.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:50:18.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:50:18.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:50:18.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:50:18.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:50:18.319 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:50:18.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:50:04
2026-05-29T14:50:18.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72118, datetime.datetime(2026, 5, 29, 14, 50, 4), datetime.datetime(2026, 5, 29, 14, 50, 3), 'salt', 15.27, 47.04, None, 25.79, 32.25, 11.22, 832.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:50:18.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:50:18.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:50:18.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:50:03, diff=15.38335s, valid=True
2026-05-29T14:50:18.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:50:18.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:50:18.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:50:12, diff=6.386213s, valid=True
2026-05-29T14:50:18.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:50:18.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:50:18.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:50:00, diff=18.392866s, valid=True
2026-05-29T14:50:18.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:50:18.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:50:18.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:50:18.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:50:18.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:50:18.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:50:18.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:50:12, diff=6.395897s, valid=True
2026-05-29T14:50:18.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:50:18.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:50:18.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:50:18.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991660.396554s, valid=True
2026-05-29T14:50:18.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:50:18.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:50:18.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:50:18.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:50:18.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:50:18.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:50:18.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:50:18.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:50:18.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:50:18.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:50:18.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:50:18.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:50:18.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:50:18.712 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:50:18.928 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:50:19.276 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:50:19.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:50:19.377 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:50:19.377 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:50:19.545 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:50:19.545 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:50:49.575 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:50:49.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:50:49.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:50:50.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:50:50.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:50:50.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:50:50.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-05-29T14:50:50.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:50:50.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-05-29T14:50:50.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:50:50.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:50:50.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:50:50.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-05-29T14:50:52.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-05-29T14:50:52.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:50:52.961 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:50:52.961 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:50:52.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:50:52.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:50:52.986 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:50:52.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:50:52.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:50:52.986 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:50:52.986 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:50:52.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:50:53.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:50:53.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:50:53.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:50:53.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:50:53.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:50:53.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:50:53.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:50:53.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:50:53.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:50:53.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:50:53.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:50:53.299 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:50:34
2026-05-29T14:50:53.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72119, datetime.datetime(2026, 5, 29, 14, 50, 34), datetime.datetime(2026, 5, 29, 14, 50, 33), 'salt', 15.3, 47.57, None, 23.36, 27.75, 11.06, 832.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:50:53.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:50:53.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:50:53.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:50:33, diff=20.305463s, valid=True
2026-05-29T14:50:53.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:50:53.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:50:53.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:51:12, diff=-18.690709s, valid=True
2026-05-29T14:50:53.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:50:53.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:50:53.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:50:31, diff=22.316224s, valid=True
2026-05-29T14:50:53.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:50:53.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:50:53.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:50:53.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:50:53.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:50:53.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:50:53.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:51:12, diff=-18.680472s, valid=True
2026-05-29T14:50:53.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:50:53.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:50:53.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:50:53.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991695.320209s, valid=True
2026-05-29T14:50:53.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:50:53.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:50:53.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:50:53.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:50:53.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:50:53.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:50:53.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:50:53.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:50:53.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:50:53.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:50:53.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:50:53.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:50:53.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:50:53.654 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:50:53.897 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:50:54.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:50:54.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:50:54.424 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:50:54.425 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:50:54.671 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:50:54.671 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:51:24.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:51:24.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:51:24.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:51:24.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:51:24.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:51:25.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:51:25.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-05-29T14:51:25.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:51:25.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-05-29T14:51:25.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:51:25.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:51:25.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:51:25.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-05-29T14:51:27.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-05-29T14:51:27.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:51:27.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:51:27.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:51:27.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:51:27.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:51:27.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:51:27.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:51:27.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:51:27.842 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:51:27.842 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:51:27.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:51:27.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:51:27.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:51:28.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:51:28.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:51:28.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:51:28.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:51:28.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:51:28.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:51:28.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:51:28.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:51:28.094 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:51:28.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:51:04
2026-05-29T14:51:28.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72120, datetime.datetime(2026, 5, 29, 14, 51, 4), datetime.datetime(2026, 5, 29, 14, 51, 4), 'salt', 15.33, 46.8, None, 17.86, 29.63, 11.29, 832.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:51:28.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:51:28.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:51:28.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:51:04, diff=24.15911s, valid=True
2026-05-29T14:51:28.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:51:28.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:51:28.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:51:12, diff=16.161951s, valid=True
2026-05-29T14:51:28.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:51:28.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:51:28.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:51:03, diff=25.168744s, valid=True
2026-05-29T14:51:28.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:51:28.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:51:28.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:51:28.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:51:28.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:51:28.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:51:28.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:51:12, diff=16.171783s, valid=True
2026-05-29T14:51:28.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:51:28.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:51:28.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:51:28.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991730.17248s, valid=True
2026-05-29T14:51:28.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:51:28.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:51:28.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:51:28.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:51:28.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:51:28.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:51:28.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:51:28.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:51:28.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:51:28.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:51:28.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:51:28.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:51:28.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:51:28.494 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:51:28.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:51:29.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:51:29.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:51:29.187 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:51:29.187 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:51:29.354 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:51:29.354 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:51:59.384 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:51:59.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:51:59.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:51:59.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:51:59.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:51:59.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:51:59.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-05-29T14:51:59.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:51:59.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T14:51:59.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:51:59.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:51:59.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:51:59.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-05-29T14:52:02.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-05-29T14:52:02.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:52:02.582 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:52:02.582 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:52:02.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:52:02.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:52:02.603 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:52:02.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:52:02.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:52:02.603 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:52:02.603 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:52:02.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:52:02.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:52:02.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:52:02.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:52:02.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:52:02.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:52:02.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:52:02.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:52:02.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:52:02.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:52:02.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:52:02.855 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:52:02.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:51:36
2026-05-29T14:52:02.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72121, datetime.datetime(2026, 5, 29, 14, 51, 36), datetime.datetime(2026, 5, 29, 14, 51, 34), 'salt', 15.43, 47.1, None, 21.17, 45.27, 11.21, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:52:02.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:52:02.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:52:02.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:51:34, diff=28.922366s, valid=True
2026-05-29T14:52:02.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:52:02.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:52:02.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:52:12, diff=-9.07481s, valid=True
2026-05-29T14:52:02.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:52:02.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:52:02.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:51:34, diff=28.931854s, valid=True
2026-05-29T14:52:02.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:52:02.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:52:02.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:52:02.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:52:02.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:52:02.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:52:02.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:52:12, diff=-9.065156s, valid=True
2026-05-29T14:52:02.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:52:02.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:52:02.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:52:02.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991764.935502s, valid=True
2026-05-29T14:52:02.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:52:02.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:52:02.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:52:02.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:52:02.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:52:02.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:52:02.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:52:02.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:52:03.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:52:03.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:52:03.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:52:03.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:52:03.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:52:03.249 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:52:03.553 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:52:03.899 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:52:04.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:52:04.000 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:52:04.000 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:52:04.166 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:52:04.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:52:34.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:52:34.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:52:34.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:52:34.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:52:34.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:52:34.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:52:34.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-05-29T14:52:34.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:52:34.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-05-29T14:52:34.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:52:34.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:52:34.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:52:34.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-05-29T14:52:37.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-05-29T14:52:37.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:52:37.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:52:37.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:52:37.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:52:37.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:52:37.192 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:52:37.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:52:37.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:52:37.192 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:52:37.192 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:52:37.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:52:37.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:52:37.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:52:37.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:52:37.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:52:37.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:52:37.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:52:37.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:52:37.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:52:37.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:52:37.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:52:37.455 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:52:37.514 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:52:36
2026-05-29T14:52:37.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72123, datetime.datetime(2026, 5, 29, 14, 52, 36), datetime.datetime(2026, 5, 29, 14, 52, 36), 'salt', 15.3, 47.3, None, 23.39, 39.01, 11.14, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:52:37.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:52:37.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:52:37.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:52:36, diff=1.520996s, valid=True
2026-05-29T14:52:37.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:52:37.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:52:37.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:53:12, diff=-34.476128s, valid=True
2026-05-29T14:52:37.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:52:37.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:52:37.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:52:31, diff=6.53047s, valid=True
2026-05-29T14:52:37.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:52:37.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:52:37.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:52:37.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:52:37.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:52:37.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:52:37.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:53:12, diff=-34.466525s, valid=True
2026-05-29T14:52:37.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:52:37.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:52:37.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:52:37.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991799.534156s, valid=True
2026-05-29T14:52:37.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:52:37.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:52:37.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:52:37.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:52:37.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:52:37.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:52:37.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:52:37.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:52:37.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:52:37.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:52:37.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:52:37.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:52:37.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:52:37.857 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:52:38.082 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:52:38.443 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:52:38.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:52:38.552 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:52:38.552 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:52:38.786 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:52:38.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:53:08.797 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:53:08.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:53:08.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:53:09.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:53:09.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:53:09.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:53:09.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-05-29T14:53:09.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:53:09.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T14:53:09.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:53:09.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:53:09.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:53:09.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-05-29T14:53:11.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T14:53:11.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:53:11.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:53:11.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:53:11.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:53:11.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:53:11.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:53:11.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:53:11.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:53:11.932 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:53:11.932 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:53:11.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:53:12.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:53:12.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:53:12.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:53:12.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:53:12.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:53:12.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:53:12.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:53:12.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:53:12.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:53:12.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:53:12.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:53:12.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:53:07
2026-05-29T14:53:12.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72124, datetime.datetime(2026, 5, 29, 14, 53, 7), datetime.datetime(2026, 5, 29, 14, 53, 6), 'salt', 15.13, 47.57, None, 19.62, 31.17, 11.04, 832.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:53:12.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:53:12.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:53:12.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:53:06, diff=6.248273s, valid=True
2026-05-29T14:53:12.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:53:12.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:53:12.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:53:12, diff=0.251113s, valid=True
2026-05-29T14:53:12.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:53:12.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:53:12.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:53:01, diff=11.257745s, valid=True
2026-05-29T14:53:12.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:53:12.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:53:12.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:53:12.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:53:12.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:53:12.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:53:12.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:53:12, diff=0.260779s, valid=True
2026-05-29T14:53:12.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:53:12.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:53:12.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:53:12.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991834.261435s, valid=True
2026-05-29T14:53:12.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:53:12.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:53:12.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:53:12.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:53:12.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:53:12.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:53:12.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:53:12.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:53:12.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:53:12.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:53:12.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:53:12.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:53:12.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:53:12.641 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:53:12.871 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:53:13.215 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:53:13.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:53:13.316 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:53:13.316 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:53:13.536 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:53:13.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:53:43.566 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:53:43.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:53:43.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:53:43.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:53:43.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:53:43.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:53:43.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-05-29T14:53:43.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:53:43.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-05-29T14:53:43.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:53:43.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:53:43.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:53:43.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-05-29T14:53:46.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-05-29T14:53:46.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:53:46.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:53:46.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:53:46.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:53:46.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:53:46.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:53:46.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:53:46.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:53:46.640 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:53:46.640 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:53:46.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:53:46.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:53:46.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:53:46.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:53:46.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:53:46.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:53:46.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:53:46.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:53:46.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:53:46.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:53:46.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:53:46.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:53:46.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:53:37
2026-05-29T14:53:46.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72125, datetime.datetime(2026, 5, 29, 14, 53, 37), datetime.datetime(2026, 5, 29, 14, 53, 36), 'salt', 15.2, 48.03, None, 24.17, 26.34, 10.91, 831.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:53:46.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:53:46.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:53:46.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:53:36, diff=10.960255s, valid=True
2026-05-29T14:53:46.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:53:46.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:53:46.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:54:12, diff=-25.036858s, valid=True
2026-05-29T14:53:46.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:53:46.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:53:46.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:53:31, diff=15.974909s, valid=True
2026-05-29T14:53:46.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:53:46.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:53:46.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:53:46.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:53:46.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:53:46.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:53:46.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:54:12, diff=-25.021029s, valid=True
2026-05-29T14:53:46.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:53:46.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:53:46.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:53:46.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991868.979648s, valid=True
2026-05-29T14:53:46.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:53:46.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:53:46.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:53:46.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:53:46.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:53:47.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:53:47.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:53:47.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:53:47.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:53:47.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:53:47.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:53:47.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:53:47.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:53:47.304 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:53:47.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:53:47.881 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:53:47.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:53:47.994 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:53:47.994 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:53:48.162 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:53:48.162 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:54:18.191 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:54:18.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:54:18.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:54:18.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:54:18.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:54:18.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:54: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-05-29T14:54:18.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:54:18.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-05-29T14:54:18.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:54:18.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:54:18.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:54:18.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-05-29T14:54:21.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-05-29T14:54:21.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:54:21.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:54:21.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:54:21.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:54:21.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:54:21.366 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:54:21.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:54:21.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:54:21.367 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:54:21.367 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:54:21.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:54:21.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:54:21.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:54:21.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:54:21.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:54:21.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:54:21.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:54:21.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:54:21.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:54:21.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:54:21.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:54:21.628 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:54:21.689 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:54:07
2026-05-29T14:54:21.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72126, datetime.datetime(2026, 5, 29, 14, 54, 7), datetime.datetime(2026, 5, 29, 14, 54, 7), 'salt', 15.33, 48.0, None, 19.83, 29.98, 10.93, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:54:21.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:54:21.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:54:21.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:54:07, diff=14.695665s, valid=True
2026-05-29T14:54:21.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:54:21.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:54:21.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:54:12, diff=9.69921s, valid=True
2026-05-29T14:54:21.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:54:21.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:54:21.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:54:02, diff=19.706057s, valid=True
2026-05-29T14:54:21.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:54:21.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:54:21.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:54:21.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:54:21.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:54:21.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:54:21.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:54:12, diff=9.709074s, valid=True
2026-05-29T14:54:21.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:54:21.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:54:21.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:54:21.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991903.709734s, valid=True
2026-05-29T14:54:21.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:54:21.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:54:21.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:54:21.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:54:21.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:54:21.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:54:21.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:54:21.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:54:21.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:54:21.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:54:21.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:54:21.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:54:22.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:54:22.088 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:54:22.302 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:54:22.646 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:54:22.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:54:22.746 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:54:22.747 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:54:23.003 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:54:23.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:54:53.032 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:54:53.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:54:53.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:54:53.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:54:53.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:54:53.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:54:53.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-05-29T14:54:53.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:54:53.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-05-29T14:54:53.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:54:53.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:54:53.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:54:53.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-05-29T14:54:55.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-05-29T14:54:55.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:54:55.998 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:54:55.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:54:56.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:54:56.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:54:56.019 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:54:56.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:54:56.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:54:56.019 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:54:56.020 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:54:56.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:54:56.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:54:56.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:54:56.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:54:56.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:54:56.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:54:56.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:54:56.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:54:56.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:54:56.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:54:56.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:54:56.342 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:54:56.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:54:37
2026-05-29T14:54:56.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72127, datetime.datetime(2026, 5, 29, 14, 54, 37), datetime.datetime(2026, 5, 29, 14, 54, 37), 'salt', 15.4, 48.06, None, 20.29, 34.6, 10.92, 832.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:54:56.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:54:56.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:54:56.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:54:37, diff=19.410192s, valid=True
2026-05-29T14:54:56.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:54:56.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:54:56.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:55:12, diff=-15.586931s, valid=True
2026-05-29T14:54:56.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:54:56.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:54:56.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:54:33, diff=23.419876s, valid=True
2026-05-29T14:54:56.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:54:56.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:54:56.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:54:56.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:54:56.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:54:56.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:54:56.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:55:12, diff=-15.577092s, valid=True
2026-05-29T14:54:56.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:54:56.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:54:56.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:54:56.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991938.423567s, valid=True
2026-05-29T14:54:56.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:54:56.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:54:56.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:54:56.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:54:56.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:54:56.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:54:56.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:54:56.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:54:56.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:54:56.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:54:56.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:54:56.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:54:56.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:54:56.738 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:54:56.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:54:57.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:54:57.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:54:57.436 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:54:57.436 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:54:57.667 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:54:57.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:55:27.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:55:27.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:55:27.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:55:28.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:55:28.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:55:28.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:55:28.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-05-29T14:55:28.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:55:28.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-05-29T14:55:28.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:55:28.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:55:28.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:55:28.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-05-29T14:55:30.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-05-29T14:55:30.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:55:30.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:55:30.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:55:30.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:55:30.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:55:31.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:55:31.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:55:31.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:55:31.140 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:55:31.140 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:55:31.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:55:31.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:55:31.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:55:31.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:55:31.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:55:31.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:55:31.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:55:31.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:55:31.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:55:31.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:55:31.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:55:31.402 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:55:31.466 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:55:07
2026-05-29T14:55:31.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72128, datetime.datetime(2026, 5, 29, 14, 55, 7), datetime.datetime(2026, 5, 29, 14, 55, 7), 'salt', 15.4, 47.14, None, 21.56, 29.04, 11.2, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:55:31.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:55:31.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:55:31.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:55:07, diff=24.472954s, valid=True
2026-05-29T14:55:31.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:55:31.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:55:31.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:55:12, diff=19.475799s, valid=True
2026-05-29T14:55:31.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:55:31.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:55:31.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:55:04, diff=27.482407s, valid=True
2026-05-29T14:55:31.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:55:31.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:55:31.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:55:31.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:55:31.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:55:31.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:55:31.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:55:12, diff=19.485465s, valid=True
2026-05-29T14:55:31.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:55:31.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:55:31.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:55:31.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=991973.486175s, valid=True
2026-05-29T14:55:31.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:55:31.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:55:31.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:55:31.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:55:31.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:55:31.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:55:31.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:55:31.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:55:31.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:55:31.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:55:31.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:55:31.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:55:31.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:55:31.803 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:55:32.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:55:32.361 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:55:32.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:55:32.461 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:55:32.461 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:55:32.706 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:55:32.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:56:02.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:56:02.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:56:02.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:56:03.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:56:03.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:56:03.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:56:03.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T14:56:03.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:56:03.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-05-29T14:56:03.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:56:03.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:56:03.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:56:03.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-05-29T14:56:06.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-05-29T14:56:06.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:56:06.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:56:06.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:56:06.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:56:06.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:56:06.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:56:06.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:56:06.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:56:06.035 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:56:06.035 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:56:06.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:56:06.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:56:06.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:56:06.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:56:06.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:56:06.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:56:06.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:56:06.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:56:06.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:56:06.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:56:06.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:56:06.315 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:56:06.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:55:38
2026-05-29T14:56:06.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72129, datetime.datetime(2026, 5, 29, 14, 55, 38), datetime.datetime(2026, 5, 29, 14, 55, 37), 'salt', 15.27, 46.57, None, 22.51, 29.55, 11.36, 832.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:56:06.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:56:06.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:56:06.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:55:37, diff=29.385642s, valid=True
2026-05-29T14:56:06.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:56:06.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:56:06.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:56:12, diff=-5.611441s, valid=True
2026-05-29T14:56:06.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:56:06.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:56:06.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:55:35, diff=31.395343s, valid=True
2026-05-29T14:56:06.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:56:06.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:56:06.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:56:06.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:56:06.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:56:06.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:56:06.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:56:12, diff=-5.601568s, valid=True
2026-05-29T14:56:06.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:56:06.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:56:06.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:56:06.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992008.399364s, valid=True
2026-05-29T14:56:06.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:56:06.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:56:06.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:56:06.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:56:06.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:56:06.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:56:06.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:56:06.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:56:06.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:56:06.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:56:06.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:56:06.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:56:06.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:56:06.756 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:56:07.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:56:07.461 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:56:07.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:56:07.589 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:56:07.589 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:56:07.838 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:56:07.839 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:56:37.868 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:56:37.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:56:37.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:56:38.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:56:38.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:56:38.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:56:38.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-05-29T14:56:38.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:56:38.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-05-29T14:56:38.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:56:38.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:56:38.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:56:38.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-05-29T14:56: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-05-29T14:56:41.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:56:41.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:56:41.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:56:41.444 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:56:41.455 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:56:41.455 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:56:41.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:56:41.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:56:41.456 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:56:41.456 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:56:41.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:56:41.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:56:41.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:56:41.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:56:41.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:56:41.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:56:41.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:56:41.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:56:41.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:56:41.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:56:41.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:56:41.733 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:56:41.806 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:56:38
2026-05-29T14:56:41.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72131, datetime.datetime(2026, 5, 29, 14, 56, 38), datetime.datetime(2026, 5, 29, 14, 56, 38), 'salt', 15.2, 47.7, None, 23.54, 40.62, 11.01, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:56:41.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:56:41.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:56:41.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:56:38, diff=3.812463s, valid=True
2026-05-29T14:56:41.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:56:41.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:56:41.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:57:12, diff=-30.184738s, valid=True
2026-05-29T14:56:41.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:56:41.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:56:41.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:56:33, diff=8.821822s, valid=True
2026-05-29T14:56:41.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:56:41.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:56:41.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:56:41.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:56:41.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:56:41.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:56:41.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:57:12, diff=-30.175128s, valid=True
2026-05-29T14:56:41.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:56:41.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:56:41.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:56:41.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992043.825516s, valid=True
2026-05-29T14:56:41.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:56:41.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:56:41.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:56:41.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:56:41.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:56:41.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:56:41.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:56:41.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:56:41.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:56:41.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:56:42.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:56:42.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:56:42.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:56:42.151 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:56:42.377 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:56:42.737 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:56:42.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:56:42.845 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:56:42.845 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:56:43.024 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:56:43.024 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:57:13.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:57:13.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:57:13.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:57:13.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:57:13.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:57:13.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:57:13.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-05-29T14:57:13.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:57:13.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-05-29T14:57:13.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:57:13.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:57:13.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:57:13.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-05-29T14:57:16.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-05-29T14:57:16.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:57:16.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:57:16.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:57:16.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:57:16.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:57:16.332 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:57:16.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:57:16.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:57:16.333 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:57:16.333 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:57:16.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:57:16.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:57:16.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:57:16.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:57:16.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:57:16.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:57:16.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:57:16.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:57:16.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:57:16.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:57:16.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:57:16.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:57:16.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:57:08
2026-05-29T14:57:16.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72132, datetime.datetime(2026, 5, 29, 14, 57, 8), datetime.datetime(2026, 5, 29, 14, 57, 8), 'salt', 15.17, 47.6, None, 22.69, 41.05, 11.04, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:57:16.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:57:16.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:57:16.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:57:08, diff=8.679567s, valid=True
2026-05-29T14:57:16.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:57:16.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:57:16.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:57:12, diff=4.682424s, valid=True
2026-05-29T14:57:16.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:57:16.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:57:16.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:57:03, diff=13.689088s, valid=True
2026-05-29T14:57:16.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:57:16.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:57:16.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:57:16.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:57:16.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:57:16.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:57:16.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:57:12, diff=4.692096s, valid=True
2026-05-29T14:57:16.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:57:16.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:57:16.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:57:16.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992078.692787s, valid=True
2026-05-29T14:57:16.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:57:16.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:57:16.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:57:16.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:57:16.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:57:16.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:57:16.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:57:16.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:57:16.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:57:16.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:57:16.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:57:16.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:57:16.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:57:17.006 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:57:17.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:57:17.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:57:17.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:57:17.738 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:57:17.738 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:57:17.939 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:57:17.939 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:57:47.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:57:47.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:57:47.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:57:48.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:57:48.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:57:48.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:57:48.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-05-29T14:57:48.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:57:48.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-05-29T14:57:48.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:57:48.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:57:48.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:57:48.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-05-29T14:57:51.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-05-29T14:57:51.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:57:51.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:57:51.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:57:51.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:57:51.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:57:51.313 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:57:51.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:57:51.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:57:51.313 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:57:51.313 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:57:51.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:57:51.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:57:51.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:57:51.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:57:51.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:57:51.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:57:51.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:57:51.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:57:51.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:57:51.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:57:51.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:57:51.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:57:51.636 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:57:39
2026-05-29T14:57:51.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72133, datetime.datetime(2026, 5, 29, 14, 57, 39), datetime.datetime(2026, 5, 29, 14, 57, 38), 'salt', 15.17, 47.93, None, 22.12, 42.92, 10.94, 832.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:57:51.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:57:51.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:57:51.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:57:38, diff=13.642715s, valid=True
2026-05-29T14:57:51.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:57:51.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:57:51.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:58:12, diff=-20.354459s, valid=True
2026-05-29T14:57:51.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:57:51.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:57:51.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:57:33, diff=18.652265s, valid=True
2026-05-29T14:57:51.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:57:51.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:57:51.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:57:51.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:57:51.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:57:51.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:57:51.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:58:12, diff=-20.344687s, valid=True
2026-05-29T14:57:51.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:57:51.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:57:51.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:57:51.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992113.655999s, valid=True
2026-05-29T14:57:51.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:57:51.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:57:51.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:57:51.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:57:51.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:57:51.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:57:51.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:57:51.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:57:51.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:57:51.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:57:51.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:57:51.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:57:51.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:57:51.976 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:57:52.197 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:57:52.553 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:57:52.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:57:52.655 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:57:52.655 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:57:52.906 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:57:52.906 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:58:22.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:58:22.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:58:22.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:58:23.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:58:23.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:58:23.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:58:23.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-05-29T14:58:23.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:58:23.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-05-29T14:58:23.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:58:23.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:58:23.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:58:23.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-05-29T14:58:26.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T14:58:26.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:58:26.191 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:58:26.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:58:26.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:58:26.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:58:26.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:58:26.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:58:26.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:58:26.212 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:58:26.212 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:58:26.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:58:26.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:58:26.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:58:26.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:58:26.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:58:26.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:58:26.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:58:26.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:58:26.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:58:26.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:58:26.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:58:26.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:58:26.544 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:58:09
2026-05-29T14:58:26.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72134, datetime.datetime(2026, 5, 29, 14, 58, 9), datetime.datetime(2026, 5, 29, 14, 58, 9), 'salt', 14.93, 47.33, None, 17.15, 34.34, 11.1, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:58:26.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:58:26.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:58:26.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:58:09, diff=17.550605s, valid=True
2026-05-29T14:58:26.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:58:26.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:58:26.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:58:12, diff=14.553429s, valid=True
2026-05-29T14:58:26.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:58:26.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:58:26.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:58:03, diff=23.560061s, valid=True
2026-05-29T14:58:26.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:58:26.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:58:26.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:58:26.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:58:26.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:58:26.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:58:26.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:58:12, diff=14.563097s, valid=True
2026-05-29T14:58:26.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:58:26.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:58:26.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:58:26.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992148.563772s, valid=True
2026-05-29T14:58:26.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:58:26.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:58:26.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:58:26.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:58:26.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:58:26.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:58:26.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:58:26.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:58:26.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:58:26.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:58:26.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:58:26.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:58:26.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:58:26.877 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:58:27.166 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:58:27.509 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:58:27.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:58:27.613 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:58:27.613 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:58:27.784 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:58:27.784 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:58:57.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:58:57.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:58:57.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:58:58.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:58:58.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:58:58.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:58:58.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-05-29T14:58:58.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:58:58.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-05-29T14:58:58.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:58:58.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:58:58.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:58:58.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-05-29T14:59:01.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-05-29T14:59:01.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:59:01.472 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:59:01.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:59:01.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:59:01.493 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:59:01.493 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:59:01.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:59:01.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:59:01.494 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:59:01.494 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:59:01.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:59:01.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:59:01.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:59:01.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:59:01.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:59:01.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:59:01.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:59:01.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T14:59:01.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:59:01.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:59:01.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:59:01.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:59:01.849 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:58:39
2026-05-29T14:59:01.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72135, datetime.datetime(2026, 5, 29, 14, 58, 39), datetime.datetime(2026, 5, 29, 14, 58, 39), 'salt', 14.9, 48.89, None, 24.59, 39.08, 10.63, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:59:01.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:59:01.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:59:01.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:58:39, diff=22.855912s, valid=True
2026-05-29T14:59:01.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:59:01.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:59:01.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:59:12, diff=-10.14127s, valid=True
2026-05-29T14:59:01.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:59:01.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:59:01.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:58:34, diff=27.865436s, valid=True
2026-05-29T14:59:01.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:59:01.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:59:01.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:59:01.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:59:01.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:59:01.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T14:59:01.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:59:12, diff=-10.131561s, valid=True
2026-05-29T14:59:01.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:59:01.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:59:01.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:59:01.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992183.869101s, valid=True
2026-05-29T14:59:01.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:59:01.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:59:01.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:59:01.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:59:01.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:59:01.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:59:01.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:59:01.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:59:01.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:59:02.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:59:02.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:59:02.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:59:02.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:59:02.198 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:59:02.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:59:02.772 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:59:02.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:59:02.877 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:59:02.877 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:59:03.134 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:59:03.134 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T14:59:33.164 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T14:59:33.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T14:59:33.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T14:59:33.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T14:59:33.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T14:59:33.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T14:59:33.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-05-29T14:59:33.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T14:59:33.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-05-29T14:59:33.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T14:59:33.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T14:59:33.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T14:59:33.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-05-29T14:59:36.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-05-29T14:59:36.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T14:59:36.287 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T14:59:36.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T14:59:36.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T14:59:36.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T14:59:36.308 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T14:59:36.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T14:59:36.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T14:59:36.309 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T14:59:36.309 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T14:59:36.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T14:59:36.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T14:59:36.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T14:59:36.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T14:59:36.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:59:36.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:59:36.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T14:59:36.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T14:59:36.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T14:59:36.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T14:59:36.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T14:59:36.571 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T14:59:36.639 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 14:59:09
2026-05-29T14:59:36.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72136, datetime.datetime(2026, 5, 29, 14, 59, 9), datetime.datetime(2026, 5, 29, 14, 59, 9), 'salt', 14.8, 48.66, None, 23.11, 44.38, 10.69, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T14:59:36.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T14:59:36.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T14:59:36.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:59:09, diff=27.645375s, valid=True
2026-05-29T14:59:36.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T14:59:36.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:59:36.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:59:12, diff=24.64822s, valid=True
2026-05-29T14:59:36.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T14:59:36.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T14:59:36.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:59:05, diff=31.654939s, valid=True
2026-05-29T14:59:36.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T14:59:36.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:59:36.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T14:59:36.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T14:59:36.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T14:59:36.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T14:59:36.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 14:59:12, diff=24.657969s, valid=True
2026-05-29T14:59:36.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T14:59:36.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T14:59:36.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T14:59:36.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992218.65865s, valid=True
2026-05-29T14:59:36.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T14:59:36.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T14:59:36.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T14:59:36.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T14:59:36.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T14:59:36.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T14:59:36.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T14:59:36.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T14:59:36.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T14:59:36.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T14:59:36.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T14:59:36.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T14:59:37.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T14:59:37.042 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T14:59:37.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:59:37.599 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T14:59:37.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T14:59:37.700 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T14:59:37.700 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T14:59:38.692 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T14:59:38.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:00:08.711 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:00:08.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:00:08.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:00:08.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:00:08.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:00:09.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:00: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-05-29T15:00:09.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:00:09.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T15:00:09.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:00:09.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:00:09.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:00:09.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T15:00:12.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-05-29T15:00:12.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:00:12.662 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:00:12.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:00:12.669 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:00:12.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:00:12.681 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:00:12.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:00:12.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:00:12.682 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:00:12.682 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:00:12.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:00:12.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:00:12.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:00:12.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:00:12.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:00:12.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T15:00:12.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:00:12.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T15:00:12.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:00:12.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:00:12.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:00:12.944 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:00:13.006 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:00:10
2026-05-29T15:00:13.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72138, datetime.datetime(2026, 5, 29, 15, 0, 10), datetime.datetime(2026, 5, 29, 15, 0, 9), 'salt', 14.77, 50.35, None, 23.82, 25.54, 10.21, 832.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:00:13.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:00:13.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:00:13.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:00:09, diff=4.012678s, valid=True
2026-05-29T15:00:13.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:00:13.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T15:00:13.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:00:12, diff=1.015545s, valid=True
2026-05-29T15:00:13.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:00:13.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:00:13.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:00:08, diff=5.022162s, valid=True
2026-05-29T15:00:13.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:00:13.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:00:13.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:00:13.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:00:13.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:00:13.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T15:00:13.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:00:12, diff=1.025162s, valid=True
2026-05-29T15:00:13.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:00:13.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:00:13.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:00:13.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992255.025819s, valid=True
2026-05-29T15:00:13.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:00:13.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:00:13.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:00:13.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:00:13.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:00:13.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:00:13.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:00:13.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:00:13.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:00:13.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:00:13.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:00:13.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:00:13.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:00:13.364 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:00:13.588 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:00:13.944 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:00:14.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:00:14.057 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:00:14.057 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:00:14.282 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:00:14.282 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:00:44.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:00:44.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:00:44.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:00:44.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:00:44.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:00:44.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:00:44.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-05-29T15:00:44.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:00:44.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-05-29T15:00:44.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:00:44.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:00:44.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:00:44.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-05-29T15:00: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-05-29T15:00:48.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:00:48.197 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:00:48.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:00:48.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:00:48.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:00:48.216 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:00:48.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:00:48.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:00:48.216 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:00:48.216 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:00:48.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:00:48.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:00:48.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:00:48.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:00:48.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:00:48.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:00:48.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:00:48.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:00:48.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:00:48.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:00:48.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:00:48.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:00:48.538 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:00:40
2026-05-29T15:00:48.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72139, datetime.datetime(2026, 5, 29, 15, 0, 40), datetime.datetime(2026, 5, 29, 15, 0, 40), 'salt', 14.93, 50.02, None, 22.94, 21.98, 10.31, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:00:48.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:00:48.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:00:48.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:00:40, diff=8.544558s, valid=True
2026-05-29T15:00:48.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:00:48.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:00:48.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:01:12, diff=-23.452578s, valid=True
2026-05-29T15:00:48.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:00:48.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:00:48.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:00:39, diff=9.55414s, valid=True
2026-05-29T15:00:48.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:00:48.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:00:48.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:00:48.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:00:48.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:00:48.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:00:48.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:01:12, diff=-23.442834s, valid=True
2026-05-29T15:00:48.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:00:48.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:00:48.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:00:48.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992290.557833s, valid=True
2026-05-29T15:00:48.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:00:48.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:00:48.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:00:48.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:00:48.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:00:48.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:00:48.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:00:48.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:00:48.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:00:48.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:00:48.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:00:48.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:00:48.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:00:48.939 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:00:49.156 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:00:49.502 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:00:49.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:00:49.605 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:00:49.605 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:00:49.772 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:00:49.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:01:19.802 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:01:19.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:01:19.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:01:20.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:01:20.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:01:20.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:01:20.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-05-29T15:01:20.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:01:20.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-05-29T15:01:20.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:01:20.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:01:20.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:01:20.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-05-29T15:01:23.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-05-29T15:01:23.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:01:23.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:01:23.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:01:23.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:01:23.031 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:01:23.031 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:01:23.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:01:23.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:01:23.032 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:01:23.032 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:01:23.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:01:23.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:01:23.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:01:23.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:01:23.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:01:23.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T15:01:23.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:01:23.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T15:01:23.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:01:23.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:01:23.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:01:23.293 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:01:23.354 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:01:10
2026-05-29T15:01:23.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72140, datetime.datetime(2026, 5, 29, 15, 1, 10), datetime.datetime(2026, 5, 29, 15, 1, 10), 'salt', 15.0, 50.02, None, 19.05, 23.95, 10.32, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:01:23.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:01:23.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:01:23.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:01:10, diff=13.360954s, valid=True
2026-05-29T15:01:23.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:01:23.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T15:01:23.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:01:12, diff=11.363754s, valid=True
2026-05-29T15:01:23.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:01:23.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:01:23.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:01:05, diff=18.370281s, valid=True
2026-05-29T15:01:23.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:01:23.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:01:23.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:01:23.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:01:23.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:01:23.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T15:01:23.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:01:12, diff=11.373281s, valid=True
2026-05-29T15:01:23.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:01:23.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:01:23.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:01:23.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992325.373942s, valid=True
2026-05-29T15:01:23.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:01:23.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:01:23.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:01:23.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:01:23.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:01:23.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:01:23.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:01:23.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:01:23.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:01:23.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:01:23.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:01:23.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:01:23.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:01:23.695 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:01:23.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:01:24.249 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:01:24.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:01:24.350 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:01:24.350 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:01:24.518 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:01:24.518 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:01:54.548 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:01:54.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:01:54.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:01:54.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:01:54.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:01:55.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:01:55.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-05-29T15:01:55.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:01:55.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-05-29T15:01:55.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:01:55.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:01:55.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:01:55.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-05-29T15:01:57.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-05-29T15:01:57.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:01:57.757 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:01:57.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:01:57.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:01:57.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:01:57.778 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:01:57.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:01:57.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:01:57.779 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:01:57.779 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:01:57.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:01:57.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:01:57.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:01:58.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:01:58.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:01:58.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:01:58.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:01:58.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:01:58.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:01:58.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:01:58.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:01:58.121 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:01:58.180 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:01:41
2026-05-29T15:01:58.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72141, datetime.datetime(2026, 5, 29, 15, 1, 41), datetime.datetime(2026, 5, 29, 15, 1, 40), 'salt', 15.07, 50.28, None, 18.07, 33.47, 10.25, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:01:58.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:01:58.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:01:58.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:01:40, diff=18.186682s, valid=True
2026-05-29T15:01:58.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:01:58.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:01:58.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:02:12, diff=-13.810491s, valid=True
2026-05-29T15:01:58.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:01:58.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:01:58.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:01:35, diff=23.19617s, valid=True
2026-05-29T15:01:58.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:01:58.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:01:58.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:01:58.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:01:58.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:01:58.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:01:58.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:02:12, diff=-13.800833s, valid=True
2026-05-29T15:01:58.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:01:58.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:01:58.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:01:58.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992360.199835s, valid=True
2026-05-29T15:01:58.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:01:58.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:01:58.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:01:58.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:01:58.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:01:58.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:01:58.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:01:58.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:01:58.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:01:58.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:01:58.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:01:58.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:01:58.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:01:58.513 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:01:58.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:01:59.076 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:01:59.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:01:59.177 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:01:59.177 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:01:59.425 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:01:59.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:02:29.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:02:29.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:02:29.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:02:29.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:02:29.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:02:29.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:02:29.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-05-29T15:02:29.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:02:29.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-05-29T15:02:29.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:02:29.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:02:29.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:02:29.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-05-29T15:02:32.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-05-29T15:02:32.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:02:32.485 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:02:32.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:02:32.492 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:02:32.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:02:32.504 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:02:32.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:02:32.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:02:32.505 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:02:32.505 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:02:32.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:02:32.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:02:32.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:02:32.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:02:32.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:02:32.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T15:02:32.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:02:32.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T15:02:32.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:02:32.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:02:32.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:02:32.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:02:32.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:02:11
2026-05-29T15:02:32.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72142, datetime.datetime(2026, 5, 29, 15, 2, 11), datetime.datetime(2026, 5, 29, 15, 2, 10), 'salt', 15.23, 49.72, None, 24.21, 44.84, 10.42, 831.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:02:32.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:02:32.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:02:32.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:02:10, diff=22.823496s, valid=True
2026-05-29T15:02:32.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:02:32.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T15:02:32.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:02:12, diff=20.826427s, valid=True
2026-05-29T15:02:32.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:02:32.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:02:32.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:02:05, diff=27.833258s, valid=True
2026-05-29T15:02:32.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:02:32.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:02:32.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:02:32.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:02:32.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:02:32.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T15:02:32.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:02:12, diff=20.836368s, valid=True
2026-05-29T15:02:32.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:02:32.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:02:32.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:02:32.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992394.837065s, valid=True
2026-05-29T15:02:32.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:02:32.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:02:32.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:02:32.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:02:32.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:02:32.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:02:32.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:02:32.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:02:32.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:02:32.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:02:33.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:02:33.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:02:33.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:02:33.157 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:02:33.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:02:33.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:02:33.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:02:33.818 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:02:33.819 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:02:34.071 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:02:34.071 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:03:04.086 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:03:04.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:03:04.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:03:04.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:03:04.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:03:04.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:03:04.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T15:03:04.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:03:04.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-05-29T15:03:04.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:03:04.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:03:04.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:03:04.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-05-29T15:03:07.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-05-29T15:03:07.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:03:07.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:03:07.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:03:07.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:03:07.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:03:07.211 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:03:07.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:03:07.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:03:07.211 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:03:07.211 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:03:07.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:03:07.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:03:07.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:03:07.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:03:07.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:03:07.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:03:07.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:03:07.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:03:07.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:03:07.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:03:07.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:03:07.480 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:03:07.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:02:41
2026-05-29T15:03:07.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72143, datetime.datetime(2026, 5, 29, 15, 2, 41), datetime.datetime(2026, 5, 29, 15, 2, 41), 'salt', 15.1, 48.86, None, 24.81, 47.14, 10.66, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:03:07.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:03:07.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:03:07.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:02:41, diff=26.545792s, valid=True
2026-05-29T15:03:07.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:03:07.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:03:07.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:03:12, diff=-4.451361s, valid=True
2026-05-29T15:03:07.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:03:07.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:03:07.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:02:36, diff=31.55566s, valid=True
2026-05-29T15:03:07.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:03:07.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:03:07.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:03:07.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:03:07.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:03:07.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:03:07.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:03:12, diff=-4.441146s, valid=True
2026-05-29T15:03:07.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:03:07.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:03:07.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:03:07.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992429.559561s, valid=True
2026-05-29T15:03:07.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:03:07.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:03:07.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:03:07.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:03:07.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:03:07.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:03:07.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:03:07.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:03:07.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:03:07.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:03:07.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:03:07.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:03:07.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:03:07.882 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:03:08.103 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:03:08.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:03:08.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:03:08.560 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:03:08.560 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:03:08.817 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:03:08.817 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:03:38.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:03:38.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:03:38.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:03:39.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:03:39.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:03:39.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:03:39.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-05-29T15:03:39.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:03:39.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-05-29T15:03:39.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:03:39.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:03:39.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:03:39.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T15:03:41.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-05-29T15:03:41.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:03:41.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:03:41.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:03:41.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:03:41.983 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:03:41.983 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:03:41.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:03:41.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:03:41.983 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:03:41.984 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:03:41.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:03:42.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:03:42.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:03:42.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:03:42.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:03:42.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:03:42.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:03:42.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:03:42.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:03:42.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:03:42.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:03:42.238 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:03:42.297 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:03:41
2026-05-29T15:03:42.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72145, datetime.datetime(2026, 5, 29, 15, 3, 41), datetime.datetime(2026, 5, 29, 15, 3, 41), 'salt', 14.83, 50.48, None, 20.01, 55.09, 10.17, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:03:42.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:03:42.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:03:42.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:03:41, diff=1.303337s, valid=True
2026-05-29T15:03:42.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:03:42.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:03:42.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:04:12, diff=-29.693844s, valid=True
2026-05-29T15:03:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:03:42.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:03:42.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:03:37, diff=5.31284s, valid=True
2026-05-29T15:03:42.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:03:42.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:03:42.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:03:42.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:03:42.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:03:42.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:03:42.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:04:12, diff=-29.684154s, valid=True
2026-05-29T15:03:42.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:03:42.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:03:42.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:03:42.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992464.3165s, valid=True
2026-05-29T15:03:42.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:03:42.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:03:42.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:03:42.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:03:42.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:03:42.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:03:42.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:03:42.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:03:42.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:03:42.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:03:42.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:03:42.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:03:42.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:03:42.632 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:03:42.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:03:43.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:03:43.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:03:43.355 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:03:43.355 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:03:43.561 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:03:43.561 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:04:13.588 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:04:13.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:04:13.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:04:13.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:04:13.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:04:14.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:04:14.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-05-29T15:04:14.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:04:14.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-05-29T15:04:14.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:04:14.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:04:14.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:04:14.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T15:04:16.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-05-29T15:04:16.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:04:16.991 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:04:16.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:04:17.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:04:17.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:04:17.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:04:17.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:04:17.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:04:17.013 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:04:17.013 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:04:17.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:04:17.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:04:17.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:04:17.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:04:17.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:04:17.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:04:17.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:04:17.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:04:17.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:04:17.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:04:17.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:04:17.271 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:04:17.329 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:04:12
2026-05-29T15:04:17.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72146, datetime.datetime(2026, 5, 29, 15, 4, 12), datetime.datetime(2026, 5, 29, 15, 4, 11), 'salt', 15.03, 49.79, None, 20.5, 32.98, 10.38, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:04:17.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:04:17.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:04:17.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:04:11, diff=6.339993s, valid=True
2026-05-29T15:04:17.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:04:17.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:04:17.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:04:12, diff=5.342823s, valid=True
2026-05-29T15:04:17.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:04:17.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:04:17.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:04:09, diff=8.349513s, valid=True
2026-05-29T15:04:17.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:04:17.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:04:17.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:04:17.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:04:17.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:04:17.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:04:17.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:04:12, diff=5.35254s, valid=True
2026-05-29T15:04:17.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:04:17.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:04:17.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:04:17.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992499.353204s, valid=True
2026-05-29T15:04:17.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:04:17.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:04:17.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:04:17.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:04:17.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:04:17.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:04:17.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:04:17.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:04:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:04:17.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:04:17.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:04:17.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:04:17.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:04:17.674 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:04:17.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:04:18.279 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:04:18.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:04:18.379 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:04:18.380 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:04:18.626 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:04:18.626 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:04:48.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:04:48.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:04:48.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:04:49.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:04:49.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:04:49.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:04:49.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-05-29T15:04:49.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:04:49.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T15:04:49.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:04:49.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:04:49.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:04:49.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-05-29T15:04:51.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-05-29T15:04:51.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:04:51.967 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:04:51.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:04:51.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:04:51.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:04:51.989 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:04:51.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:04:51.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:04:51.990 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:04:51.990 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:04:51.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:04:52.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:04:52.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:04:52.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:04:52.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:04:52.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:04:52.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:04:52.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:04:52.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:04:52.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:04:52.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:04:52.269 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:04:52.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:04:42
2026-05-29T15:04:52.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72147, datetime.datetime(2026, 5, 29, 15, 4, 42), datetime.datetime(2026, 5, 29, 15, 4, 41), 'salt', 15.03, 48.82, None, 20.85, 36.0, 10.66, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:04:52.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:04:52.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:04:52.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:04:41, diff=11.353765s, valid=True
2026-05-29T15:04:52.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:04:52.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:04:52.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:05:12, diff=-19.643435s, valid=True
2026-05-29T15:04:52.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:04:52.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:04:52.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:04:40, diff=12.363248s, valid=True
2026-05-29T15:04:52.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:04:52.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:04:52.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:04:52.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:04:52.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:04:52.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:04:52.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:05:12, diff=-19.633695s, valid=True
2026-05-29T15:04:52.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:04:52.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:04:52.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:04:52.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992534.366969s, valid=True
2026-05-29T15:04:52.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:04:52.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:04:52.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:04:52.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:04:52.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:04:52.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:04:52.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:04:52.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:04:52.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:04:52.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:04:52.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:04:52.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:04:52.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:04:52.681 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:04:52.978 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:04:53.323 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:04:53.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:04:53.423 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:04:53.423 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:04:53.669 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:04:53.669 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:05:23.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:05:23.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:05:23.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:05:24.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:05:24.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:05:24.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:05:24.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-05-29T15:05:24.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:05:24.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-05-29T15:05:24.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:05:24.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:05:24.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:05:24.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-05-29T15:05:26.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-05-29T15:05:26.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:05:26.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:05:26.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:05:26.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:05:26.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:05:26.922 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:05:26.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:05:26.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:05:26.922 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:05:26.922 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:05:26.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:05:27.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:05:27.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:05:27.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:05:27.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:05:27.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:05:27.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:05:27.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:05:27.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:05:27.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:05:27.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:05:27.176 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:05:27.235 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:05:12
2026-05-29T15:05:27.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72148, datetime.datetime(2026, 5, 29, 15, 5, 12), datetime.datetime(2026, 5, 29, 15, 5, 12), 'salt', 15.2, 49.02, None, 21.98, 41.42, 10.62, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:05:27.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:05:27.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:05:27.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:05:12, diff=15.241611s, valid=True
2026-05-29T15:05:27.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:05:27.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:05:27.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:05:12, diff=15.244406s, valid=True
2026-05-29T15:05:27.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:05:27.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:05:27.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:05:12, diff=15.25109s, valid=True
2026-05-29T15:05:27.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:05:27.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:05:27.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:05:27.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:05:27.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:05:27.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:05:27.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:05:12, diff=15.254087s, valid=True
2026-05-29T15:05:27.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:05:27.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:05:27.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:05:27.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992569.25475s, valid=True
2026-05-29T15:05:27.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:05:27.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:05:27.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:05:27.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:05:27.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:05:27.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:05:27.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:05:27.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:05:27.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:05:27.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:05:27.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:05:27.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:05:27.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:05:27.571 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:05:27.805 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:05:28.153 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:05:28.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:05:28.254 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:05:28.254 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:05:28.415 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:05:28.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:05:58.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:05:58.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:05:58.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:05:58.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:05:58.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:05:58.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:05:58.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-05-29T15:05:58.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:05:58.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-05-29T15:05:58.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:05:58.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:05:58.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:05:58.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-05-29T15:06:01.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-05-29T15:06:01.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:06:01.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:06:01.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:06:01.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:06:01.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:06:01.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:06:01.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:06:01.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:06:01.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:06:01.722 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:06:01.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:06:01.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:06:01.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:06:01.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:06:01.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:06:01.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:06:01.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:06:01.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:06:01.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:06:01.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:06:01.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:06:01.978 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:06:02.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:05:42
2026-05-29T15:06:02.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72149, datetime.datetime(2026, 5, 29, 15, 5, 42), datetime.datetime(2026, 5, 29, 15, 5, 42), 'salt', 15.17, 48.69, None, 22.37, 50.05, 10.72, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:06:02.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:06:02.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:06:02.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:05:42, diff=20.045734s, valid=True
2026-05-29T15:06:02.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:06:02.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:06:02.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:06:12, diff=-9.951342s, valid=True
2026-05-29T15:06:02.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:06:02.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:06:02.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:05:37, diff=25.055416s, valid=True
2026-05-29T15:06:02.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:06:02.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:06:02.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:06:02.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:06:02.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:06:02.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:06:02.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:06:12, diff=-9.941531s, valid=True
2026-05-29T15:06:02.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:06:02.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:06:02.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:06:02.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992604.059132s, valid=True
2026-05-29T15:06:02.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:06:02.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:06:02.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:06:02.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:06:02.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:06:02.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:06:02.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:06:02.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:06:02.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:06:02.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:06:02.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:06:02.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:06:02.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:06:02.450 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:06:02.672 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:06:03.030 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:06:03.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:06:03.138 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:06:03.138 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:06:05.343 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:06:05.343 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:06:35.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:06:35.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:06:35.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:06:35.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:06:35.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:06:36.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:06:36.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-05-29T15:06:36.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:06: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-05-29T15:06:36.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:06:36.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:06:36.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:06:36.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-05-29T15:06:38.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-05-29T15:06:38.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:06:38.685 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:06:38.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:06:38.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:06:38.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:06:38.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:06:38.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:06:38.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:06:38.705 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:06:38.705 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:06:38.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:06:38.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:06:38.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:06:38.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:06:38.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:06:38.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:06:38.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:06:38.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:06:38.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:06:38.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:06:38.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:06:38.956 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:06:39.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:06:13
2026-05-29T15:06:39.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72150, datetime.datetime(2026, 5, 29, 15, 6, 13), datetime.datetime(2026, 5, 29, 15, 6, 12), 'salt', 15.33, 48.86, None, 24.06, 38.23, 10.68, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:06:39.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:06:39.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:06:39.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:06:12, diff=27.020417s, valid=True
2026-05-29T15:06:39.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:06:39.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:06:39.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:06:12, diff=27.023283s, valid=True
2026-05-29T15:06:39.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:06:39.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:06:39.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:06:07, diff=32.029999s, valid=True
2026-05-29T15:06:39.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:06:39.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:06:39.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:06:39.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:06:39.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:06:39.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:06:39.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:06:12, diff=27.033065s, valid=True
2026-05-29T15:06:39.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:06:39.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:06:39.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:06:39.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992641.033735s, valid=True
2026-05-29T15:06:39.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:06:39.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:06:39.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:06:39.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:06:39.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:06:39.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:06:39.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:06:39.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:06:39.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:06:39.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:06:39.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:06:39.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:06:39.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:06:39.347 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:06:39.562 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:06:39.917 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:06:40.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:06:40.029 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:06:40.029 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:06:40.306 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:06:40.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:07:10.320 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:07:10.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:07:10.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:07:10.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:07:10.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:07:11.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:07:11.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-05-29T15:07:11.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:07:11.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-05-29T15:07:11.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:07:11.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:07:11.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:07:11.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-05-29T15:07:13.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-05-29T15:07:13.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:07:13.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:07:13.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:07:13.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:07:13.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:07:13.720 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:07:13.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:07:13.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:07:13.720 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:07:13.720 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:07:13.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:07:13.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:07:13.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:07:13.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:07:13.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:07:13.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:07:13.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:07:13.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:07:13.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:07:13.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:07:13.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:07:13.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:07:14.039 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:07:13
2026-05-29T15:07:14.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72152, datetime.datetime(2026, 5, 29, 15, 7, 13), datetime.datetime(2026, 5, 29, 15, 7, 13), 'salt', 15.2, 49.29, None, 22.58, 50.42, 10.55, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:07:14.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:07:14.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:07:14.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:07:13, diff=1.046038s, valid=True
2026-05-29T15:07:14.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:07:14.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:07:14.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:07:12, diff=2.048884s, valid=True
2026-05-29T15:07:14.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:07:14.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:07:14.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:07:08, diff=6.055631s, valid=True
2026-05-29T15:07:14.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:07:14.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:07:14.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:07:14.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:07:14.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:07:14.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:07:14.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:07:12, diff=2.058629s, valid=True
2026-05-29T15:07:14.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:07:14.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:07:14.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:07:14.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992676.059287s, valid=True
2026-05-29T15:07:14.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:07:14.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:07:14.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:07:14.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:07:14.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:07:14.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:07:14.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:07:14.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:07:14.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:07:14.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:07:14.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:07:14.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:07:14.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:07:14.429 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:07:14.662 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:07:15.010 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:07:15.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:07:15.112 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:07:15.112 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:07:15.273 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:07:15.273 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:07:45.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:07:45.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:07:45.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:07:45.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:07:45.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:07:45.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:07:45.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T15:07:45.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:07:45.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-05-29T15:07:45.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:07:45.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:07:45.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:07:45.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-05-29T15:07:48.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-05-29T15:07:48.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:07:48.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:07:48.595 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:07:48.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:07:48.617 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:07:48.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:07:48.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:07:48.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:07:48.618 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:07:48.618 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:07:48.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:07:48.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:07:48.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:07:48.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:07:48.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:07:48.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:07:48.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:07:48.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:07:48.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:07:48.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:07:48.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:07:48.871 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:07:48.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:07:43
2026-05-29T15:07:48.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72153, datetime.datetime(2026, 5, 29, 15, 7, 43), datetime.datetime(2026, 5, 29, 15, 7, 43), 'salt', 15.2, 48.69, None, 23.46, 51.39, 10.72, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:07:48.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:07:48.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:07:48.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:07:43, diff=5.938077s, valid=True
2026-05-29T15:07:48.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:07:48.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:07:48.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:08:12, diff=-23.059151s, valid=True
2026-05-29T15:07:48.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:07:48.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:07:48.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:07:39, diff=9.947488s, valid=True
2026-05-29T15:07:48.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:07:48.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:07:48.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:07:48.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:07:48.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:07:48.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:07:48.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:08:12, diff=-23.049512s, valid=True
2026-05-29T15:07:48.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:07:48.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:07:48.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:07:48.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992710.951148s, valid=True
2026-05-29T15:07:48.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:07:48.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:07:48.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:07:48.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:07:48.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:07:49.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:07:49.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:07:49.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:07:49.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:07:49.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:07:49.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:07:49.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:07:49.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:07:49.263 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:07:49.476 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:07:49.824 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:07:49.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:07:49.935 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:07:49.935 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:07:50.213 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:07:50.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:08:20.218 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:08:20.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:08:20.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:08:20.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:08:20.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:08:20.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:08:20.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-05-29T15:08:20.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:08:20.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-05-29T15:08:20.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:08:20.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:08:20.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:08:20.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-05-29T15:08:23.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-05-29T15:08:23.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:08:23.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:08:23.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:08:23.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:08:23.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:08:23.612 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:08:23.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:08:23.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:08:23.613 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:08:23.613 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:08:23.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:08:23.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:08:23.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:08:23.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:08:23.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:08:23.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:08:23.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:08:23.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:08:23.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:08:23.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:08:23.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:08:23.927 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:08:24.010 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:08:13
2026-05-29T15:08:24.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72154, datetime.datetime(2026, 5, 29, 15, 8, 13), datetime.datetime(2026, 5, 29, 15, 8, 13), 'salt', 15.26, 49.92, None, 25.19, 32.98, 10.36, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:08:24.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:08:24.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:08:24.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:08:13, diff=11.016566s, valid=True
2026-05-29T15:08:24.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:08:24.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:08:24.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:08:12, diff=12.019347s, valid=True
2026-05-29T15:08:24.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:08:24.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:08:24.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:08:10, diff=14.025905s, valid=True
2026-05-29T15:08:24.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:08:24.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:08:24.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:08:24.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:08:24.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:08:24.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:08:24.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:08:12, diff=12.028907s, valid=True
2026-05-29T15:08:24.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:08:24.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:08:24.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:08:24.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992746.029555s, valid=True
2026-05-29T15:08:24.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:08:24.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:08:24.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:08:24.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:08:24.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:08:24.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:08:24.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:08:24.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:08:24.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:08:24.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:08:24.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:08:24.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:08:24.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:08:24.344 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:08:24.561 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:08:24.909 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:08:25.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:08:25.013 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:08:25.013 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:08:25.271 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:08:25.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:08:55.300 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:08:55.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:08:55.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:08:55.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:08:55.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:08:55.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:08:55.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-05-29T15:08:55.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:08:55.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-05-29T15:08:55.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:08:55.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:08:55.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:08:55.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-05-29T15:08:58.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-05-29T15:08:58.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:08:58.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:08:58.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:08:58.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:08:58.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:08:58.545 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:08:58.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:08:58.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:08:58.546 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:08:58.546 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:08:58.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:08:58.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:08:58.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:08:58.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:08:58.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:08:58.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:08:58.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:08:58.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:08:58.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:08:58.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:08:58.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:08:58.818 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:08:58.876 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:08:44
2026-05-29T15:08:58.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72155, datetime.datetime(2026, 5, 29, 15, 8, 44), datetime.datetime(2026, 5, 29, 15, 8, 43), 'salt', 15.3, 49.75, None, 22.41, 34.34, 10.42, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:08:58.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:08:58.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:08:58.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:08:43, diff=15.882167s, valid=True
2026-05-29T15:08:58.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:08:58.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:08:58.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:09:12, diff=-13.115007s, valid=True
2026-05-29T15:08:58.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:08:58.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:08:58.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:08:42, diff=16.89154s, valid=True
2026-05-29T15:08:58.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:08:58.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:08:58.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:08:58.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:08:58.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:08:58.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:08:58.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:09:12, diff=-13.105424s, valid=True
2026-05-29T15:08:58.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:08:58.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:08:58.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:08:58.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992780.895254s, valid=True
2026-05-29T15:08:58.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:08:58.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:08:58.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:08:58.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:08:58.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:08:58.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:08:58.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:08:58.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:08:58.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:08:59.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:08:59.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:08:59.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:08:59.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:08:59.221 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:08:59.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:08:59.785 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:08:59.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:08:59.959 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:08:59.959 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:09:00.136 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:09:00.136 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:09:30.167 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:09:30.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:09:30.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:09:30.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:09:30.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:09:30.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:09:30.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-05-29T15:09:30.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:09:30.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-05-29T15:09:30.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:09:30.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:09:30.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:09:30.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-05-29T15:09:33.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-05-29T15:09:33.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:09:33.323 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:09:33.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:09:33.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:09:33.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:09:33.343 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:09:33.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:09:33.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:09:33.344 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:09:33.344 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:09:33.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:09:33.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:09:33.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:09:33.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:09:33.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:09:33.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:09:33.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:09:33.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:09:33.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:09:33.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:09:33.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:09:33.621 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:09:33.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:09:14
2026-05-29T15:09:33.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72156, datetime.datetime(2026, 5, 29, 15, 9, 14), datetime.datetime(2026, 5, 29, 15, 9, 14), 'salt', 15.33, 49.19, None, 24.73, 24.75, 10.58, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:09:33.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:09:33.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:09:33.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:09:14, diff=19.687658s, valid=True
2026-05-29T15:09:33.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:09:33.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:09:33.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:09:12, diff=21.691644s, valid=True
2026-05-29T15:09:33.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:09:33.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:09:33.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:09:13, diff=20.698254s, valid=True
2026-05-29T15:09:33.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:09:33.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:09:33.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:09:33.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:09:33.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:09:33.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:09:33.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:09:12, diff=21.7013s, valid=True
2026-05-29T15:09:33.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:09:33.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:09:33.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:09:33.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992815.702047s, valid=True
2026-05-29T15:09:33.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:09:33.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:09:33.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:09:33.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:09:33.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:09:33.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:09:33.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:09:33.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:09:33.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:09:33.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:09:33.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:09:33.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:09:33.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:09:34.028 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:09:34.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:09:34.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:09:34.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:09:34.720 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:09:34.720 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:09:34.944 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:09:34.944 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:10:04.975 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:10:04.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:10:04.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:10:05.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:10:05.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:10:05.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:10:05.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-05-29T15:10:05.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:10:05.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-05-29T15:10:05.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:10:05.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:10:05.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:10:05.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-05-29T15:10:08.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-05-29T15:10:08.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:10:08.083 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:10:08.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:10:08.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:10:08.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:10:08.103 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:10:08.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:10:08.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:10:08.104 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:10:08.104 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:10:08.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:10:08.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:10:08.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:10:08.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:10:08.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:10:08.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:10:08.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:10:08.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:10:08.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:10:08.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:10:08.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:10:08.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:10:08.435 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:09:44
2026-05-29T15:10:08.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72157, datetime.datetime(2026, 5, 29, 15, 9, 44), datetime.datetime(2026, 5, 29, 15, 9, 43), 'salt', 15.26, 49.42, None, 21.56, 32.51, 10.51, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:10:08.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:10:08.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:10:08.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:09:43, diff=25.441851s, valid=True
2026-05-29T15:10:08.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:10:08.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:10:08.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:10:12, diff=-3.555257s, valid=True
2026-05-29T15:10:08.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:10:08.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:10:08.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:09:39, diff=29.451447s, valid=True
2026-05-29T15:10:08.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:10:08.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:10:08.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:10:08.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:10:08.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:10:08.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:10:08.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:10:12, diff=-3.545518s, valid=True
2026-05-29T15:10:08.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:10:08.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:10:08.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:10:08.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992850.455148s, valid=True
2026-05-29T15:10:08.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:10:08.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:10:08.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:10:08.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:10:08.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:10:08.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:10:08.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:10:08.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:10:08.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:10:08.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:10:08.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:10:08.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:10:08.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:10:08.771 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:10:08.983 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:10:09.399 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:10:09.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:10:09.498 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:10:09.498 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:10:09.637 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:10:09.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:10:39.652 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:10:39.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:10:39.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:10:40.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:10:40.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:10:40.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:10:40.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-05-29T15:10:40.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:10:40.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-05-29T15:10:40.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:10:40.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:10:40.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:10:40.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-05-29T15:10:42.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-05-29T15:10:42.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:10:42.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:10:42.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:10:42.983 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:10:42.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:10:42.994 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:10:42.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:10:42.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:10:42.995 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:10:42.995 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:10:43.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:10:43.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:10:43.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:10:43.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:10:43.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:10:43.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:10:43.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:10:43.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:10:43.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:10:43.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:10:43.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:10:43.247 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:10:43.305 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:10:14
2026-05-29T15:10:43.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72158, datetime.datetime(2026, 5, 29, 15, 10, 14), datetime.datetime(2026, 5, 29, 15, 10, 14), 'salt', 15.3, 48.33, None, 23.18, 9.04, 10.84, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:10:43.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:10:43.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:10:43.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:10:14, diff=29.311389s, valid=True
2026-05-29T15:10:43.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:10:43.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:10:43.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:10:12, diff=31.314363s, valid=True
2026-05-29T15:10:43.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:10:43.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:10:43.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:10:10, diff=33.321028s, valid=True
2026-05-29T15:10:43.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:10:43.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:10:43.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:10:43.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:10:43.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:10:43.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:10:43.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:10:12, diff=31.324104s, valid=True
2026-05-29T15:10:43.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:10:43.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:10:43.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:10:43.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992885.32478s, valid=True
2026-05-29T15:10:43.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:10:43.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:10:43.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:10:43.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:10:43.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:10:43.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:10:43.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:10:43.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:10:43.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:10:43.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:10:43.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:10:43.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:10:43.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:10:43.780 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:10:43.994 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:10:44.339 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:10:44.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:10:44.439 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:10:44.439 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:10:44.606 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:10:44.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:11:14.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:11:14.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:11:14.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:11:15.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:11:15.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:11:15.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:11:15.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-05-29T15:11:15.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:11: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-05-29T15:11:15.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:11:15.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:11:15.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:11:15.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-05-29T15:11:18.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-05-29T15:11:18.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:11:18.008 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:11:18.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:11:18.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:11:18.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:11:18.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:11:18.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:11:18.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:11:18.030 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:11:18.030 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:11:18.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:11:18.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:11:18.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:11:18.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:11:18.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:11:18.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:11:18.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:11:18.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:11:18.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:11:18.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:11:18.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:11:18.278 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:11:18.337 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:11:15
2026-05-29T15:11:18.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72160, datetime.datetime(2026, 5, 29, 15, 11, 15), datetime.datetime(2026, 5, 29, 15, 11, 14), 'salt', 15.2, 48.99, None, 21.74, 27.35, 10.63, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:11:18.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:11:18.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:11:18.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:11:14, diff=4.343554s, valid=True
2026-05-29T15:11:18.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:11:18.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:11:18.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:11:12, diff=6.346372s, valid=True
2026-05-29T15:11:18.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:11:18.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:11:18.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:11:10, diff=8.353005s, valid=True
2026-05-29T15:11:18.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:11:18.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:11:18.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:11:18.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:11:18.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:11:18.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:11:18.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:11:12, diff=6.356063s, valid=True
2026-05-29T15:11:18.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:11:18.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:11:18.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:11:18.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992920.356732s, valid=True
2026-05-29T15:11:18.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:11:18.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:11:18.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:11:18.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:11:18.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:11:18.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:11:18.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:11:18.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:11:18.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:11:18.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:11:18.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:11:18.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:11:18.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:11:18.670 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:11:18.883 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:11:19.302 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:11:19.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:11:19.401 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:11:19.401 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:11:19.599 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:11:19.599 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:11:49.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:11:49.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:11:49.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:11:49.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:11:50.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:11:50.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:11:50.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-05-29T15:11:50.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:11:50.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-05-29T15:11:50.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:11:50.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:11:50.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:11:50.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-05-29T15:11:53.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-05-29T15:11:53.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:11:53.050 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:11:53.050 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:11:53.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:11:53.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:11:53.072 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:11:53.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:11:53.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:11:53.072 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:11:53.072 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:11:53.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:11:53.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:11:53.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:11:53.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:11:53.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:11:53.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:11:53.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:11:53.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:11:53.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:11:53.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:11:53.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:11:53.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:11:53.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:11:45
2026-05-29T15:11:53.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72161, datetime.datetime(2026, 5, 29, 15, 11, 45), datetime.datetime(2026, 5, 29, 15, 11, 45), 'salt', 15.26, 48.79, None, 21.56, 24.82, 10.69, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:11:53.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:11:53.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:11:53.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:11:45, diff=8.392671s, valid=True
2026-05-29T15:11:53.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:11:53.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:11:53.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:12:12, diff=-18.604462s, valid=True
2026-05-29T15:11:53.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:11:53.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:11:53.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:11:40, diff=13.402155s, valid=True
2026-05-29T15:11:53.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:11:53.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:11:53.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:11:53.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:11:53.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:11:53.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:11:53.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:12:12, diff=-18.594757s, valid=True
2026-05-29T15:11:53.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:11:53.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:11:53.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:11:53.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992955.405913s, valid=True
2026-05-29T15:11:53.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:11:53.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:11:53.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:11:53.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:11:53.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:11:53.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:11:53.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:11:53.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:11:53.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:11:53.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:11:53.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:11:53.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:11:53.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:11:53.736 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:11:53.955 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:11:54.307 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:11:54.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:11:54.408 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:11:54.408 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:11:55.270 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:11:55.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:12:25.292 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:12:25.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:12:25.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:12:25.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:12:25.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:12:25.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:12:25.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-05-29T15:12:25.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:12:25.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-05-29T15:12:25.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:12:25.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:12:25.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:12:25.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-05-29T15:12:28.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T15:12:28.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:12:28.409 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:12:28.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:12:28.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:12:28.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:12:28.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:12:28.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:12:28.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:12:28.434 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:12:28.434 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:12:28.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:12:28.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:12:28.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:12:28.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:12:28.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:12:28.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:12:28.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:12:28.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:12:28.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:12:28.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:12:28.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:12:28.697 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:12:28.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:12:15
2026-05-29T15:12:28.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72162, datetime.datetime(2026, 5, 29, 15, 12, 15), datetime.datetime(2026, 5, 29, 15, 12, 15), 'salt', 15.23, 48.82, None, 25.48, 33.26, 10.68, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:12:28.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:12:28.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:12:28.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:12:15, diff=13.761238s, valid=True
2026-05-29T15:12:28.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:12:28.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:12:28.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:12:12, diff=16.7641s, valid=True
2026-05-29T15:12:28.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:12:28.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:12:28.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:12:11, diff=17.77099s, valid=True
2026-05-29T15:12:28.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:12:28.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:12:28.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:12:28.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:12:28.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:12:28.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:12:28.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:12:12, diff=16.774113s, valid=True
2026-05-29T15:12:28.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:12:28.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:12:28.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:12:28.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=992990.774916s, valid=True
2026-05-29T15:12:28.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:12:28.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:12:28.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:12:28.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:12:28.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:12:28.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:12:28.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:12:28.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:12:28.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:12:28.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:12:28.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:12:29.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:12:29.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:12:29.110 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:12:29.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:12:29.768 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:12:29.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:12: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-05-29T15:12: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-05-29T15:12:30.109 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:12:30.109 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:13:00.139 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:13:00.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:13:00.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:13:00.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:13:00.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:13:00.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:13:00.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-05-29T15:13:00.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:13:00.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-05-29T15:13:00.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:13:00.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:13:00.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:13:00.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-05-29T15:13: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-05-29T15:13:03.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:13:03.428 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:13:03.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:13:03.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:13:03.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:13:03.449 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:13:03.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:13:03.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:13:03.449 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:13:03.449 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:13:03.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:13:03.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:13:03.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:13:03.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:13:03.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:13:03.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:13:03.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:13:03.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:13:03.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:13:03.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:13:03.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:13:03.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:13:03.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:12:45
2026-05-29T15:13:03.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72163, datetime.datetime(2026, 5, 29, 15, 12, 45), datetime.datetime(2026, 5, 29, 15, 12, 45), 'salt', 15.3, 49.62, None, 26.04, 30.63, 10.46, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:13:03.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:13:03.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:13:03.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:12:45, diff=18.790809s, valid=True
2026-05-29T15:13:03.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:13:03.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:13:03.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:13:12, diff=-8.206274s, valid=True
2026-05-29T15:13:03.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:13:03.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:13:03.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:12:43, diff=20.800563s, valid=True
2026-05-29T15:13:03.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:13:03.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:13:03.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:13:03.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:13:03.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:13:03.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:13:03.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:13:12, diff=-8.19636s, valid=True
2026-05-29T15:13:03.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:13:03.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:13:03.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:13:03.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993025.804299s, valid=True
2026-05-29T15:13:03.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:13:03.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:13:03.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:13:03.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:13:03.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:13:03.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:13:03.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:13:03.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:13:03.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:13:03.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:13:03.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:13:04.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:13:04.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:13:04.120 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:13:04.336 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:13:04.684 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:13:04.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:13:04.786 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:13:04.786 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:13:05.037 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:13:05.037 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:13:35.067 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:13:35.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:13:35.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:13:35.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:13:35.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:13:35.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:13:35.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-05-29T15:13:35.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:13: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-05-29T15:13:35.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:13:35.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:13:35.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:13:35.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T15:13:38.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T15:13:38.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:13:38.191 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:13:38.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:13:38.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:13:38.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:13:38.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:13:38.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:13:38.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:13:38.213 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:13:38.213 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:13:38.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:13:38.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:13:38.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:13:38.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:13:38.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:13:38.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:13:38.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:13:38.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:13:38.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:13:38.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:13:38.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:13:38.459 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:13:38.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:13:16
2026-05-29T15:13:38.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72164, datetime.datetime(2026, 5, 29, 15, 13, 16), datetime.datetime(2026, 5, 29, 15, 13, 15), 'salt', 15.26, 49.69, None, 23.08, 25.99, 10.43, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:13:38.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:13:38.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:13:38.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:13:15, diff=23.524606s, valid=True
2026-05-29T15:13:38.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:13:38.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:13:38.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:13:12, diff=26.527477s, valid=True
2026-05-29T15:13:38.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:13:38.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:13:38.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:13:14, diff=24.53416s, valid=True
2026-05-29T15:13:38.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:13:38.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:13:38.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:13:38.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:13:38.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:13:38.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:13:38.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:13:12, diff=26.537191s, valid=True
2026-05-29T15:13:38.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:13:38.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:13:38.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:13:38.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993060.538009s, valid=True
2026-05-29T15:13:38.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:13:38.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:13:38.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:13:38.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:13:38.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:13:38.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:13:38.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:13:38.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:13:38.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:13:38.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:13:38.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:13:38.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:13:38.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:13:38.851 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:13:39.135 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:13:39.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:13:39.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:13:39.581 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:13:39.581 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:13:39.832 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:13:39.832 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:14:09.861 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:14:09.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:14:09.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:14:10.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:14:10.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:14:10.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:14:10.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-05-29T15:14:10.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:14:10.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T15:14:10.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:14:10.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:14:10.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:14:10.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-05-29T15:14:12.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-05-29T15:14:12.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:14:12.969 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:14:12.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:14:12.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:14:12.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:14:12.991 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:14:12.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:14:12.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:14:12.991 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:14:12.991 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:14:12.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:14:13.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:14:13.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:14:13.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:14:13.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:14:13.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:14:13.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:14:13.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:14:13.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:14:13.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:14:13.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:14:13.250 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:14:13.309 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:13:46
2026-05-29T15:14:13.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72165, datetime.datetime(2026, 5, 29, 15, 13, 46), datetime.datetime(2026, 5, 29, 15, 13, 46), 'salt', 15.23, 48.92, None, 21.14, 51.17, 10.65, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:14:13.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:14:13.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:14:13.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:13:46, diff=27.315468s, valid=True
2026-05-29T15:14:13.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:14:13.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:14:13.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:14:12, diff=1.318277s, valid=True
2026-05-29T15:14:13.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:14:13.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:14:13.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:13:41, diff=32.325061s, valid=True
2026-05-29T15:14:13.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:14:13.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:14:13.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:14:13.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:14:13.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:14:13.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:14:13.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:14:12, diff=1.328069s, valid=True
2026-05-29T15:14:13.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:14:13.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:14:13.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:14:13.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993095.328736s, valid=True
2026-05-29T15:14:13.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:14:13.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:14:13.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:14:13.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:14:13.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:14:13.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:14:13.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:14:13.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:14:13.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:14:13.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:14:13.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:14:13.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:14:13.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:14:13.649 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:14:13.869 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:14:14.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:14:14.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:14:14.322 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:14:14.322 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:14:14.390 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:14:14.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:14:44.400 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:14:44.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:14:44.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:14:44.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:14:44.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:14:44.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:14:44.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-05-29T15:14:44.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:14:44.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-05-29T15:14:44.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:14:44.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:14:44.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:14:44.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-05-29T15:14:47.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-05-29T15:14:47.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:14:47.479 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:14:47.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:14:47.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:14:47.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:14:47.498 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:14:47.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:14:47.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:14:47.498 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:14:47.498 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:14:47.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:14:47.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:14:47.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:14:47.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:14:47.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:14:47.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:14:47.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:14:47.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:14:47.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:14:47.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:14:47.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:14:47.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:14:47.806 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:14:46
2026-05-29T15:14:47.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72167, datetime.datetime(2026, 5, 29, 15, 14, 46), datetime.datetime(2026, 5, 29, 15, 14, 46), 'salt', 15.46, 48.99, None, 24.95, 34.64, 10.65, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:14:47.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:14:47.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:14:47.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:14:46, diff=1.813033s, valid=True
2026-05-29T15:14:47.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:14:47.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:14:47.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:15:12, diff=-24.184133s, valid=True
2026-05-29T15:14:47.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:14:47.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:14:47.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:14:42, diff=5.822545s, valid=True
2026-05-29T15:14:47.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:14:47.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:14:47.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:14:47.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:14:47.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:14:47.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:14:47.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:15:12, diff=-24.174429s, valid=True
2026-05-29T15:14:47.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:14:47.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:14:47.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:14:47.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993129.826234s, valid=True
2026-05-29T15:14:47.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:14:47.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:14:47.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:14:47.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:14:47.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:14:47.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:14:47.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:14:47.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:14:47.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:14:47.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:14:48.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:14:48.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:14:48.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:14:48.205 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:14:48.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:14:48.762 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:14:48.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:14:48.865 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:14:48.865 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:14:49.035 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:14:49.035 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:15:19.065 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:15:19.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:15:19.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:15:19.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:15:19.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:15:19.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:15: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-05-29T15:15:19.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:15:19.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-05-29T15:15:19.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:15:19.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:15:19.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:15:19.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-05-29T15:15:22.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-05-29T15:15:22.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:15:22.161 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:15:22.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:15:22.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:15:22.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:15:22.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:15:22.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:15:22.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:15:22.182 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:15:22.182 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:15:22.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:15:22.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:15:22.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:15:22.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:15:22.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:15:22.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:15:22.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:15:22.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:15:22.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:15:22.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:15:22.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:15:22.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:15:22.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:15:17
2026-05-29T15:15:22.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72168, datetime.datetime(2026, 5, 29, 15, 15, 17), datetime.datetime(2026, 5, 29, 15, 15, 16), 'salt', 15.3, 49.52, None, 24.28, 38.72, 10.49, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:15:22.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:15:22.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:15:22.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:15:16, diff=6.510925s, valid=True
2026-05-29T15:15:22.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:15:22.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:15:22.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:15:12, diff=10.513785s, valid=True
2026-05-29T15:15:22.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:15:22.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:15:22.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:15:12, diff=10.52055s, valid=True
2026-05-29T15:15:22.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:15:22.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:15:22.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:15:22.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:15:22.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:15:22.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:15:22.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:15:12, diff=10.523602s, valid=True
2026-05-29T15:15:22.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:15:22.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:15:22.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:15:22.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993164.524261s, valid=True
2026-05-29T15:15:22.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:15:22.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:15:22.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:15:22.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:15:22.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:15:22.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:15:22.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:15:22.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:15:22.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:15:22.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:15:22.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:15:22.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:15:22.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:15:22.840 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:15:23.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:15:23.407 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:15:23.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:15:23.510 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:15:23.511 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:15:23.764 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:15:23.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:15:53.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:15:53.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:15:53.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:15:54.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:15:54.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:15:54.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:15:54.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-05-29T15:15:54.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:15:54.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-05-29T15:15:54.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:15:54.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:15:54.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:15:54.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-05-29T15:15:56.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-05-29T15:15:56.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:15:56.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:15:56.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:15:56.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:15:57.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:15:57.000 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:15:57.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:15:57.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:15:57.000 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:15:57.001 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:15:57.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:15:57.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:15:57.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:15:57.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:15:57.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:15:57.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:15:57.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:15:57.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:15:57.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:15:57.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:15:57.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:15:57.257 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:15:57.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:15:47
2026-05-29T15:15:57.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72169, datetime.datetime(2026, 5, 29, 15, 15, 47), datetime.datetime(2026, 5, 29, 15, 15, 46), 'salt', 15.36, 48.62, None, 25.69, 29.65, 10.75, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:15:57.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:15:57.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:15:57.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:15:46, diff=11.324859s, valid=True
2026-05-29T15:15:57.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:15:57.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:15:57.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:16:12, diff=-14.672276s, valid=True
2026-05-29T15:15:57.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:15:57.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:15:57.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:15:42, diff=15.334418s, valid=True
2026-05-29T15:15:57.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:15:57.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:15:57.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:15:57.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:15:57.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:15:57.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:15:57.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:16:12, diff=-14.662498s, valid=True
2026-05-29T15:15:57.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:15:57.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:15:57.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:15:57.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993199.338187s, valid=True
2026-05-29T15:15:57.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:15:57.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:15:57.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:15:57.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:15:57.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:15:57.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:15:57.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:15:57.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:15:57.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:15:57.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:15:57.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:15:57.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:15:57.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:15:57.717 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:15:57.932 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:15:58.281 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:15:58.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:15:58.384 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:15:58.384 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:15:58.551 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:15:58.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:16:28.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:16:28.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:16:28.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:16:28.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:16:28.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:16:29.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:16:29.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-05-29T15:16:29.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:16:29.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T15:16:29.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:16:29.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:16:29.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:16:29.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-05-29T15:16:32.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-05-29T15:16:32.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:16:32.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:16:32.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:16:32.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:16:32.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:16:32.225 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:16:32.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:16:32.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:16:32.225 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:16:32.225 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:16:32.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:16:32.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:16:32.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:16:32.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:16:32.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:16:32.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:16:32.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:16:32.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:16:32.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:16:32.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:16:32.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:16:32.478 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:16:32.538 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:16:17
2026-05-29T15:16:32.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72170, datetime.datetime(2026, 5, 29, 15, 16, 17), datetime.datetime(2026, 5, 29, 15, 16, 17), 'salt', 15.46, 48.56, None, 25.3, 33.14, 10.78, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:16:32.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:16:32.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:16:32.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:16:17, diff=15.544208s, valid=True
2026-05-29T15:16:32.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:16:32.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:16:32.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:16:12, diff=20.54704s, valid=True
2026-05-29T15:16:32.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:16:32.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:16:32.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:16:13, diff=19.553836s, valid=True
2026-05-29T15:16:32.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:16:32.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:16:32.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:16:32.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:16:32.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:16:32.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:16:32.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:16:12, diff=20.556867s, valid=True
2026-05-29T15:16:32.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:16:32.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:16:32.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:16:32.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993234.557533s, valid=True
2026-05-29T15:16:32.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:16:32.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:16:32.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:16:32.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:16:32.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:16:32.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:16:32.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:16:32.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:16:32.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:16:32.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:16:32.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:16:32.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:16:32.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:16:32.874 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:16:33.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:16:33.445 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:16:33.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:16:33.547 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:16:33.547 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:16:33.615 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:16:33.615 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:17:03.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:17:03.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:17:03.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:17:03.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:17:03.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:17:04.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:17:04.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-05-29T15:17:04.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:17:04.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-05-29T15:17:04.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:17:04.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:17:04.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:17:04.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T15:17:06.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-05-29T15:17:06.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:17:06.730 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:17:06.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:17:06.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:17:06.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:17:06.751 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:17:06.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:17:06.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:17:06.751 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:17:06.751 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:17:06.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:17:06.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:17:06.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:17:06.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:17:06.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:17:07.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:17:07.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:17:07.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:17:07.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:17:07.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:17:07.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:17:07.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:17:07.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:16:47
2026-05-29T15:17:07.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72171, datetime.datetime(2026, 5, 29, 15, 16, 47), datetime.datetime(2026, 5, 29, 15, 16, 47), 'salt', 15.53, 48.29, None, 21.0, 36.71, 10.86, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:17:07.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:17:07.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:17:07.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:16:47, diff=20.122943s, valid=True
2026-05-29T15:17:07.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:17:07.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:17:07.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:17:12, diff=-4.874216s, valid=True
2026-05-29T15:17:07.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:17:07.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:17:07.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:16:44, diff=23.132543s, valid=True
2026-05-29T15:17:07.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:17:07.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:17:07.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:17:07.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:17:07.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:17:07.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:17:07.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:17:12, diff=-4.864448s, valid=True
2026-05-29T15:17:07.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:17:07.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:17:07.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:17:07.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993269.136219s, valid=True
2026-05-29T15:17:07.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:17:07.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:17:07.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:17:07.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:17:07.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:17:07.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:17:07.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:17:07.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:17:07.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:17:07.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:17:07.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:17:07.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:17:07.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:17:07.450 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:17:07.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:17:08.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:17:08.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:17:08.116 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:17:08.116 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:17:08.343 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:17:08.343 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:17:38.355 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:17:38.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:17:38.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:17:38.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:17:38.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:17:38.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:17:38.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-05-29T15:17:38.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:17:38.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-05-29T15:17:38.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:17:38.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:17:38.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:17:38.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-05-29T15:17:41.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-05-29T15:17:41.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:17:41.417 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:17:41.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:17:41.425 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:17:41.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:17:41.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:17:41.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:17:41.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:17:41.437 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:17:41.437 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:17:41.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:17:41.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:17:41.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:17:41.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:17:41.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:17:41.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:17:41.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:17:41.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:17:41.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:17:41.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:17:41.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:17:41.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:17:41.761 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:17:17
2026-05-29T15:17:41.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72172, datetime.datetime(2026, 5, 29, 15, 17, 17), datetime.datetime(2026, 5, 29, 15, 17, 17), 'salt', 15.46, 48.82, None, 21.59, 43.11, 10.7, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:17:41.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:17:41.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:17:41.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:17:17, diff=24.767839s, valid=True
2026-05-29T15:17:41.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:17:41.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:17:41.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:17:12, diff=29.770703s, valid=True
2026-05-29T15:17:41.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:17:41.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:17:41.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:17:15, diff=26.777379s, valid=True
2026-05-29T15:17:41.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:17:41.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:17:41.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:17:41.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:17:41.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:17:41.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:17:41.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:17:12, diff=29.780378s, valid=True
2026-05-29T15:17:41.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:17:41.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:17:41.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:17:41.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993303.781037s, valid=True
2026-05-29T15:17:41.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:17:41.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:17:41.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:17:41.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:17:41.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:17:41.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:17:41.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:17:41.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:17:41.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:17:41.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:17:41.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:17:42.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:17:42.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:17:42.105 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:17:42.330 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:17:42.696 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:17:42.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:17:42.851 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:17:42.851 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:17:43.107 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:17:43.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:18:13.137 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:18:13.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:18:13.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:18:13.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:18:13.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:18:13.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:18:13.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-05-29T15:18:13.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:18:13.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-05-29T15:18:13.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:18:13.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:18:13.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:18:13.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-05-29T15:18:16.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-05-29T15:18:16.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:18:16.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:18:16.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:18:16.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:18:16.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:18:16.453 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:18:16.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:18:16.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:18:16.454 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:18:16.454 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:18:16.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:18:16.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:18:16.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:18:16.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:18:16.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:18:16.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:18:16.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:18:16.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:18:16.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:18:16.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:18:16.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:18:16.704 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:18:16.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:17:48
2026-05-29T15:18:16.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72173, datetime.datetime(2026, 5, 29, 15, 17, 48), datetime.datetime(2026, 5, 29, 15, 17, 47), 'salt', 15.6, 49.32, None, 17.89, 51.74, 10.57, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:18:16.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:18:16.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:18:16.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:17:47, diff=29.768923s, valid=True
2026-05-29T15:18:16.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:18:16.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:18:16.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:18:12, diff=4.771827s, valid=True
2026-05-29T15:18:16.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:18:16.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:18:16.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:17:47, diff=29.778553s, valid=True
2026-05-29T15:18:16.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:18:16.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:18:16.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:18:16.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:18:16.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:18:16.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:18:16.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:18:12, diff=4.781648s, valid=True
2026-05-29T15:18:16.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:18:16.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:18:16.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:18:16.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993338.78231s, valid=True
2026-05-29T15:18:16.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:18:16.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:18:16.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:18:16.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:18:16.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:18:16.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:18:16.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:18:16.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:18:16.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:18:16.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:18:17.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:18:17.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:18:17.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:18:17.210 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:18:17.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:18:17.772 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:18:17.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:18:17.873 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:18:17.873 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:18:18.034 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:18:18.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:18:48.060 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:18:48.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:18:48.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:18:48.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:18:48.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:18:48.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:18:48.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-05-29T15:18:48.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:18:48.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-05-29T15:18:48.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:18:48.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:18:48.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:18:48.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-05-29T15:18: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-05-29T15:18:51.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:18:51.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:18:51.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:18:51.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:18:51.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:18:51.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:18:51.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:18:51.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:18:51.259 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:18:51.259 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:18:51.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:18:51.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:18:51.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:18:51.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:18:51.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:18:51.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:18:51.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:18:51.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:18:51.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:18:51.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:18:51.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:18:51.519 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:18:51.577 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:18:48
2026-05-29T15:18:51.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72175, datetime.datetime(2026, 5, 29, 15, 18, 48), datetime.datetime(2026, 5, 29, 15, 18, 48), 'salt', 15.86, 47.66, None, 23.89, 29.39, 11.08, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:18:51.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:18:51.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:18:51.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:18:48, diff=3.583956s, valid=True
2026-05-29T15:18:51.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:18:51.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:18:51.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:19:12, diff=-20.413186s, valid=True
2026-05-29T15:18:51.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:18:51.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:18:51.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:18:44, diff=7.593449s, valid=True
2026-05-29T15:18:51.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:18:51.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:18:51.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:18:51.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:18:51.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:18:51.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:18:51.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:19:12, diff=-20.403478s, valid=True
2026-05-29T15:18:51.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:18:51.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:18:51.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:18:51.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993373.597196s, valid=True
2026-05-29T15:18:51.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:18:51.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:18:51.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:18:51.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:18:51.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:18:51.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:18:51.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:18:51.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:18:51.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:18:51.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:18:51.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:18:51.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:18:51.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:18:51.929 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:18:52.173 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:18:52.600 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:18:52.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:18:52.712 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:18:52.712 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:18:52.958 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:18:52.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:19:22.988 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:19:22.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:19:22.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:19:23.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:19:23.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:19:23.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:19:23.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-05-29T15:19:23.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:19:23.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-05-29T15:19:23.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:19:23.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:19:23.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:19:23.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-05-29T15:19:26.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-05-29T15:19:26.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:19:26.359 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:19:26.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:19:26.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:19:26.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:19:26.379 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:19:26.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:19:26.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:19:26.380 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:19:26.380 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:19:26.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:19:26.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:19:26.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:19:26.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:19:26.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:19:26.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:19:26.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:19:26.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:19:26.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:19:26.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:19:26.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:19:26.647 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:19:26.707 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:19:18
2026-05-29T15:19:26.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72176, datetime.datetime(2026, 5, 29, 15, 19, 18), datetime.datetime(2026, 5, 29, 15, 19, 18), 'salt', 15.86, 46.11, None, 28.3, 30.49, 11.55, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:19:26.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:19:26.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:19:26.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:19:18, diff=8.7133s, valid=True
2026-05-29T15:19:26.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:19:26.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:19:26.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:19:12, diff=14.716225s, valid=True
2026-05-29T15:19:26.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:19:26.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:19:26.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:19:14, diff=12.72323s, valid=True
2026-05-29T15:19:26.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:19:26.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:19:26.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:19:26.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:19:26.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:19:26.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:19:26.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:19:12, diff=14.726317s, valid=True
2026-05-29T15:19:26.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:19:26.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:19:26.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:19:26.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993408.726997s, valid=True
2026-05-29T15:19:26.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:19:26.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:19:26.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:19:26.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:19:26.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:19:26.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:19:26.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:19:26.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:19:26.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:19:26.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:19:26.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:19:26.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:19:27.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:19:27.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:19:27.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:19:27.624 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:19:27.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:19:27.726 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:19:27.727 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:19:27.882 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:19:27.882 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:19:57.901 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:19:57.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:19:57.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:19:58.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:19:58.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:19:58.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:19:58.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-05-29T15:19:58.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:19:58.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-05-29T15:19:58.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:19:58.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:19:58.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:19:58.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-05-29T15:20:01.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-05-29T15:20:01.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:20:01.026 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:20:01.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:20:01.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:20:01.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:20:01.047 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:20:01.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:20:01.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:20:01.047 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:20:01.047 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:20:01.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:20:01.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:20:01.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:20:01.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:20:01.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:20:01.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:20:01.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:20:01.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:20:01.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:20:01.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:20:01.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:20:01.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:20:01.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:19:49
2026-05-29T15:20:01.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72177, datetime.datetime(2026, 5, 29, 15, 19, 49), datetime.datetime(2026, 5, 29, 15, 19, 48), 'salt', 15.69, 45.94, None, 19.94, 35.53, 11.59, 831.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:20:01.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:20:01.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:20:01.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:19:48, diff=13.415083s, valid=True
2026-05-29T15:20:01.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:20:01.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:20:01.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:20:12, diff=-10.582014s, valid=True
2026-05-29T15:20:01.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:20:01.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:20:01.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:19:44, diff=17.424828s, valid=True
2026-05-29T15:20:01.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:20:01.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:20:01.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:20:01.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:20:01.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:20:01.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:20:01.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:20:12, diff=-10.572074s, valid=True
2026-05-29T15:20:01.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:20:01.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:20:01.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:20:01.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993443.428598s, valid=True
2026-05-29T15:20:01.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:20:01.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:20:01.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:20:01.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:20:01.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:20:01.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:20:01.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:20:01.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:20:01.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:20:01.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:20:01.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:20:01.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:20:01.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:20:01.747 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:20:01.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:20:02.389 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:20:02.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:20:02.490 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:20:02.490 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:20:02.717 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:20:02.717 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:20:32.732 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:20:32.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:20:32.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:20:33.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:20:33.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:20:33.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:20:33.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-05-29T15:20:33.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:20: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-05-29T15:20:33.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:20:33.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:20:33.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:20:33.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-05-29T15:20:35.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-05-29T15:20:35.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:20:35.956 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:20:35.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:20:35.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:20:35.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:20:35.977 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:20:35.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:20:35.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:20:35.977 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:20:35.977 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:20:35.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:20:36.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:20:36.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:20:36.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:20:36.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:20:36.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:20:36.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:20:36.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:20:36.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:20:36.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:20:36.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:20:36.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:20:36.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:20:19
2026-05-29T15:20:36.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72178, datetime.datetime(2026, 5, 29, 15, 20, 19), datetime.datetime(2026, 5, 29, 15, 20, 18), 'salt', 15.69, 46.27, None, 19.83, 36.1, 11.48, 831.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:20:36.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:20:36.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:20:36.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:20:18, diff=18.297586s, valid=True
2026-05-29T15:20:36.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:20:36.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:20:36.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:20:12, diff=24.300428s, valid=True
2026-05-29T15:20:36.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:20:36.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:20:36.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:20:15, diff=21.307212s, valid=True
2026-05-29T15:20:36.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:20:36.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:20:36.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:20:36.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:20:36.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:20:36.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:20:36.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:20:12, diff=24.310265s, valid=True
2026-05-29T15:20:36.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:20:36.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:20:36.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:20:36.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993478.310945s, valid=True
2026-05-29T15:20:36.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:20:36.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:20:36.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:20:36.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:20:36.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:20:36.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:20:36.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:20:36.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:20:36.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:20:36.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:20:36.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:20:36.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:20:36.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:20:36.627 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:20:36.843 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:20:37.191 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:20:37.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:20:37.293 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:20:37.293 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:20:37.459 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:20:37.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:21:07.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:21:07.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:21:07.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:21:08.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:21:08.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:21:08.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:21:08.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-05-29T15:21:08.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:21:08.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-05-29T15:21:08.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:21:08.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:21:08.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:21:08.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-05-29T15:21: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-05-29T15:21:10.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:21:10.884 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:21:10.884 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:21:10.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:21:10.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:21:10.909 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:21:10.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:21:10.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:21:10.909 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:21:10.909 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:21:10.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:21:10.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:21:10.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:21:11.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:21:11.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:21:11.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:21:11.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:21:11.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:21:11.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:21:11.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:21:11.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:21:11.173 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:21:11.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:20:51
2026-05-29T15:21:11.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72179, datetime.datetime(2026, 5, 29, 15, 20, 51), datetime.datetime(2026, 5, 29, 15, 20, 49), 'salt', 15.6, 45.51, None, 27.45, 34.83, 11.72, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:21:11.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:21:11.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:21:11.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:20:49, diff=22.238172s, valid=True
2026-05-29T15:21:11.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:21:11.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:21:11.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:21:12, diff=-0.758958s, valid=True
2026-05-29T15:21:11.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:21:11.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:21:11.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:20:45, diff=26.247724s, valid=True
2026-05-29T15:21:11.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:21:11.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:21:11.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:21:11.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:21:11.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:21:11.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:21:11.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:21:12, diff=-0.749221s, valid=True
2026-05-29T15:21:11.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:21:11.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:21:11.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:21:11.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993513.25144s, valid=True
2026-05-29T15:21:11.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:21:11.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:21:11.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:21:11.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:21:11.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:21:11.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:21:11.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:21:11.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:21:11.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:21:11.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:21:11.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:21:11.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:21:11.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:21:11.580 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:21:11.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:21:12.238 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:21:12.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:21:12.343 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:21:12.343 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:21:12.506 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:21:12.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:21:42.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:21:42.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:21:42.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:21:42.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:21:42.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:21:43.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:21:43.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-05-29T15:21:43.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:21:43.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-05-29T15:21:43.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:21:43.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:21:43.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:21:43.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-05-29T15:21:46.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-05-29T15:21:46.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:21:46.418 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:21:46.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:21:46.425 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:21:46.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:21:46.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:21:46.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:21:46.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:21:46.437 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:21:46.437 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:21:46.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:21:46.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:21:46.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:21:46.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:21:46.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:21:46.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:21:46.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:21:46.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:21:46.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:21:46.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:21:46.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:21:46.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:21:46.759 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:21:21
2026-05-29T15:21:46.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72180, datetime.datetime(2026, 5, 29, 15, 21, 21), datetime.datetime(2026, 5, 29, 15, 21, 20), 'salt', 15.66, 44.91, None, 26.39, 36.47, 11.91, 831.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:21:46.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:21:46.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:21:46.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:21:20, diff=26.767804s, valid=True
2026-05-29T15:21:46.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:21:46.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:21:46.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:21:12, diff=34.771428s, valid=True
2026-05-29T15:21:46.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:21:46.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:21:46.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:21:16, diff=30.780218s, valid=True
2026-05-29T15:21:46.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:21:46.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:21:46.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:21:46.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:21:46.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:21:46.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:21:46.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:21:12, diff=34.783788s, valid=True
2026-05-29T15:21:46.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:21:46.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:21:46.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:21:46.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993548.78457s, valid=True
2026-05-29T15:21:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:21:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:21:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:21:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:21:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:21:46.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:21:46.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:21:46.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:21:46.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:21:46.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:21:46.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:21:47.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:21:47.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:21:47.113 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:21:47.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:21:47.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:21:47.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:21:47.799 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:21:47.799 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:21:48.033 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:21:48.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:22:18.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:22:18.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:22:18.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:22:18.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:22:18.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:22:18.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:22:18.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-05-29T15:22:18.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:22:18.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-05-29T15:22:18.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:22:18.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:22:18.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:22:18.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-05-29T15:22: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-05-29T15:22:21.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:22:21.134 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:22:21.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:22:21.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:22:21.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:22:21.154 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:22:21.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:22:21.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:22:21.155 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:22:21.155 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:22:21.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:22:21.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:22:21.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:22:21.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:22:21.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:22:21.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:22:21.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:22:21.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:22:21.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:22:21.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:22:21.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:22:21.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:22:21.463 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:21:51
2026-05-29T15:22:21.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72181, datetime.datetime(2026, 5, 29, 15, 21, 51), datetime.datetime(2026, 5, 29, 15, 21, 51), 'salt', 15.79, 45.14, None, 26.08, 26.46, 11.84, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:22:21.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:22:21.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:22:21.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:21:51, diff=30.469455s, valid=True
2026-05-29T15:22:21.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:22:21.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:22:21.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:22:12, diff=9.47233s, valid=True
2026-05-29T15:22:21.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:22:21.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:22:21.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:21:48, diff=33.47907s, valid=True
2026-05-29T15:22:21.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:22:21.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:22:21.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:22:21.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:22:21.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:22:21.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:22:21.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:22:12, diff=9.482146s, valid=True
2026-05-29T15:22:21.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:22:21.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:22:21.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:22:21.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993583.482811s, valid=True
2026-05-29T15:22:21.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:22:21.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:22:21.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:22:21.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:22:21.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:22:21.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:22:21.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:22:21.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:22:21.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:22:21.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:22:21.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:22:21.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:22:21.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:22:21.862 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:22:22.076 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:22:22.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:22:22.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:22:22.521 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:22:22.521 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:22:22.766 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:22:22.766 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:22:52.776 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:22:52.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:22:52.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:22:52.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:22:52.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:22:53.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:22:53.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-05-29T15:22:53.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:22:53.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-05-29T15:22:53.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:22:53.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:22:53.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:22:53.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T15:22:55.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-05-29T15:22:55.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:22:55.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:22:55.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:22:55.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:22:55.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:22:55.793 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:22:55.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:22:55.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:22:55.793 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:22:55.794 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:22:55.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:22:55.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:22:55.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:22:55.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:22:55.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:22:56.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:22:56.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:22:56.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:22:56.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:22:56.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:22:56.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:22:56.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:22:56.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:22:51
2026-05-29T15:22:56.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72183, datetime.datetime(2026, 5, 29, 15, 22, 51), datetime.datetime(2026, 5, 29, 15, 22, 51), 'salt', 15.76, 44.41, None, 24.17, 17.31, 12.08, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:22:56.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:22:56.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:22:56.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:22:51, diff=5.118534s, valid=True
2026-05-29T15:22:56.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:22:56.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:22:56.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:23:12, diff=-15.878672s, valid=True
2026-05-29T15:22:56.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:22:56.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:22:56.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:22:51, diff=5.128772s, valid=True
2026-05-29T15:22:56.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:22:56.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:22:56.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:22:56.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:22:56.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:22:56.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:22:56.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:23:12, diff=-15.868197s, valid=True
2026-05-29T15:22:56.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:22:56.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:22:56.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:22:56.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993618.132463s, valid=True
2026-05-29T15:22:56.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:22:56.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:22:56.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:22:56.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:22:56.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:22:56.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:22:56.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:22:56.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:22:56.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:22:56.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:22:56.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:22:56.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:22:56.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:22:56.464 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:22:56.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:22:57.040 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:22:57.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:22:57.148 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:22:57.148 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:22:57.312 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:22:57.312 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:23:27.341 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:23:27.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:23:27.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:23:27.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:23:27.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:23:27.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:23:27.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-05-29T15:23:27.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:23:27.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-05-29T15:23:27.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:23:27.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:23:27.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:23:27.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T15:23:30.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-05-29T15:23:30.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:23:30.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:23:30.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:23:30.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:23:30.455 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:23:30.455 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:23:30.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:23:30.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:23:30.455 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:23:30.456 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:23:30.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:23:30.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:23:30.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:23:30.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:23:30.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:23:30.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:23:30.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:23:30.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:23:30.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:23:30.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:23:30.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:23:30.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:23:30.775 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:23:22
2026-05-29T15:23:30.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72184, datetime.datetime(2026, 5, 29, 15, 23, 22), datetime.datetime(2026, 5, 29, 15, 23, 21), 'salt', 15.69, 44.25, None, 20.47, 15.13, 12.12, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:23:30.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:23:30.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:23:30.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:23:21, diff=9.781305s, valid=True
2026-05-29T15:23:30.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:23:30.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:23:30.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:23:12, diff=18.784228s, valid=True
2026-05-29T15:23:30.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:23:30.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:23:30.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:23:16, diff=14.791021s, valid=True
2026-05-29T15:23:30.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:23:30.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:23:30.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:23:30.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:23:30.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:23:30.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:23:30.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:23:12, diff=18.794097s, valid=True
2026-05-29T15:23:30.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:23:30.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:23:30.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:23:30.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993652.794796s, valid=True
2026-05-29T15:23:30.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:23:30.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:23:30.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:23:30.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:23:30.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:23:30.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:23:30.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:23:30.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:23:30.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:23:30.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:23:31.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:23:31.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:23:31.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:23:31.183 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:23:31.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:23:31.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:23:31.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:23:31.870 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:23:31.870 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:23:32.029 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:23:32.029 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:24:02.060 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:24:02.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:24:02.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:24:02.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:24:02.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:24:02.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:24:02.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-05-29T15:24:02.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:24:02.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-05-29T15:24:02.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:24:02.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:24:02.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:24:02.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-05-29T15:24: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-05-29T15:24:05.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:24:05.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:24:05.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:24:05.080 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:24:05.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:24:05.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:24:05.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:24:05.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:24:05.086 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:24:05.086 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:24:05.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:24:05.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:24:05.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:24:05.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:24:05.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:24:05.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:24:05.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:24:05.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:24:05.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:24:05.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:24:05.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:24:05.339 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:24:05.400 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:23:52
2026-05-29T15:24:05.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72185, datetime.datetime(2026, 5, 29, 15, 23, 52), datetime.datetime(2026, 5, 29, 15, 23, 51), 'salt', 15.73, 46.17, None, 18.67, 20.1, 11.52, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:24:05.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:24:05.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:24:05.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:23:51, diff=14.406246s, valid=True
2026-05-29T15:24:05.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:24:05.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:24:05.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:24:12, diff=-6.590933s, valid=True
2026-05-29T15:24:05.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:24:05.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:24:05.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:23:46, diff=19.41579s, valid=True
2026-05-29T15:24:05.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:24:05.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:24:05.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:24:05.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:24:05.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:24:05.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:24:05.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:24:12, diff=-6.581178s, valid=True
2026-05-29T15:24:05.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:24:05.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:24:05.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:24:05.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993687.419484s, valid=True
2026-05-29T15:24:05.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:24:05.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:24:05.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:24:05.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:24:05.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:24:05.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:24:05.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:24:05.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:24:05.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:24:05.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:24:05.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:24:05.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:24:05.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:24:05.736 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:24:05.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:24:06.300 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:24:06.402 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:24:06.403 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:24:06.403 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:24:06.558 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:24:06.558 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:24:36.564 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:24:36.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:24:36.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:24:37.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:24:37.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:24:37.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:24:37.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-05-29T15:24:37.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:24:37.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-05-29T15:24:37.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:24:37.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:24:37.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:24:37.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-05-29T15:24:40.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-05-29T15:24:40.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:24:40.079 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:24:40.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:24:40.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:24:40.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:24:40.099 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:24:40.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:24:40.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:24:40.100 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:24:40.100 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:24:40.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:24:40.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:24:40.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:24:40.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:24:40.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:24:40.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:24:40.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:24:40.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:24:40.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:24:40.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:24:40.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:24:40.362 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:24:40.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:24:22
2026-05-29T15:24:40.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72186, datetime.datetime(2026, 5, 29, 15, 24, 22), datetime.datetime(2026, 5, 29, 15, 24, 22), 'salt', 15.79, 46.2, None, 19.73, 11.59, 11.51, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:24:40.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:24:40.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:24:40.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:24:22, diff=18.430718s, valid=True
2026-05-29T15:24:40.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:24:40.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:24:40.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:24:12, diff=28.433625s, valid=True
2026-05-29T15:24:40.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:24:40.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:24:40.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:24:16, diff=24.440335s, valid=True
2026-05-29T15:24:40.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:24:40.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:24:40.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:24:40.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:24:40.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:24:40.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:24:40.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:24:12, diff=28.443745s, valid=True
2026-05-29T15:24:40.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:24:40.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:24:40.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:24:40.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993722.444546s, valid=True
2026-05-29T15:24:40.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:24:40.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:24:40.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:24:40.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:24:40.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:24:40.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:24:40.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:24:40.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:24:40.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:24:40.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:24:40.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:24:40.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:24:40.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:24:40.768 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:24:40.987 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:24:41.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:24:41.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:24:41.445 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:24:41.445 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:24:41.599 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:24:41.599 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:25:11.629 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:25:11.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:25:11.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:25:11.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:25:11.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:25:12.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:25:12.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-05-29T15:25:12.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:25:12.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-05-29T15:25:12.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:25:12.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:25:12.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:25:12.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-05-29T15:25:14.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-05-29T15:25:14.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:25:14.870 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:25:14.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:25:14.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:25:14.890 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:25:14.891 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:25:14.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:25:14.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:25:14.891 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:25:14.891 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:25:14.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:25:14.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:25:14.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:25:15.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:25:15.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:25:15.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:25:15.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:25:15.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:25:15.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:25:15.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:25:15.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:25:15.153 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:25:15.215 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:24:52
2026-05-29T15:25:15.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72187, datetime.datetime(2026, 5, 29, 15, 24, 52), datetime.datetime(2026, 5, 29, 15, 24, 51), 'salt', 15.83, 45.04, None, 22.37, 2.68, 11.89, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:25:15.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:25:15.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:25:15.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:24:51, diff=24.221369s, valid=True
2026-05-29T15:25:15.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:25:15.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:25:15.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:25:12, diff=3.224902s, valid=True
2026-05-29T15:25:15.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:25:15.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:25:15.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:24:47, diff=28.232336s, valid=True
2026-05-29T15:25:15.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:25:15.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:25:15.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:25:15.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:25:15.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:25:15.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:25:15.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:25:12, diff=3.235447s, valid=True
2026-05-29T15:25:15.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:25:15.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:25:15.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:25:15.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993757.236136s, valid=True
2026-05-29T15:25:15.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:25:15.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:25:15.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:25:15.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:25:15.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:25:15.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:25:15.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:25:15.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:25:15.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:25:15.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:25:15.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:25:15.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:25:15.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:25:15.563 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:25:15.781 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:25:16.190 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:25:16.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:25:16.292 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:25:16.292 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:25:16.532 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:25:16.532 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:25:46.562 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:25:46.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:25:46.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:25:46.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:25:46.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:25:47.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:25:47.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-05-29T15:25:47.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:25:47.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-05-29T15:25:47.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:25:47.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:25:47.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:25:47.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-05-29T15:25:49.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-05-29T15:25:49.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:25:49.856 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:25:49.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:25:49.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:25:49.877 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:25:49.878 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:25:49.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:25:49.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:25:49.878 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:25:49.878 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:25:49.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:25:49.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:25:49.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:25:50.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:25:50.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:25:50.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:25:50.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:25:50.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:25:50.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:25:50.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:25:50.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:25:50.170 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:25:50.241 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:25:23
2026-05-29T15:25:50.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72188, datetime.datetime(2026, 5, 29, 15, 25, 23), datetime.datetime(2026, 5, 29, 15, 25, 22), 'salt', 15.83, 45.21, None, 21.81, 27.63, 11.83, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:25:50.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:25:50.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:25:50.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:25:22, diff=28.247675s, valid=True
2026-05-29T15:25:50.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:25:50.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:25:50.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:25:12, diff=38.250546s, valid=True
2026-05-29T15:25:50.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:25:50.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:25:50.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:25:18, diff=32.257335s, valid=True
2026-05-29T15:25:50.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:25:50.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:25:50.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:25:50.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:25:50.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:25:50.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:25:50.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:25:12, diff=38.260402s, valid=True
2026-05-29T15:25:50.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:25:50.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:25:50.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:25:50.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993792.261077s, valid=True
2026-05-29T15:25:50.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:25:50.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:25:50.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:25:50.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:25:50.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:25:50.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:25:50.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:25:50.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:25:50.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:25:50.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:25:50.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:25:50.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:25:50.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:25:50.685 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:25:50.898 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:25:51.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:25:51.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:25:51.351 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:25:51.351 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:25:52.091 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:25:52.091 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:26:22.121 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:26:22.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:26:22.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:26:22.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:26:22.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:26:22.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:26:22.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-05-29T15:26:22.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:26:22.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-05-29T15:26:22.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:26:22.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:26:22.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:26:22.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T15:26:26.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-05-29T15:26:26.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:26:26.330 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:26:26.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:26:26.339 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:26:26.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:26:26.353 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:26:26.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:26:26.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:26:26.353 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:26:26.353 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:26:26.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:26:26.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:26:26.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:26:26.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:26:26.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:26:26.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:26:26.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:26:26.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:26:26.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:26:26.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:26:26.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:26:26.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:26:26.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:26:23
2026-05-29T15:26:26.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72190, datetime.datetime(2026, 5, 29, 15, 26, 23), datetime.datetime(2026, 5, 29, 15, 26, 23), 'salt', 15.83, 45.38, None, 19.69, 27.77, 11.78, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:26:26.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:26:26.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:26:26.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:26:23, diff=3.681632s, valid=True
2026-05-29T15:26:26.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:26:26.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:26:26.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:26:12, diff=14.684449s, valid=True
2026-05-29T15:26:26.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:26:26.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:26:26.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:26:20, diff=6.691054s, valid=True
2026-05-29T15:26:26.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:26:26.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:26:26.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:26:26.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:26:26.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:26:26.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:26:26.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:26:12, diff=14.694101s, valid=True
2026-05-29T15:26:26.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:26:26.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:26:26.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:26:26.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993828.694768s, valid=True
2026-05-29T15:26:26.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:26:26.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:26:26.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:26:26.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:26:26.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:26:26.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:26:26.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:26:26.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:26:26.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:26:26.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:26:26.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:26:26.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:26:26.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:26:27.007 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:26:27.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:26:27.637 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:26:27.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:26:27.737 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:26:27.737 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:26:27.995 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:26:27.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:26:58.005 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:26:58.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:26:58.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:26:58.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:26:58.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:26:58.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:26:58.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-05-29T15:26:58.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:26:58.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-05-29T15:26:58.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:26:58.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:26:58.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:26:58.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-05-29T15:27:01.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-05-29T15:27:01.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:27:01.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:27:01.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:27:01.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:27:01.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:27:01.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:27:01.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:27:01.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:27:01.391 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:27:01.391 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:27:01.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:27:01.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:27:01.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:27:01.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:27:01.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:27:01.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T15:27:01.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:27:01.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T15:27:01.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:27:01.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:27:01.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:27:01.761 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:27:01.825 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:26:54
2026-05-29T15:27:01.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72191, datetime.datetime(2026, 5, 29, 15, 26, 54), datetime.datetime(2026, 5, 29, 15, 26, 53), 'salt', 15.93, 44.98, None, 25.69, 27.65, 11.92, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:27:01.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:27:01.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:27:01.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:26:53, diff=8.831931s, valid=True
2026-05-29T15:27:01.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:27:01.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T15:27:01.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:27:12, diff=-10.165168s, valid=True
2026-05-29T15:27:01.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:27:01.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:27:01.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:26:52, diff=9.841556s, valid=True
2026-05-29T15:27:01.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:27:01.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:27:01.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:27:01.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:27:01.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:27:01.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T15:27:01.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:27:12, diff=-10.155333s, valid=True
2026-05-29T15:27:01.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:27:01.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:27:01.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:27:01.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993863.845319s, valid=True
2026-05-29T15:27:01.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:27:01.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:27:01.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:27:01.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:27:01.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:27:01.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:27:01.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:27:01.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:27:01.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:27:01.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:27:02.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:27:02.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:27:02.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:27:02.225 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:27:02.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:27:02.804 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:27:02.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:27:02.912 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:27:02.912 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:27:03.157 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:27:03.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:27:33.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:27:33.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:27:33.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:27:33.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:27:33.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:27:33.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:27:33.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-05-29T15:27:33.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:27: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-05-29T15:27:33.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:27:33.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:27:33.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:27:33.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-05-29T15:27:36.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-05-29T15:27:36.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:27:36.325 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:27:36.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:27:36.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:27:36.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:27:36.348 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:27:36.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:27:36.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:27:36.348 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:27:36.348 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:27:36.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:27:36.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:27:36.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:27:36.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:27:36.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:27:36.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T15:27:36.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:27:36.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T15:27:36.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:27:36.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:27:36.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:27:36.607 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:27:36.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:27:24
2026-05-29T15:27:36.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72192, datetime.datetime(2026, 5, 29, 15, 27, 24), datetime.datetime(2026, 5, 29, 15, 27, 24), 'salt', 15.96, 44.91, None, 19.41, 39.57, 11.94, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:27:36.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:27:36.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:27:36.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:27:24, diff=12.674521s, valid=True
2026-05-29T15:27:36.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:27:36.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T15:27:36.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:27:12, diff=24.677361s, valid=True
2026-05-29T15:27:36.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:27:36.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:27:36.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:27:23, diff=13.684046s, valid=True
2026-05-29T15:27:36.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:27:36.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:27:36.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:27:36.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:27:36.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:27:36.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T15:27:36.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:27:12, diff=24.687093s, valid=True
2026-05-29T15:27:36.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:27:36.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:27:36.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:27:36.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993898.68777s, valid=True
2026-05-29T15:27:36.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:27:36.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:27:36.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:27:36.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:27:36.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:27:36.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:27:36.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:27:36.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:27:36.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:27:36.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:27:36.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:27:36.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:27:36.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:27:37.007 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:27:37.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:27:37.632 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:27:37.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:27:37.732 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:27:37.732 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:27:37.800 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:27:37.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:28:07.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:28:07.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:28:07.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:28:08.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:28:08.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:28:08.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:28:08.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-05-29T15:28:08.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:28:08.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-05-29T15:28:08.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:28:08.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:28:08.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:28:08.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-05-29T15:28:11.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-05-29T15:28:11.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:28:11.664 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:28:11.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:28:11.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:28:11.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:28:11.685 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:28:11.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:28:11.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:28:11.685 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:28:11.685 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:28:11.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:28:11.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:28:11.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:28:11.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:28:11.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:28:11.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T15:28:11.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:28:11.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T15:28:11.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:28:11.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:28:11.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:28:11.957 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:28:12.020 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:27:54
2026-05-29T15:28:12.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72193, datetime.datetime(2026, 5, 29, 15, 27, 54), datetime.datetime(2026, 5, 29, 15, 27, 54), 'salt', 16.06, 44.48, None, 24.42, 25.38, 12.08, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:28:12.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:28:12.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:28:12.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:27:54, diff=18.026694s, valid=True
2026-05-29T15:28:12.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:28:12.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T15:28:12.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:28:12, diff=0.029547s, valid=True
2026-05-29T15:28:12.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:28:12.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:28:12.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:27:48, diff=24.036327s, valid=True
2026-05-29T15:28:12.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:28:12.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:28:12.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:28:12.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:28:12.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:28:12.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T15:28:12.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:28:12, diff=0.039437s, valid=True
2026-05-29T15:28:12.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:28:12.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:28:12.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:28:12.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993934.040118s, valid=True
2026-05-29T15:28:12.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:28:12.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:28:12.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:28:12.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:28:12.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:28:12.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:28:12.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:28:12.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:28:12.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:28:12.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:28:12.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:28:12.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:28:12.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:28:12.386 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:28:12.679 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:28:13.037 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:28:13.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:28:13.144 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:28:13.144 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:28:13.316 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:28:13.316 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:28:43.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:28:43.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:28:43.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:28:43.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:28:43.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:28:43.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:28:43.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-05-29T15:28:43.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:28:43.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-05-29T15:28:43.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:28:43.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:28:43.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:28:43.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T15:28:46.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-05-29T15:28:46.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:28:46.529 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:28:46.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:28:46.536 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:28:46.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:28:46.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:28:46.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:28:46.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:28:46.548 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:28:46.548 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:28:46.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:28:46.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:28:46.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:28:46.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:28:46.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:28:46.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T15:28:46.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:28:46.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T15:28:46.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:28:46.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:28:46.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:28:46.812 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:28:46.874 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:28:25
2026-05-29T15:28:46.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72194, datetime.datetime(2026, 5, 29, 15, 28, 25), datetime.datetime(2026, 5, 29, 15, 28, 24), 'salt', 16.13, 43.85, None, 21.1, 20.27, 12.3, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:28:46.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:28:46.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:28:46.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:28:24, diff=22.880792s, valid=True
2026-05-29T15:28:46.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:28:46.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T15:28:46.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:28:12, diff=34.883638s, valid=True
2026-05-29T15:28:46.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:28:46.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:28:46.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:28:19, diff=27.890268s, valid=True
2026-05-29T15:28:46.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:28:46.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:28:46.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:28:46.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:28:46.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:28:46.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T15:28:46.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:28:12, diff=34.893286s, valid=True
2026-05-29T15:28:46.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:28:46.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:28:46.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:28:46.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=993968.893953s, valid=True
2026-05-29T15:28:46.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:28:46.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:28:46.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:28:46.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:28:46.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:28:46.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:28:46.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:28:46.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:28:46.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:28:47.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:28:47.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:28:47.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:28:47.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:28:47.291 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:28:47.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:28:47.864 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:28:47.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:28:47.965 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:28:47.965 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:28:48.135 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:28:48.135 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:29:18.165 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:29:18.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:29:18.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:29:18.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:29:18.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:29:18.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:29:18.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T15:29:18.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:29:18.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-05-29T15:29:18.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:29:18.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:29:18.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:29:18.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-05-29T15:29:21.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-05-29T15:29:21.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:29:21.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:29:21.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:29:21.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:29:21.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:29:21.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:29:21.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:29:21.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:29:21.324 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:29:21.324 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:29:21.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:29:21.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:29:21.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:29:21.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:29:21.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:29:21.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:29:21.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:29:21.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:29:21.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:29:21.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:29:21.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:29:21.587 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:29:21.650 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:28:55
2026-05-29T15:29:21.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72195, datetime.datetime(2026, 5, 29, 15, 28, 55), datetime.datetime(2026, 5, 29, 15, 28, 54), 'salt', 16.09, 42.76, None, 21.63, 30.33, 12.65, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:29:21.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:29:21.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:29:21.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:28:54, diff=27.656902s, valid=True
2026-05-29T15:29:21.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:29:21.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:29:21.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:29:12, diff=9.659808s, valid=True
2026-05-29T15:29:21.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:29:21.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:29:21.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:28:49, diff=32.666469s, valid=True
2026-05-29T15:29:21.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:29:21.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:29:21.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:29:21.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:29:21.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:29:21.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:29:21.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:29:12, diff=9.669571s, valid=True
2026-05-29T15:29:21.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:29:21.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:29:21.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:29:21.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994003.670241s, valid=True
2026-05-29T15:29:21.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:29:21.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:29:21.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:29:21.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:29:21.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:29:21.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:29:21.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:29:21.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:29:21.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:29:21.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:29:21.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:29:21.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:29:21.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:29:21.985 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:29:22.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:29:22.543 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:29:22.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:29:22.643 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:29:22.643 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:29:22.888 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:29:22.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:29:52.917 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:29:52.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:29:52.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:29:53.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:29:53.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:29:53.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:29:53.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-05-29T15:29:53.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:29:53.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-05-29T15:29:53.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:29:53.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:29:53.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:29:53.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-05-29T15:29:55.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T15:29:55.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:29:55.842 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:29:55.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:29:55.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:29:55.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:29:55.863 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:29:55.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:29:55.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:29:55.864 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:29:55.864 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:29:55.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:29:55.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:29:55.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:29:56.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:29:56.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:29:56.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:29:56.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:29:56.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:29:56.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:29:56.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:29:56.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:29:56.132 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:29:56.192 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:29:55
2026-05-29T15:29:56.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72197, datetime.datetime(2026, 5, 29, 15, 29, 55), datetime.datetime(2026, 5, 29, 15, 29, 54), 'salt', 16.16, 43.69, None, 22.34, 40.39, 12.35, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:29:56.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:29:56.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:29:56.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:29:54, diff=2.198987s, valid=True
2026-05-29T15:29:56.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:29:56.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:29:56.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:30:12, diff=-15.798096s, valid=True
2026-05-29T15:29:56.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:29:56.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:29:56.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:29:50, diff=6.208635s, valid=True
2026-05-29T15:29:56.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:29:56.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:29:56.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:29:56.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:29:56.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:29:56.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:29:56.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:30:12, diff=-15.78827s, valid=True
2026-05-29T15:29:56.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:29:56.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:29:56.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:29:56.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994038.212392s, valid=True
2026-05-29T15:29:56.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:29:56.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:29:56.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:29:56.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:29:56.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:29:56.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:29:56.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:29:56.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:29:56.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:29:56.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:29:56.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:29:56.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:29:56.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:29:56.595 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:29:56.808 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:29:57.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:29:57.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:29:57.255 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:29:57.255 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:29:57.507 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:29:57.507 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:30:27.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:30:27.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:30:27.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:30:27.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:30:27.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:30:27.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:30:27.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-05-29T15:30:27.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:30:27.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-05-29T15:30:28.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:30:28.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:30:28.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:30:28.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-05-29T15:30:30.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-05-29T15:30:30.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:30:30.629 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:30:30.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:30:30.638 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:30:30.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:30:30.650 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:30:30.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:30:30.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:30:30.650 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:30:30.650 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:30:30.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:30:30.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:30:30.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:30:30.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:30:30.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:30:30.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:30:30.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:30:30.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:30:30.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:30:30.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:30:30.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:30:30.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:30:30.984 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:30:25
2026-05-29T15:30:30.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72198, datetime.datetime(2026, 5, 29, 15, 30, 25), datetime.datetime(2026, 5, 29, 15, 30, 25), 'salt', 16.06, 43.45, None, 27.28, 35.16, 12.42, 831.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:30:30.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:30:30.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:30:30.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:30:25, diff=5.990225s, valid=True
2026-05-29T15:30:30.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:30:30.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:30:30.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:30:12, diff=18.993144s, valid=True
2026-05-29T15:30:30.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:30:30.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:30:30.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:30:19, diff=11.999947s, valid=True
2026-05-29T15:30:31.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:30:31.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:30:31.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:30:31.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:30:31.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:30:31.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:30:31.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:30:12, diff=19.003102s, valid=True
2026-05-29T15:30:31.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:30:31.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:30:31.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:30:31.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994073.003778s, valid=True
2026-05-29T15:30:31.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:30:31.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:30:31.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:30:31.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:30:31.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:30:31.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:30:31.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:30:31.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:30:31.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:30:31.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:30:31.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:30:31.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:30:31.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:30:31.329 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:30:31.555 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:30:31.899 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:30:32.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:30:32.000 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:30:32.000 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:30:32.068 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:30:32.068 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:31:02.098 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:31:02.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:31:02.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:31:02.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:31:02.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:31:02.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:31:02.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-05-29T15:31:02.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:31:02.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-05-29T15:31:02.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:31:02.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:31:02.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:31:02.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-05-29T15:31:05.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-05-29T15:31:05.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:31:05.450 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:31:05.450 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:31:05.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:31:05.471 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:31:05.472 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:31:05.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:31:05.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:31:05.472 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:31:05.472 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:31:05.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:31:05.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:31:05.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:31:05.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:31:05.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:31:05.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:31:05.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:31:05.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:31:05.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:31:05.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:31:05.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:31:05.721 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:31:05.779 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:30:56
2026-05-29T15:31:05.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72199, datetime.datetime(2026, 5, 29, 15, 30, 56), datetime.datetime(2026, 5, 29, 15, 30, 56), 'salt', 15.93, 42.23, None, 24.81, 38.75, 12.81, 831.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:31:05.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:31:05.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:31:05.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:30:56, diff=9.785264s, valid=True
2026-05-29T15:31:05.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:31:05.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:31:05.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:31:12, diff=-6.211887s, valid=True
2026-05-29T15:31:05.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:31:05.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:31:05.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:30:50, diff=15.794656s, valid=True
2026-05-29T15:31:05.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:31:05.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:31:05.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:31:05.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:31:05.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:31:05.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:31:05.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:31:12, diff=-6.202371s, valid=True
2026-05-29T15:31:05.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:31:05.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:31:05.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:31:05.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994107.798273s, valid=True
2026-05-29T15:31:05.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:31:05.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:31:05.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:31:05.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:31:05.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:31:05.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:31:05.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:31:05.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:31:05.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:31:05.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:31:05.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:31:06.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:31:06.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:31:06.111 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:31:06.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:31:06.688 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:31:06.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:31:06.788 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:31:06.788 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:31:07.023 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:31:07.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:31:37.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:31:37.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:31:37.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:31:37.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:31:37.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:31:37.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:31:37.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-05-29T15:31:37.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:31:37.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-05-29T15:31:37.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:31:37.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:31:37.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:31:37.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-05-29T15:31:40.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-05-29T15:31:40.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:31:40.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:31:40.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:31:40.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:31:40.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:31:40.203 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:31:40.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:31:40.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:31:40.204 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:31:40.204 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:31:40.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:31:40.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:31:40.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:31:40.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:31:40.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:31:40.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:31:40.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:31:40.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:31:40.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:31:40.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:31:40.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:31:40.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:31:40.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:31:26
2026-05-29T15:31:40.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72200, datetime.datetime(2026, 5, 29, 15, 31, 26), datetime.datetime(2026, 5, 29, 15, 31, 26), 'salt', 15.83, 42.46, None, 23.78, 37.13, 12.72, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:31:40.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:31:40.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:31:40.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:31:26, diff=14.527133s, valid=True
2026-05-29T15:31:40.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:31:40.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:31:40.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:31:12, diff=28.530007s, valid=True
2026-05-29T15:31:40.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:31:40.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:31:40.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:31:22, diff=18.536684s, valid=True
2026-05-29T15:31:40.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:31:40.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:31:40.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:31:40.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:31:40.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:31:40.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:31:40.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:31:12, diff=28.539725s, valid=True
2026-05-29T15:31:40.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:31:40.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:31:40.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:31:40.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994142.540381s, valid=True
2026-05-29T15:31:40.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:31:40.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:31:40.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:31:40.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:31:40.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:31:40.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:31:40.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:31:40.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:31:40.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:31:40.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:31:40.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:31:40.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:31:40.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:31:40.868 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:31:41.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:31:41.442 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:31:41.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:31:41.604 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:31:41.604 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:31:41.778 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:31:41.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:32:11.799 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:32:11.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:32:11.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:32:12.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:32:12.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:32:12.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:32:12.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T15:32:12.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:32:12.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-05-29T15:32:12.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:32:12.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:32:12.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:32:12.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-05-29T15:32:14.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-05-29T15:32:14.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:32:14.971 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:32:14.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:32:14.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:32:14.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:32:14.994 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:32:14.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:32:14.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:32:14.994 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:32:14.994 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:32:15.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:32:15.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:32:15.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:32:15.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:32:15.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:32:15.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:32:15.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:32:15.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:32:15.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:32:15.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:32:15.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:32:15.252 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:32:15.311 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:31:56
2026-05-29T15:32:15.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72201, datetime.datetime(2026, 5, 29, 15, 31, 56), datetime.datetime(2026, 5, 29, 15, 31, 56), 'salt', 15.73, 42.29, None, 24.1, 39.43, 12.77, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:32:15.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:32:15.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:32:15.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:31:56, diff=19.317634s, valid=True
2026-05-29T15:32:15.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:32:15.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:32:15.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:32:12, diff=3.320505s, valid=True
2026-05-29T15:32:15.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:32:15.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:32:15.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:31:54, diff=21.327208s, valid=True
2026-05-29T15:32:15.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:32:15.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:32:15.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:32:15.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:32:15.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:32:15.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:32:15.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:32:12, diff=3.330324s, valid=True
2026-05-29T15:32:15.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:32:15.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:32:15.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:32:15.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994177.330992s, valid=True
2026-05-29T15:32:15.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:32:15.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:32:15.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:32:15.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:32:15.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:32:15.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:32:15.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:32:15.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:32:15.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:32:15.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:32:15.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:32:15.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:32:15.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:32:15.649 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:32:15.868 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:32:16.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:32:16.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:32:16.321 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:32:16.321 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:32:16.544 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:32:16.544 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:32:46.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:32:46.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:32:46.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:32:46.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:32:46.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:32:47.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:32:47.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-05-29T15:32:47.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:32:47.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-05-29T15:32:47.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:32:47.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:32:47.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:32:47.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-05-29T15:32:49.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-05-29T15:32:49.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:32:49.763 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:32:49.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:32:49.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:32:49.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:32:49.783 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:32:49.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:32:49.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:32:49.783 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:32:49.783 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:32:49.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:32:49.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:32:49.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:32:49.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:32:49.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:32:50.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T15:32:50.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:32:50.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T15:32:50.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:32:50.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:32:50.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:32:50.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:32:50.111 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:32:27
2026-05-29T15:32:50.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72202, datetime.datetime(2026, 5, 29, 15, 32, 27), datetime.datetime(2026, 5, 29, 15, 32, 26), 'salt', 15.73, 43.22, None, 19.87, 36.31, 12.46, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:32:50.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:32:50.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:32:50.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:32:26, diff=24.117248s, valid=True
2026-05-29T15:32:50.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:32:50.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T15:32:50.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:32:12, diff=38.120165s, valid=True
2026-05-29T15:32:50.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:32:50.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:32:50.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:32:25, diff=25.128365s, valid=True
2026-05-29T15:32:50.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:32:50.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:32:50.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:32:50.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:32:50.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:32:50.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T15:32:50.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:32:12, diff=38.13225s, valid=True
2026-05-29T15:32:50.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:32:50.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:32:50.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:32:50.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994212.132984s, valid=True
2026-05-29T15:32:50.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:32:50.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:32:50.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:32:50.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:32:50.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:32:50.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:32:50.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:32:50.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:32:50.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:32:50.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:32:50.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:32:50.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:32:50.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:32:50.451 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:32:50.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:32:51.102 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:32:51.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:32:51.202 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:32:51.202 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:32:51.370 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:32:51.370 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:33:21.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:33:21.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:33:21.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:33:21.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:33:21.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:33:22.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:33:22.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-05-29T15:33:22.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:33:22.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-05-29T15:33:22.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:33:22.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:33:22.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:33:22.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-05-29T15:33:24.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-05-29T15:33:24.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:33:24.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:33:24.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:33:24.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:33:24.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:33:24.693 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:33:24.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:33:24.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:33:24.693 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:33:24.694 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:33:24.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:33:24.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:33:24.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:33:24.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:33:24.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:33:24.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:33:24.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:33:24.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:33:24.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:33:24.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:33:24.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:33:24.944 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:33:25.002 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:32:57
2026-05-29T15:33:25.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72203, datetime.datetime(2026, 5, 29, 15, 32, 57), datetime.datetime(2026, 5, 29, 15, 32, 56), 'salt', 15.73, 43.25, None, 21.07, 40.48, 12.45, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:33:25.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:33:25.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:33:25.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:32:56, diff=29.009077s, valid=True
2026-05-29T15:33:25.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:33:25.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:33:25.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:33:12, diff=13.012019s, valid=True
2026-05-29T15:33:25.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:33:25.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:33:25.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:32:56, diff=29.018776s, valid=True
2026-05-29T15:33:25.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:33:25.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:33:25.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:33:25.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:33:25.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:33:25.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:33:25.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:33:12, diff=13.021874s, valid=True
2026-05-29T15:33:25.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:33:25.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:33:25.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:33:25.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994247.022533s, valid=True
2026-05-29T15:33:25.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:33:25.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:33:25.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:33:25.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:33:25.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:33:25.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:33:25.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:33:25.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:33:25.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:33:25.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:33:25.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:33:25.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:33:25.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:33:25.342 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:33:25.555 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:33:25.900 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:33:26.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:33:26.000 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:33:26.000 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:33:26.169 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:33:26.169 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:33:56.194 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:33:56.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:33:56.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:33:56.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:33:56.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:33:56.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:33: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-05-29T15:33:56.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:33:56.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-05-29T15:33:56.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:33:56.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:33:56.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:33:56.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-05-29T15:33:59.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-05-29T15:33:59.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:33:59.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:33:59.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:33:59.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:33:59.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:33:59.564 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:33:59.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:33:59.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:33:59.564 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:33:59.564 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:33:59.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:33:59.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:33:59.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:33:59.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:33:59.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:33:59.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:33:59.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:33:59.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:33:59.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:33:59.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:33:59.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:33:59.815 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:33:59.873 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:33:57
2026-05-29T15:33:59.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72205, datetime.datetime(2026, 5, 29, 15, 33, 57), datetime.datetime(2026, 5, 29, 15, 33, 57), 'salt', 15.89, 44.15, None, 17.75, 23.18, 12.17, 831.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:33:59.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:33:59.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:33:59.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:33:57, diff=2.886806s, valid=True
2026-05-29T15:33:59.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:33:59.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:33:59.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:34:12, diff=-12.109959s, valid=True
2026-05-29T15:33:59.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:33:59.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:33:59.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:33:51, diff=8.898132s, valid=True
2026-05-29T15:33:59.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:33:59.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:33:59.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:33:59.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:33:59.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:33:59.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:33:59.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:34:12, diff=-12.098642s, valid=True
2026-05-29T15:33:59.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:33:59.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:33:59.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:33:59.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994281.902043s, valid=True
2026-05-29T15:33:59.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:33:59.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:33:59.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:33:59.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:33:59.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:33:59.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:33:59.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:33:59.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:34:00.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:34:00.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:34:00.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:34:00.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:34:00.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:34:00.322 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:34:00.556 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:34:00.906 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:34:01.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:34:01.007 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:34:01.007 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:34:01.174 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:34:01.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:34:31.204 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:34:31.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:34:31.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:34:31.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:34:31.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:34:31.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:34:31.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-05-29T15:34:31.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:34:31.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-05-29T15:34:31.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:34:31.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:34:31.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:34:31.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-05-29T15:34:34.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-05-29T15:34:34.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:34:34.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:34:34.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:34:34.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:34:34.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:34:34.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:34:34.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:34:34.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:34:34.441 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:34:34.441 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:34:34.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:34:34.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:34:34.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:34:34.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:34:34.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:34:34.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:34:34.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:34:34.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:34:34.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:34:34.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:34:34.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:34:34.687 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:34:34.750 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:34:27
2026-05-29T15:34:34.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72206, datetime.datetime(2026, 5, 29, 15, 34, 27), datetime.datetime(2026, 5, 29, 15, 34, 27), 'salt', 16.06, 42.23, None, 23.25, 37.39, 12.82, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:34:34.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:34:34.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:34:34.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:34:27, diff=7.757033s, valid=True
2026-05-29T15:34:34.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:34:34.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:34:34.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:34:12, diff=22.759877s, valid=True
2026-05-29T15:34:34.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:34:34.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:34:34.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:34:21, diff=13.766515s, valid=True
2026-05-29T15:34:34.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:34:34.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:34:34.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:34:34.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:34:34.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:34:34.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:34:34.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:34:12, diff=22.769875s, valid=True
2026-05-29T15:34:34.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:34:34.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:34:34.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:34:34.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994316.770567s, valid=True
2026-05-29T15:34:34.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:34:34.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:34:34.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:34:34.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:34:34.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:34:34.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:34:34.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:34:34.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:34:34.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:34:34.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:34:34.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:34:34.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:34:35.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:34:35.086 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:34:35.302 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:34:35.651 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:34:35.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:34:35.752 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:34:35.753 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:34:35.949 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:34:35.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:35:05.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:35:05.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:35:05.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:35:06.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:35:06.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:35:06.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:35:06.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-05-29T15:35:06.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:35:06.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-05-29T15:35:06.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:35:06.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:35:06.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:35:06.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-05-29T15:35:09.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T15:35:09.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:35:09.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:35:09.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:35:09.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:35:09.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:35:09.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:35:09.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:35:09.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:35:09.106 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:35:09.106 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:35:09.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:35:09.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:35:09.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:35:09.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:35:09.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:35:09.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:35:09.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:35:09.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:35:09.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:35:09.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:35:09.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:35:09.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:35:09.416 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:34:58
2026-05-29T15:35:09.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72207, datetime.datetime(2026, 5, 29, 15, 34, 58), datetime.datetime(2026, 5, 29, 15, 34, 57), 'salt', 15.96, 41.7, None, 20.32, 42.92, 12.99, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:35:09.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:35:09.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:35:09.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:34:57, diff=12.422286s, valid=True
2026-05-29T15:35:09.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:35:09.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:35:09.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:35:12, diff=-2.574894s, valid=True
2026-05-29T15:35:09.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:35:09.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:35:09.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:34:52, diff=17.431807s, valid=True
2026-05-29T15:35:09.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:35:09.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:35:09.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:35:09.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:35:09.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:35:09.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:35:09.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:35:12, diff=-2.565158s, valid=True
2026-05-29T15:35:09.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:35:09.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:35:09.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:35:09.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994351.435504s, valid=True
2026-05-29T15:35:09.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:35:09.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:35:09.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:35:09.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:35:09.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:35:09.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:35:09.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:35:09.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:35:09.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:35:09.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:35:09.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:35:09.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:35:09.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:35:09.817 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:35:10.047 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:35:10.403 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:35:10.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:35:10.505 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:35:10.506 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:35:10.755 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:35:10.755 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:35:40.762 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:35:40.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:35:40.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:35:41.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:35:41.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:35:41.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:35:41.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-05-29T15:35:41.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:35:41.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-05-29T15:35:41.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:35:41.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:35:41.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:35:41.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-05-29T15:35:43.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-05-29T15:35:43.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:35:43.952 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:35:43.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:35:43.961 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:35:43.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:35:43.980 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:35:43.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:35:43.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:35:43.980 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:35:43.980 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:35:43.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:35:44.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:35:44.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:35:44.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:35:44.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:35:44.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:35:44.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:35:44.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:35:44.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:35:44.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:35:44.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:35:44.228 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:35:44.286 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:35:28
2026-05-29T15:35:44.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72208, datetime.datetime(2026, 5, 29, 15, 35, 28), datetime.datetime(2026, 5, 29, 15, 35, 28), 'salt', 15.76, 41.2, None, 21.88, 38.16, 13.14, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:35:44.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:35:44.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:35:44.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:35:28, diff=16.292402s, valid=True
2026-05-29T15:35:44.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:35:44.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:35:44.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:35:12, diff=32.29529s, valid=True
2026-05-29T15:35:44.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:35:44.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:35:44.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:35:23, diff=21.302095s, valid=True
2026-05-29T15:35:44.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:35:44.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:35:44.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:35:44.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:35:44.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:35:44.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:35:44.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:35:12, diff=32.305163s, valid=True
2026-05-29T15:35:44.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:35:44.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:35:44.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:35:44.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994386.305843s, valid=True
2026-05-29T15:35:44.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:35:44.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:35:44.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:35:44.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:35:44.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:35:44.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:35:44.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:35:44.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:35:44.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:35:44.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:35:44.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:35:44.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:35:44.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:35:44.624 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:35:44.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:35:45.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:35:45.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:35:45.292 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:35:45.292 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:35:45.459 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:35:45.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:36:15.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:36:15.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:36:15.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:36:15.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:36:15.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:36:15.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:36:15.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-05-29T15:36:15.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:36:15.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-05-29T15:36:15.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:36:15.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:36:15.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:36:15.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-05-29T15:36:18.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-05-29T15:36:18.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:36:18.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:36:18.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:36:18.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:36:18.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:36:18.461 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:36:18.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:36:18.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:36:18.461 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:36:18.461 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:36:18.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:36:18.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:36:18.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:36:18.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:36:18.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:36:18.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:36:18.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:36:18.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:36:18.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:36:18.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:36:18.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:36:18.719 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:36:18.778 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:35:58
2026-05-29T15:36:18.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72209, datetime.datetime(2026, 5, 29, 15, 35, 58), datetime.datetime(2026, 5, 29, 15, 35, 58), 'salt', 15.69, 41.6, None, 21.74, 47.75, 12.99, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:36:18.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:36:18.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:36:18.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:35:58, diff=20.785639s, valid=True
2026-05-29T15:36:18.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:36:18.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:36:18.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:36:12, diff=6.788544s, valid=True
2026-05-29T15:36:18.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:36:18.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:36:18.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:35:55, diff=23.795676s, valid=True
2026-05-29T15:36:18.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:36:18.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:36:18.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:36:18.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:36:18.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:36:18.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:36:18.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:36:12, diff=6.798747s, valid=True
2026-05-29T15:36:18.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:36:18.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:36:18.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:36:18.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994420.799418s, valid=True
2026-05-29T15:36:18.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:36:18.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:36:18.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:36:18.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:36:18.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:36:18.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:36:18.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:36:18.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:36:18.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:36:19.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:36:19.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:36:19.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:36:19.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:36:19.199 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:36:19.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:36:19.796 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:36:19.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:36:19.904 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:36:19.904 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:36:20.072 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:36:20.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:36:50.102 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:36:50.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:36:50.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:36:50.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:36:50.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:36:51.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:36: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-05-29T15:36:51.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:36:51.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-05-29T15:36:51.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:36:51.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:36:51.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:36:51.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-05-29T15:36:53.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-05-29T15:36:53.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:36:53.777 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:36:53.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:36:53.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:36:53.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:36:53.798 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:36:53.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:36:53.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:36:53.798 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:36:53.798 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:36:53.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:36:53.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:36:53.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:36:53.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:36:53.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:36:54.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T15:36:54.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:36:54.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T15:36:54.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:36:54.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:36:54.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:36:54.056 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:36:54.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:36:28
2026-05-29T15:36:54.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72210, datetime.datetime(2026, 5, 29, 15, 36, 28), datetime.datetime(2026, 5, 29, 15, 36, 28), 'salt', 15.43, 42.53, None, 16.27, 43.83, 12.66, 831.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:36:54.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:36:54.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:36:54.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:36:28, diff=26.120559s, valid=True
2026-05-29T15:36:54.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:36:54.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T15:36:54.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:36:12, diff=42.123441s, valid=True
2026-05-29T15:36:54.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:36:54.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:36:54.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:36:26, diff=28.130247s, valid=True
2026-05-29T15:36:54.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:36:54.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:36:54.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:36:54.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:36:54.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:36:54.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T15:36:54.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:36:12, diff=42.133305s, valid=True
2026-05-29T15:36:54.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:36:54.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:36:54.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:36:54.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994456.133973s, valid=True
2026-05-29T15:36:54.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:36:54.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:36:54.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:36:54.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:36:54.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:36:54.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:36:54.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:36:54.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:36:54.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:36:54.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:36:54.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:36:54.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:36:54.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:36:54.454 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:36:54.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:36:55.019 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:36:55.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:36:55.120 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:36:55.120 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:36:55.363 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:36:55.363 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:37:25.393 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:37:25.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:37:25.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:37:25.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:37:25.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:37:25.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:37:25.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-05-29T15:37:25.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:37:25.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-05-29T15:37:25.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:37:25.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:37:25.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:37:25.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T15:37:28.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-05-29T15:37:28.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:37:28.573 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:37:28.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:37:28.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:37:28.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:37:28.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:37:28.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:37:28.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:37:28.593 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:37:28.594 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:37:28.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:37:28.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:37:28.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:37:28.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:37:28.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:37:28.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:37:28.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:37:28.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:37:28.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:37:28.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:37:28.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:37:28.853 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:37:28.912 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:36:59
2026-05-29T15:37:28.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72211, datetime.datetime(2026, 5, 29, 15, 36, 59), datetime.datetime(2026, 5, 29, 15, 36, 58), 'salt', 15.4, 43.12, None, 16.8, 56.92, 12.47, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:37:28.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:37:28.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:37:28.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:36:58, diff=30.919083s, valid=True
2026-05-29T15:37:28.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:37:28.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:37:28.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:37:12, diff=16.922042s, valid=True
2026-05-29T15:37:28.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:37:28.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:37:28.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:36:58, diff=30.92902s, valid=True
2026-05-29T15:37:28.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:37:28.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:37:28.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:37:28.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:37:28.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:37:28.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:37:28.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:37:12, diff=16.935751s, valid=True
2026-05-29T15:37:28.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:37:28.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:37:28.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:37:28.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994490.936432s, valid=True
2026-05-29T15:37:28.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:37:28.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:37:28.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:37:28.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:37:28.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:37:28.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:37:28.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:37:28.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:37:29.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:37:29.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:37:29.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:37:29.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:37:29.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:37:29.252 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:37:29.472 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:37:29.828 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:37:29.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:37:29.931 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:37:29.931 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:37:30.106 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:37:30.106 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:38:00.135 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:38:00.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:38:00.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:38:00.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:38:00.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:38:00.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:38:00.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-05-29T15:38:00.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:38:00.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-05-29T15:38:00.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:38:00.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:38:00.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:38:00.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-05-29T15:38:02.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-05-29T15:38:02.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:38:02.971 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:38:02.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:38:02.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:38:02.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:38:02.992 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:38:02.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:38:02.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:38:02.992 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:38:02.992 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:38:02.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:38:03.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:38:03.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:38:03.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:38:03.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:38:03.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:38:03.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:38:03.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:38:03.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:38:03.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:38:03.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:38:03.258 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:38:03.317 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:37:59
2026-05-29T15:38:03.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72213, datetime.datetime(2026, 5, 29, 15, 37, 59), datetime.datetime(2026, 5, 29, 15, 37, 59), 'salt', 15.3, 44.45, None, 24.63, 43.86, 12.03, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:38:03.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:38:03.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:38:03.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:37:59, diff=4.32458s, valid=True
2026-05-29T15:38:03.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:38:03.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:38:03.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:38:12, diff=-8.672099s, valid=True
2026-05-29T15:38:03.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:38:03.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:38:03.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:37:53, diff=10.335593s, valid=True
2026-05-29T15:38:03.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:38:03.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:38:03.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:38:03.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:38:03.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:38:03.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:38:03.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:38:12, diff=-8.66091s, valid=True
2026-05-29T15:38:03.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:38:03.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:38:03.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:38:03.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994525.339844s, valid=True
2026-05-29T15:38:03.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:38:03.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:38:03.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:38:03.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:38:03.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:38:03.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:38:03.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:38:03.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:38:03.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:38:03.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:38:03.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:38:03.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:38:03.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:38:03.716 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:38:03.949 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:38:04.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:38:04.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:38:04.472 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:38:04.472 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:38:04.539 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:38:04.540 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:38:34.547 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:38:34.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:38:34.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:38:35.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:38:35.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:38:35.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:38:35.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-05-29T15:38:35.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:38:35.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-05-29T15:38:35.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:38:35.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:38:35.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:38:35.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-05-29T15:38:37.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-05-29T15:38:37.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:38:37.877 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:38:37.877 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:38:37.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:38:37.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:38:37.898 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:38:37.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:38:37.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:38:37.898 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:38:37.898 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:38:37.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:38:37.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:38:37.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:38:38.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:38:38.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:38:38.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:38:38.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:38:38.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:38:38.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:38:38.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:38:38.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:38:38.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:38:38.241 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:38:29
2026-05-29T15:38:38.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72214, datetime.datetime(2026, 5, 29, 15, 38, 29), datetime.datetime(2026, 5, 29, 15, 38, 29), 'salt', 15.36, 44.91, None, 26.08, 36.19, 11.88, 831.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:38:38.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:38:38.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:38:38.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:38:29, diff=9.247853s, valid=True
2026-05-29T15:38:38.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:38:38.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:38:38.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:38:12, diff=26.2507s, valid=True
2026-05-29T15:38:38.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:38:38.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:38:38.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:38:23, diff=15.257398s, valid=True
2026-05-29T15:38:38.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:38:38.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:38:38.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:38:38.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:38:38.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:38:38.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:38:38.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:38:12, diff=26.260456s, valid=True
2026-05-29T15:38:38.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:38:38.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:38:38.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:38:38.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994560.261121s, valid=True
2026-05-29T15:38:38.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:38:38.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:38:38.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:38:38.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:38:38.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:38:38.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:38:38.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:38:38.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:38:38.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:38:38.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:38:38.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:38:38.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:38:38.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:38:38.574 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:38:38.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:38:39.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:38:39.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:38:39.214 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:38:39.214 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:38:39.488 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:38:39.488 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:39:09.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:39:09.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:39:09.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:39:09.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:39:09.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:39:10.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:39:10.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-05-29T15:39:10.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:39:10.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-05-29T15:39:10.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:39:10.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:39:10.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:39:10.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-05-29T15:39:12.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-05-29T15:39:12.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:39:12.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:39:12.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:39:12.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:39:12.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:39:12.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:39:12.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:39:12.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:39:12.779 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:39:12.780 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:39:12.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:39:12.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:39:12.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:39:12.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:39:12.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:39:12.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:39:12.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:39:13.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:39:13.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:39:13.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:39:13.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:39:13.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:39:13.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:39:00
2026-05-29T15:39:13.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72215, datetime.datetime(2026, 5, 29, 15, 39), datetime.datetime(2026, 5, 29, 15, 38, 59), 'salt', 15.36, 44.94, None, 22.05, 34.06, 11.87, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:39:13.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:39:13.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:39:13.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:38:59, diff=14.103929s, valid=True
2026-05-29T15:39:13.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:39:13.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:39:13.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:39:12, diff=1.106769s, valid=True
2026-05-29T15:39:13.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:39:13.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:39:13.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:38:54, diff=19.113484s, valid=True
2026-05-29T15:39:13.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:39:13.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:39:13.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:39:13.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:39:13.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:39:13.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:39:13.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:39:12, diff=1.116493s, valid=True
2026-05-29T15:39:13.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:39:13.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:39:13.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:39:13.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994595.117169s, valid=True
2026-05-29T15:39:13.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:39:13.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:39:13.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:39:13.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:39:13.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:39:13.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:39:13.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:39:13.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:39:13.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:39:13.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:39:13.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:39:13.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:39:13.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:39:13.433 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:39:13.716 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:39:14.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:39:14.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:39: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-05-29T15:39: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-05-29T15:39:14.382 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:39:14.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:39:44.412 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:39:44.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:39:44.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:39:44.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:39:44.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:39:44.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:39:44.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-05-29T15:39:44.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:39:44.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-05-29T15:39:44.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:39:44.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:39:44.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:39:44.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-05-29T15:39:47.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T15:39:47.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:39:47.514 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:39:47.514 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:39:47.523 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:39:47.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:39:47.534 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:39:47.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:39:47.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:39:47.535 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:39:47.535 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:39:47.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:39:47.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:39:47.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:39:47.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:39:47.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:39:47.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:39:47.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:39:47.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:39:47.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:39:47.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:39:47.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:39:47.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:39:47.843 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:39:30
2026-05-29T15:39:47.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72216, datetime.datetime(2026, 5, 29, 15, 39, 30), datetime.datetime(2026, 5, 29, 15, 39, 29), 'salt', 15.39, 45.04, None, 19.3, 39.42, 11.84, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:39:47.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:39:47.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:39:47.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:39:29, diff=18.850217s, valid=True
2026-05-29T15:39:47.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:39:47.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:39:47.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:39:12, diff=35.853156s, valid=True
2026-05-29T15:39:47.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:39:47.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:39:47.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:39:25, diff=22.859987s, valid=True
2026-05-29T15:39:47.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:39:47.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:39:47.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:39:47.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:39:47.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:39:47.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:39:47.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:39:12, diff=35.863096s, valid=True
2026-05-29T15:39:47.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:39:47.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:39:47.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:39:47.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994629.863776s, valid=True
2026-05-29T15:39:47.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:39:47.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:39:47.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:39:47.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:39:47.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:39:47.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:39:47.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:39:47.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:39:47.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:39:47.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:39:48.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:39:48.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:39:48.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:39:48.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:39:48.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:39:48.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:39:48.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:39:48.819 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:39:48.819 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:39:49.120 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:39:49.120 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:40:19.150 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:40:19.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:40:19.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:40:19.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:40:19.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:40:19.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:40:19.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-05-29T15:40:19.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:40:19.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-05-29T15:40:19.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:40:19.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:40:19.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:40:19.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-05-29T15:40:22.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-05-29T15:40:22.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:40:22.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:40:22.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:40:22.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:40:22.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:40:22.512 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:40:22.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:40:22.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:40:22.512 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:40:22.512 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:40:22.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:40:22.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:40:22.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:40:22.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:40:22.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:40:22.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:40:22.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:40:22.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:40:22.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:40:22.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:40:22.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:40:22.764 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:40:22.832 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:40:00
2026-05-29T15:40:22.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72217, datetime.datetime(2026, 5, 29, 15, 40), datetime.datetime(2026, 5, 29, 15, 40), 'salt', 15.39, 45.14, None, 20.36, 36.7, 11.81, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:40:22.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:40:22.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:40:22.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:40:00, diff=22.838785s, valid=True
2026-05-29T15:40:22.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:40:22.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:40:22.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:40:12, diff=10.841697s, valid=True
2026-05-29T15:40:22.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:40:22.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:40:22.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:39:56, diff=26.848469s, valid=True
2026-05-29T15:40:22.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:40:22.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:40:22.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:40:22.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:40:22.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:40:22.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:40:22.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:40:12, diff=10.851569s, valid=True
2026-05-29T15:40:22.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:40:22.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:40:22.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:40:22.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994664.852239s, valid=True
2026-05-29T15:40:22.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:40:22.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:40:22.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:40:22.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:40:22.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:40:22.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:40:22.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:40:22.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:40:22.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:40:22.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:40:23.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:40:23.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:40:23.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:40:23.236 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:40:23.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:40:23.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:40:23.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:40:23.875 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:40:23.875 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:40:24.160 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:40:24.161 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:40:54.190 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:40:54.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:40:54.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:40:54.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:40:54.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:40:54.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:40:54.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-05-29T15:40:54.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:40:54.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T15:40:54.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:40:54.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:40:54.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:40:54.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-05-29T15:40:57.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-05-29T15:40:57.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:40:57.572 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:40:57.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:40:57.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:40:57.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:40:57.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:40:57.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:40:57.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:40:57.594 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:40:57.594 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:40:57.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:40:57.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:40:57.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:40:57.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:40:57.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:40:57.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T15:40:57.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:40:57.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T15:40:57.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:40:57.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:40:57.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:40:57.841 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:40:57.900 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:40:30
2026-05-29T15:40:57.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72218, datetime.datetime(2026, 5, 29, 15, 40, 30), datetime.datetime(2026, 5, 29, 15, 40, 30), 'salt', 15.73, 45.47, None, 19.8, 22.75, 11.74, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:40:57.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:40:57.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:40:57.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:40:30, diff=27.906869s, valid=True
2026-05-29T15:40:57.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:40:57.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T15:40:57.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:40:12, diff=45.909675s, valid=True
2026-05-29T15:40:57.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:40:57.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:40:57.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:40:28, diff=29.916251s, valid=True
2026-05-29T15:40:57.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:40:57.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:40:57.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:40:57.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:40:57.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:40:57.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T15:40:57.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:40:12, diff=45.919243s, valid=True
2026-05-29T15:40:57.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:40:57.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:40:57.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:40:57.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994699.919898s, valid=True
2026-05-29T15:40:57.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:40:57.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:40:57.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:40:57.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:40:57.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:40:57.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:40:57.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:40:57.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:40:57.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:40:58.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:40:58.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:40:58.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:40:58.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:40:58.239 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:40:58.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:40:58.785 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:40:58.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:40:58.883 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:40:58.884 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:40:59.155 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:40:59.156 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:41:29.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:41:29.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:41:29.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:41:29.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:41:29.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:41:29.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:41:29.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-05-29T15:41:29.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:41:29.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-05-29T15:41:29.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:41:29.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:41:29.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:41:29.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-05-29T15:41:32.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-05-29T15:41:32.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:41:32.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:41:32.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:41:32.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:41:32.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:41:32.606 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:41:32.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:41:32.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:41:32.607 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:41:32.607 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:41:32.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:41:32.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:41:32.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:41:32.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:41:32.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:41:32.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:41:32.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:41:32.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:41:32.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:41:32.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:41:32.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:41:32.859 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:41:32.919 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:41:31
2026-05-29T15:41:32.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72220, datetime.datetime(2026, 5, 29, 15, 41, 31), datetime.datetime(2026, 5, 29, 15, 41, 30), 'salt', 15.69, 44.31, None, 20.64, 34.03, 12.1, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:41:32.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:41:32.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:41:32.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:41:30, diff=2.926167s, valid=True
2026-05-29T15:41:32.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:41:32.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:41:32.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:41:12, diff=20.92908s, valid=True
2026-05-29T15:41:32.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:41:32.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:41:32.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:41:25, diff=7.935751s, valid=True
2026-05-29T15:41:32.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:41:32.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:41:32.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:41:32.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:41:32.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:41:32.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:41:32.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:41:12, diff=20.938852s, valid=True
2026-05-29T15:41:32.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:41:32.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:41:32.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:41:32.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994734.939509s, valid=True
2026-05-29T15:41:32.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:41:32.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:41:32.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:41:32.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:41:32.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:41:32.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:41:32.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:41:32.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:41:33.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:41:33.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:41:33.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:41:33.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:41:33.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:41:33.325 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:41:33.530 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:41:33.869 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:41:33.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:41:33.968 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:41:33.968 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:41:34.129 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:41:34.129 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:42:04.139 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:42:04.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:42:04.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:42:04.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:42:04.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:42:04.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:42:04.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-05-29T15:42:04.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:42:04.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-05-29T15:42:04.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:42:04.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:42:04.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:42:04.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-05-29T15:42:07.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T15:42:07.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:42:07.569 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:42:07.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:42:07.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:42:07.595 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:42:07.596 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:42:07.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:42:07.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:42:07.596 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:42:07.596 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:42:07.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:42:07.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:42:07.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:42:07.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:42:07.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:42:07.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:42:07.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:42:07.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:42:07.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:42:07.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:42:07.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:42:07.846 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:42:07.905 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:42:01
2026-05-29T15:42:07.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72221, datetime.datetime(2026, 5, 29, 15, 42, 1), datetime.datetime(2026, 5, 29, 15, 42, 1), 'salt', 15.43, 44.11, None, 20.25, 38.84, 12.15, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:42:07.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:42:07.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:42:07.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:01, diff=6.911293s, valid=True
2026-05-29T15:42:07.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:42:07.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:42:07.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=-4.085872s, valid=True
2026-05-29T15:42:07.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:42:07.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:42:07.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:41:55, diff=12.92071s, valid=True
2026-05-29T15:42:07.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:42:07.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:42:07.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:42:07.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:42:07.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:42:07.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:42:07.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=-4.076237s, valid=True
2026-05-29T15:42:07.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:42:07.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:42:07.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:42:07.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994769.924415s, valid=True
2026-05-29T15:42:07.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:42:07.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:42:07.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:42:07.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:42:07.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:42:07.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:42:07.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:42:07.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:42:08.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:42:08.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:42:08.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:42:08.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:42:08.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:42:08.245 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:42:08.452 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:42:08.791 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:42:08.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:42:08.889 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:42:08.889 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:42:09.177 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:42:09.178 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:42:39.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:42:39.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:42:39.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:42:39.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:42:39.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:42:39.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:42: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-05-29T15:42:39.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:42:39.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-05-29T15:42:39.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:42:39.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:42:39.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:42:39.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-05-29T15:42:42.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-05-29T15:42:42.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:42:42.627 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:42:42.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:42:42.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:42:42.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:42:42.651 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:42:42.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:42:42.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:42:42.652 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:42:42.652 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:42:42.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:42:42.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:42:42.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:42:42.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:42:42.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:42:42.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:42:42.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:42:42.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T15:42:42.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:42:42.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:42:42.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:42:42.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:42:42.996 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:42:31
2026-05-29T15:42:42.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72222, datetime.datetime(2026, 5, 29, 15, 42, 31), datetime.datetime(2026, 5, 29, 15, 42, 31), 'salt', 15.33, 45.27, None, 23.22, 33.35, 11.77, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:42:42.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:42:42.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:42:43.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:31, diff=12.002339s, valid=True
2026-05-29T15:42:43.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:42:43.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:42:43.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=31.005269s, valid=True
2026-05-29T15:42:43.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:42:43.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:42:43.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:25, diff=18.014718s, valid=True
2026-05-29T15:42:43.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:42:43.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:42:43.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:42:43.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:42:43.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:42:43.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T15:42:43.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=31.017859s, valid=True
2026-05-29T15:42:43.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:42:43.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:42:43.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:42:43.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994805.018534s, valid=True
2026-05-29T15:42:43.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:42:43.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:42:43.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:42:43.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:42:43.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:42:43.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:42:43.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:42:43.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:42:43.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:42:43.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:42:43.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:42:43.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:42:43.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:42:43.419 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:42:43.640 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:42:44.011 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:42:44.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:42:44.110 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:42:44.110 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:42:44.368 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:42:44.368 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:43:14.373 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:43:14.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:43:14.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:43:14.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:43:14.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:43:14.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:43: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-05-29T15:43:14.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:43:14.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-05-29T15:43:14.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:43:14.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:43:14.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:43:14.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-05-29T15:43:17.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-05-29T15:43:17.615 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:43:17.615 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:43:17.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:43:17.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:43:17.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:43:17.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:43:17.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:43:17.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:43:17.635 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:43:17.635 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:43:17.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:43:17.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:43:17.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:43:17.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:43:17.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:43:17.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T15:43:17.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:43:17.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T15:43:17.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:43:17.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:43:17.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:43:17.890 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:43:17.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:43:01
2026-05-29T15:43:17.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72223, datetime.datetime(2026, 5, 29, 15, 43, 1), datetime.datetime(2026, 5, 29, 15, 43, 1), 'salt', 15.23, 45.37, None, 18.77, 17.76, 11.73, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:43:17.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:43:17.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:43:17.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:43:01, diff=16.968283s, valid=True
2026-05-29T15:43:17.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:43:17.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T15:43:17.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=65.971189s, valid=True
2026-05-29T15:43:17.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:43:17.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:43:17.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:56, diff=21.97794s, valid=True
2026-05-29T15:43:17.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:43:17.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:43:17.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:43:17.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:43:17.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:43:17.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T15:43:17.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=65.981043s, valid=True
2026-05-29T15:43:17.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:43:17.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:43:17.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:43:17.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994839.98174s, valid=True
2026-05-29T15:43:17.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:43:17.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:43:17.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:43:17.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:43:17.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:43:18.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:43:18.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:43:18.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:43:18.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:43:18.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:43:18.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:43:18.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:43:18.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:43:18.297 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:43:18.501 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:43:18.843 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:43:18.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:43:18.942 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:43:18.942 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:43:19.201 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:43:19.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:43:49.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:43:49.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:43:49.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:43:49.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:43:49.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:43:49.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:43:49.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-05-29T15:43:49.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:43:49.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-05-29T15:43:49.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:43:49.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:43:50.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:43:50.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-05-29T15:43:52.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-05-29T15:43:52.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:43:52.696 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:43:52.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:43:52.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:43:52.717 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:43:52.717 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:43:52.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:43:52.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:43:52.717 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:43:52.717 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:43:52.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:43:52.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:43:52.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:43:52.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:43:52.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:43:52.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T15:43:52.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:43:52.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T15:43:52.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:43:52.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:43:52.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:43:52.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:43:53.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:43:32
2026-05-29T15:43:53.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72224, datetime.datetime(2026, 5, 29, 15, 43, 32), datetime.datetime(2026, 5, 29, 15, 43, 31), 'salt', 15.26, 46.43, None, 18.42, 22.0, 11.4, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:43:53.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:43:53.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:43:53.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:43:31, diff=22.047714s, valid=True
2026-05-29T15:43:53.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:43:53.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T15:43:53.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=101.050514s, valid=True
2026-05-29T15:43:53.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:43:53.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:43:53.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:43:26, diff=27.05708s, valid=True
2026-05-29T15:43:53.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:43:53.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:43:53.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:43:53.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:43:53.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:43:53.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T15:43:53.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=101.060101s, valid=True
2026-05-29T15:43:53.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:43:53.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:43:53.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:43:53.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994875.060765s, valid=True
2026-05-29T15:43:53.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:43:53.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:43:53.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:43:53.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:43:53.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:43:53.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:43:53.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:43:53.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:43:53.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:43:53.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:43:53.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:43:53.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:43:53.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:43:53.400 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:43:53.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:43:53.964 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:43:54.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:43:54.061 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:43:54.062 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:43:54.320 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:43:54.320 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:44:24.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:44:24.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:44:24.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:44:24.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:44:24.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:44:24.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:44:24.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-05-29T15:44:24.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:44:24.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-05-29T15:44:24.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:44:24.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:44:24.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:44:24.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-05-29T15:44:27.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-05-29T15:44:27.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:44:27.716 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:44:27.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:44:27.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:44:27.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:44:27.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:44:27.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:44:27.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:44:27.736 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:44:27.737 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:44:27.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:44:27.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:44:27.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:44:27.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:44:27.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:44:27.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T15:44:27.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:44:28.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T15:44:28.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:44:28.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:44:28.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:44:28.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:44:28.065 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:44:02
2026-05-29T15:44:28.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72225, datetime.datetime(2026, 5, 29, 15, 44, 2), datetime.datetime(2026, 5, 29, 15, 44, 1), 'salt', 15.36, 46.24, None, 26.04, 36.47, 11.47, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:44:28.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:44:28.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:44:28.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:44:01, diff=27.071874s, valid=True
2026-05-29T15:44:28.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:44:28.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T15:44:28.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=136.074694s, valid=True
2026-05-29T15:44:28.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:44:28.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:44:28.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:43:58, diff=30.081334s, valid=True
2026-05-29T15:44:28.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:44:28.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:44:28.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:44:28.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:44:28.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:44:28.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T15:44:28.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=136.08437s, valid=True
2026-05-29T15:44:28.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:44:28.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:44:28.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:44:28.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994910.085046s, valid=True
2026-05-29T15:44:28.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:44:28.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:44:28.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:44:28.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:44:28.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:44:28.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:44:28.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:44:28.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:44:28.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:44:28.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:44:28.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:44:28.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:44:28.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:44:28.407 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:44:28.618 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:44:28.969 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:44:29.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:44:29.126 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:44:29.126 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:44:30.461 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:44:30.462 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:45:00.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:45:00.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:45:00.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:45:00.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:45:00.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:45:00.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:45:00.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-05-29T15:45:00.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:45:00.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-05-29T15:45:00.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:45:00.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:45:00.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:45: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-05-29T15:45:03.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T15:45:03.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:45:03.689 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:45:03.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:45:03.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:45:03.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:45:03.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:45:03.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:45:03.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:45:03.711 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:45:03.711 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:45:03.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:45:03.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:45:03.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:45:03.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:45:03.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:45:03.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:45:03.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:45:03.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:45:03.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:45:03.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:45:03.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:45:03.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:45:04.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:45:02
2026-05-29T15:45:04.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72227, datetime.datetime(2026, 5, 29, 15, 45, 2), datetime.datetime(2026, 5, 29, 15, 45, 2), 'salt', 15.26, 45.51, None, 24.45, 24.82, 11.69, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:45:04.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:45:04.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:45:04.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:45:02, diff=2.05485s, valid=True
2026-05-29T15:45:04.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:45:04.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:45:04.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=172.057865s, valid=True
2026-05-29T15:45:04.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:45:04.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:45:04.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:45:01, diff=3.06485s, valid=True
2026-05-29T15:45:04.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:45:04.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:45:04.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:45:04.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:45:04.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:45:04.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:45:04.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=172.068056s, valid=True
2026-05-29T15:45:04.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:45:04.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:45:04.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:45:04.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994946.0688s, valid=True
2026-05-29T15:45:04.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:45:04.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:45:04.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:45:04.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:45:04.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:45:04.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:45:04.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:45:04.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:45:04.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:45:04.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:45:04.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:45:04.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:45:04.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:45:04.402 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:45:04.608 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:45:04.944 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:45:05.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:45:05.043 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:45:05.044 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:45:05.315 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:45:05.315 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:45:35.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:45:35.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:45:35.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:45:35.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:45:35.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:45:35.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:45:35.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-05-29T15:45:35.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:45:35.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-05-29T15:45:35.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:45:35.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:45:35.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:45:35.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-05-29T15:45:38.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-05-29T15:45:38.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:45:38.444 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:45:38.444 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:45:38.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:45:38.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:45:38.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:45:38.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:45:38.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:45:38.464 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:45:38.465 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:45:38.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:45:38.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:45:38.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:45:38.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:45:38.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:45:38.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:45:38.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:45:38.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T15:45:38.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:45:38.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:45:38.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:45:38.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:45:38.797 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:45:32
2026-05-29T15:45:38.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72228, datetime.datetime(2026, 5, 29, 15, 45, 32), datetime.datetime(2026, 5, 29, 15, 45, 32), 'salt', 15.19, 45.9, None, 22.79, 22.99, 11.56, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:45:38.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:45:38.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:45:38.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:45:32, diff=6.803786s, valid=True
2026-05-29T15:45:38.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:45:38.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:45:38.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=206.806579s, valid=True
2026-05-29T15:45:38.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:45:38.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:45:38.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:45:27, diff=11.813232s, valid=True
2026-05-29T15:45:38.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:45:38.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:45:38.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:45:38.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:45:38.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:45:38.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T15:45:38.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=206.816218s, valid=True
2026-05-29T15:45:38.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:45:38.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:45:38.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:45:38.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=994980.816893s, valid=True
2026-05-29T15:45:38.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:45:38.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:45:38.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:45:38.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:45:38.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:45:38.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:45:38.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:45:38.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:45:38.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:45:38.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:45:39.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:45:39.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:45:39.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:45:39.151 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:45:39.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:45:39.805 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:45:39.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:45:39.930 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:45:39.930 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:45:40.098 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:45:40.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:46:10.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:46:10.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:46:10.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:46:10.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:46:10.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:46:10.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:46:10.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-05-29T15:46:10.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:46:10.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-05-29T15:46:10.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:46:10.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:46:10.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:46:10.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-05-29T15:46:13.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-05-29T15:46:13.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:46:13.301 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:46:13.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:46:13.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:46:13.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:46:13.323 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:46:13.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:46:13.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:46:13.323 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:46:13.323 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:46:13.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:46:13.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:46:13.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:46:13.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:46:13.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:46:13.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:46:13.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:46:13.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:46:13.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:46:13.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:46:13.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:46:13.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:46:13.659 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:46:03
2026-05-29T15:46:13.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72229, datetime.datetime(2026, 5, 29, 15, 46, 3), datetime.datetime(2026, 5, 29, 15, 46, 2), 'salt', 15.26, 46.27, None, 20.4, 22.05, 11.45, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:46:13.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:46:13.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:46:13.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:46:02, diff=11.665114s, valid=True
2026-05-29T15:46:13.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:46:13.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:46:13.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=241.667913s, valid=True
2026-05-29T15:46:13.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:46:13.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:46:13.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:45:57, diff=16.674563s, valid=True
2026-05-29T15:46:13.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:46:13.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:46:13.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:46:13.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:46:13.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:46:13.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:46:13.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=241.677554s, valid=True
2026-05-29T15:46:13.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:46:13.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:46:13.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:46:13.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995015.678216s, valid=True
2026-05-29T15:46:13.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:46:13.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:46:13.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:46:13.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:46:13.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:46:13.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:46:13.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:46:13.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:46:13.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:46:13.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:46:13.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:46:13.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:46:13.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:46:13.994 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:46:14.225 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:46:14.571 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:46:14.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:46:14.670 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:46:14.670 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:46:14.910 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:46:14.910 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:46:44.940 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:46:44.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:46:44.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:46:45.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:46:45.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:46:45.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:46:45.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-05-29T15:46:45.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:46:45.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-05-29T15:46:45.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:46:45.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:46:45.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:46:45.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-05-29T15:46:48.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-05-29T15:46:48.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:46:48.270 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:46:48.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:46:48.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:46:48.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:46:48.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:46:48.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:46:48.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:46:48.294 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:46:48.295 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:46:48.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:46:48.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:46:48.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:46:48.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:46:48.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:46:48.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:46:48.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:46:48.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:46:48.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:46:48.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:46:48.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:46:48.556 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:46:48.619 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:46:33
2026-05-29T15:46:48.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72230, datetime.datetime(2026, 5, 29, 15, 46, 33), datetime.datetime(2026, 5, 29, 15, 46, 32), 'salt', 15.13, 45.97, None, 17.4, 36.23, 11.54, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:46:48.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:46:48.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:46:48.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:46:32, diff=16.625763s, valid=True
2026-05-29T15:46:48.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:46:48.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:46:48.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=276.628611s, valid=True
2026-05-29T15:46:48.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:46:48.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:46:48.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:46:27, diff=21.63527s, valid=True
2026-05-29T15:46:48.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:46:48.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:46:48.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:46:48.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:46:48.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:46:48.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:46:48.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=276.638336s, valid=True
2026-05-29T15:46:48.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:46:48.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:46:48.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:46:48.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995050.639009s, valid=True
2026-05-29T15:46:48.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:46:48.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:46:48.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:46:48.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:46:48.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:46:48.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:46:48.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:46:48.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:46:48.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:46:48.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:46:48.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:46:48.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:46:48.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:46:49.026 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:46:49.235 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:46:49.575 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:46:49.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:46:49.675 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:46:49.675 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:46:49.945 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:46:49.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:47:19.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:47:19.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:47:19.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:47:20.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:47:20.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:47:20.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:47:20.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-05-29T15:47:20.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:47:20.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-05-29T15:47:20.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:47:20.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:47:20.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:47: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-05-29T15:47:23.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-05-29T15:47:23.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:47:23.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:47:23.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:47:23.339 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:47:23.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:47:23.351 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:47:23.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:47:23.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:47:23.351 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:47:23.351 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:47:23.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:47:23.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:47:23.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:47:23.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:47:23.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:47:23.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:47:23.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:47:23.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:47:23.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:47:23.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:47:23.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:47:23.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:47:23.686 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:47:03
2026-05-29T15:47:23.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72231, datetime.datetime(2026, 5, 29, 15, 47, 3), datetime.datetime(2026, 5, 29, 15, 47, 3), 'salt', 15.13, 46.2, None, 19.2, 37.76, 11.46, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:47:23.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:47:23.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:47:23.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:47:03, diff=20.692218s, valid=True
2026-05-29T15:47:23.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:47:23.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:47:23.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=311.695038s, valid=True
2026-05-29T15:47:23.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:47:23.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:47:23.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:46:58, diff=25.701867s, valid=True
2026-05-29T15:47:23.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:47:23.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:47:23.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:47:23.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:47:23.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:47:23.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:47:23.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:42:12, diff=311.704887s, valid=True
2026-05-29T15:47:23.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:47:23.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:47:23.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:47:23.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995085.705548s, valid=True
2026-05-29T15:47:23.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:47:23.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:47:23.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:47:23.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:47:23.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:47:23.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:47:23.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:47:23.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:47:23.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:47:23.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:47:23.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:47:23.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:47:23.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:47:24.021 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:47:24.227 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:47:24.570 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:47:24.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:47:24.669 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:47:24.669 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:47:24.927 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:47:24.927 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:47:54.934 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:47:54.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:47:54.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:47:55.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:47:55.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:47:55.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:47:55.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-05-29T15:47:55.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:47:55.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-05-29T15:47:55.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:47:55.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:47:55.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:47:55.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-05-29T15:47:58.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-05-29T15:47:58.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:47:58.225 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:47:58.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:47:58.234 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:47:58.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:47:58.250 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:47:58.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:47:58.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:47:58.251 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:47:58.251 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:47:58.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:47:58.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:47:58.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:47:58.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:47:58.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:47:58.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:47:58.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:47:58.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:47:58.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:47:58.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:47:58.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:47:58.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:47:58.559 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:47:33
2026-05-29T15:47:58.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72232, datetime.datetime(2026, 5, 29, 15, 47, 33), datetime.datetime(2026, 5, 29, 15, 47, 33), 'salt', 15.13, 47.13, None, 17.54, 23.62, 11.18, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:47:58.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:47:58.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:47:58.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:47:33, diff=25.565892s, valid=True
2026-05-29T15:47:58.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:47:58.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:47:58.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:48:12, diff=-13.431277s, valid=True
2026-05-29T15:47:58.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:47:58.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:47:58.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:47:28, diff=30.575408s, valid=True
2026-05-29T15:47:58.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:47:58.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:47:58.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:47:58.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:47:58.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:47:58.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:47:58.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:48:12, diff=-13.421616s, valid=True
2026-05-29T15:47:58.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:47:58.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:47:58.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:47:58.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995120.579045s, valid=True
2026-05-29T15:47:58.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:47:58.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:47:58.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:47:58.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:47:58.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:47:58.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:47:58.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:47:58.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:47:58.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:47:58.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:47:58.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:47:58.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:47:58.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:47:58.961 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:47:59.186 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:47:59.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:47:59.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:47:59.620 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:47:59.620 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:47:59.879 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:47:59.879 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:48:29.908 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:48:29.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:48:29.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:48:30.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:48:30.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:48:30.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:48:30.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-05-29T15:48:30.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:48:30.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T15:48:30.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:48:30.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:48:30.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:48:30.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-05-29T15:48:33.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-05-29T15:48:33.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:48:33.330 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:48:33.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:48:33.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:48:33.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:48:33.350 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:48:33.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:48:33.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:48:33.351 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:48:33.351 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:48:33.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:48:33.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:48:33.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:48:33.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:48:33.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:48:33.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:48:33.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:48:33.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:48:33.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:48:33.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:48:33.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:48:33.604 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:48:33.662 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:48:04
2026-05-29T15:48:33.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72233, datetime.datetime(2026, 5, 29, 15, 48, 4), datetime.datetime(2026, 5, 29, 15, 48, 3), 'salt', 15.19, 47.36, None, 12.39, 27.49, 11.11, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:48:33.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:48:33.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:48:33.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:48:03, diff=30.66911s, valid=True
2026-05-29T15:48:33.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:48:33.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:48:33.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:48:12, diff=21.672026s, valid=True
2026-05-29T15:48:33.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:48:33.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:48:33.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:47:59, diff=34.678771s, valid=True
2026-05-29T15:48:33.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:48:33.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:48:33.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:48:33.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:48:33.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:48:33.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:48:33.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:48:12, diff=21.681853s, valid=True
2026-05-29T15:48:33.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:48:33.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:48:33.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:48:33.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995155.682523s, valid=True
2026-05-29T15:48:33.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:48:33.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:48:33.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:48:33.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:48:33.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:48:33.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:48:33.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:48:33.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:48:33.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:48:33.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:48:33.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:48:33.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:48:33.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:48:33.999 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:48:34.229 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:48:34.572 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:48:34.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:48:34.671 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:48:34.671 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:48:34.742 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:48:34.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:49:04.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:49:04.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:49:04.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:49:05.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:49:05.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:49:05.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:49:05.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-05-29T15:49:05.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:49:05.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-05-29T15:49:05.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:49:05.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:49:05.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:49:05.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-05-29T15:49:08.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T15:49:08.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:49:08.375 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:49:08.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:49:08.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:49:08.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:49:08.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:49:08.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:49:08.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:49:08.397 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:49:08.397 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:49:08.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:49:08.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:49:08.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:49:08.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:49:08.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:49:08.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:49:08.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:49:08.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:49:08.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:49:08.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:49:08.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:49:08.657 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:49:08.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:49:04
2026-05-29T15:49:08.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72235, datetime.datetime(2026, 5, 29, 15, 49, 4), datetime.datetime(2026, 5, 29, 15, 49, 4), 'salt', 15.36, 46.27, None, 16.83, 32.76, 11.46, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:49:08.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:49:08.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:49:08.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:49:04, diff=4.721156s, valid=True
2026-05-29T15:49:08.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:49:08.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:49:08.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:49:12, diff=-3.27561s, valid=True
2026-05-29T15:49:08.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:49:08.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:49:08.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:49:02, diff=6.731405s, valid=True
2026-05-29T15:49:08.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:49:08.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:49:08.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:49:08.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:49:08.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:49:08.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:49:08.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:49:12, diff=-3.265515s, valid=True
2026-05-29T15:49:08.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:49:08.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:49:08.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:49:08.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995190.735163s, valid=True
2026-05-29T15:49:08.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:49:08.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:49:08.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:49:08.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:49:08.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:49:08.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:49:08.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:49:08.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:49:08.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:49:08.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:49:09.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:49:09.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:49:09.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:49:09.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:49:09.477 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:49:09.844 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:49:09.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:49:09.959 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:49:09.959 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:49:10.164 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:49:10.165 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:49:40.190 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:49:40.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:49:40.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:49:40.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:49:40.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:49:40.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:49:40.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T15:49:40.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:49:40.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-05-29T15:49:40.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:49:40.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:49:40.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:49:40.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T15:49:43.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-05-29T15:49:43.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:49:43.587 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:49:43.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:49:43.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:49:43.609 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:49:43.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:49:43.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:49:43.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:49:43.610 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:49:43.610 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:49:43.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:49:43.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:49:43.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:49:43.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:49:43.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:49:43.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:49:43.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:49:43.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:49:43.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:49:43.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:49:43.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:49:43.865 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:49:43.923 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:49:34
2026-05-29T15:49:43.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72236, datetime.datetime(2026, 5, 29, 15, 49, 34), datetime.datetime(2026, 5, 29, 15, 49, 34), 'salt', 15.26, 46.0, None, 25.12, 37.48, 11.53, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:49:43.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:49:43.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:49:43.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:49:34, diff=9.929641s, valid=True
2026-05-29T15:49:43.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:49:43.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:49:43.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:50:12, diff=-28.067476s, valid=True
2026-05-29T15:49:43.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:49:43.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:49:43.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:49:34, diff=9.939254s, valid=True
2026-05-29T15:49:43.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:49:43.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:49:43.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:49:43.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:49:43.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:49:43.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:49:43.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:50:12, diff=-28.057669s, valid=True
2026-05-29T15:49:43.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:49:43.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:49:43.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:49:43.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995225.943015s, valid=True
2026-05-29T15:49:43.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:49:43.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:49:43.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:49:43.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:49:43.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:49:44.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:49:44.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:49:44.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:49:44.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:49:44.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:49:44.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:49:44.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:49:44.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:49:44.258 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:49:44.464 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:49:44.805 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:49:44.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:49:44.904 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:49:44.904 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:49:47.035 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:49:47.036 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:50:17.066 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:50:17.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:50:17.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:50:17.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:50:17.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:50:17.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:50:17.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-05-29T15:50:17.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:50:17.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-05-29T15:50:17.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:50:17.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:50:17.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:50:17.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-05-29T15:50:20.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-05-29T15:50:20.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:50:20.221 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:50:20.221 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:50:20.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:50:20.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:50:20.243 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:50:20.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:50:20.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:50:20.243 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:50:20.243 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:50:20.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:50:20.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:50:20.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:50:20.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:50:20.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:50:20.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:50:20.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:50:20.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:50:20.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:50:20.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:50:20.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:50:20.601 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:50:20.678 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:50:04
2026-05-29T15:50:20.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72237, datetime.datetime(2026, 5, 29, 15, 50, 4), datetime.datetime(2026, 5, 29, 15, 50, 4), 'salt', 15.29, 45.87, None, 23.71, 40.78, 11.58, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:50:20.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:50:20.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:50:20.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:50:04, diff=16.685033s, valid=True
2026-05-29T15:50:20.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:50:20.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:50:20.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:50:12, diff=8.687838s, valid=True
2026-05-29T15:50:20.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:50:20.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:50:20.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:50:00, diff=20.694426s, valid=True
2026-05-29T15:50:20.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:50:20.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:50:20.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:50:20.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:50:20.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:50:20.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:50:20.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:50:12, diff=8.697408s, valid=True
2026-05-29T15:50:20.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:50:20.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:50:20.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:50:20.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995262.698071s, valid=True
2026-05-29T15:50:20.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:50:20.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:50:20.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:50:20.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:50:20.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:50:20.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:50:20.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:50:20.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:50:20.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:50:20.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:50:20.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:50:20.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:50:20.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:50:21.017 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:50:21.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:50:21.565 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:50:21.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:50:21.665 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:50:21.665 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:50:21.915 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:50:21.915 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:50:51.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:50:51.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:50:51.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:50:52.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:50:52.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:50:52.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:50:52.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-05-29T15:50:52.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:50:52.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-05-29T15:50:52.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:50:52.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:50:52.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:50:52.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-05-29T15:50:54.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-05-29T15:50:54.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:50:54.888 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:50:54.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:50:54.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:50:54.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:50:54.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:50:54.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:50:54.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:50:54.908 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:50:54.908 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:50:54.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:50:54.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:50:54.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:50:55.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:50:55.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:50:55.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:50:55.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:50:55.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:50:55.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:50:55.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:50:55.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:50:55.163 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:50:55.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:50:35
2026-05-29T15:50:55.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72238, datetime.datetime(2026, 5, 29, 15, 50, 35), datetime.datetime(2026, 5, 29, 15, 50, 34), 'salt', 15.13, 45.8, None, 25.09, 30.91, 11.59, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:50:55.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:50:55.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:50:55.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:50:34, diff=21.237415s, valid=True
2026-05-29T15:50:55.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:50:55.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:50:55.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:51:12, diff=-16.759756s, valid=True
2026-05-29T15:50:55.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:50:55.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:50:55.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:50:30, diff=25.246977s, valid=True
2026-05-29T15:50:55.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:50:55.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:50:55.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:50:55.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:50:55.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:50:55.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:50:55.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:51:12, diff=-16.750004s, valid=True
2026-05-29T15:50:55.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:50:55.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:50:55.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:50:55.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995297.250658s, valid=True
2026-05-29T15:50:55.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:50:55.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:50:55.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:50:55.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:50:55.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:50:55.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:50:55.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:50:55.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:50:55.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:50:55.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:50:55.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:50:55.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:50:55.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:50:55.565 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:50:55.782 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:50:56.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:50:56.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:50:56.231 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:50:56.231 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:50:56.498 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:50:56.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:51:26.519 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:51:26.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:51:26.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:51:26.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:51:26.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:51:27.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:51:27.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-05-29T15:51:27.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:51:27.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-05-29T15:51:27.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:51:27.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:51:27.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:51:27.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T15:51:29.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-05-29T15:51:29.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:51:29.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:51:29.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:51:29.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:51:29.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:51:29.784 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:51:29.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:51:29.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:51:29.784 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:51:29.784 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:51:29.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:51:29.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:51:29.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:51:29.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:51:29.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:51:30.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:51:30.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:51:30.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:51:30.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:51:30.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:51:30.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:51:30.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:51:30.142 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:51:05
2026-05-29T15:51:30.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72239, datetime.datetime(2026, 5, 29, 15, 51, 5), datetime.datetime(2026, 5, 29, 15, 51, 4), 'salt', 15.13, 46.3, None, 24.52, 32.6, 11.43, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:51:30.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:51:30.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:51:30.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:51:04, diff=26.148932s, valid=True
2026-05-29T15:51:30.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:51:30.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:51:30.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:51:12, diff=18.151835s, valid=True
2026-05-29T15:51:30.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:51:30.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:51:30.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:51:00, diff=30.158786s, valid=True
2026-05-29T15:51:30.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:51:30.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:51:30.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:51:30.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:51:30.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:51:30.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:51:30.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:51:12, diff=18.162054s, valid=True
2026-05-29T15:51:30.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:51:30.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:51:30.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:51:30.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995332.162738s, valid=True
2026-05-29T15:51:30.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:51:30.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:51:30.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:51:30.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:51:30.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:51:30.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:51:30.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:51:30.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:51:30.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:51:30.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:51:30.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:51:30.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:51:30.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:51:30.493 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:51:30.718 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:51:31.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:51:31.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:51:31.186 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:51:31.187 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:51:31.442 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:51:31.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:52:01.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:52:01.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:52:01.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:52:01.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:52:01.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:52:01.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:52:01.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-05-29T15:52:01.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:52:01.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-05-29T15:52:01.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:52:01.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:52:01.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:52:01.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-05-29T15:52:04.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-05-29T15:52:04.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:52:04.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:52:04.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:52:04.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:52:04.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:52:04.702 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:52:04.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:52:04.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:52:04.702 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:52:04.703 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:52:04.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:52:04.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:52:04.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:52:04.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:52:04.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:52:04.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:52:04.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:52:04.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:52:04.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:52:04.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:52:04.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:52:04.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:52:05.009 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:51:35
2026-05-29T15:52:05.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72240, datetime.datetime(2026, 5, 29, 15, 51, 35), datetime.datetime(2026, 5, 29, 15, 51, 35), 'salt', 15.09, 45.01, None, 26.78, 34.62, 11.82, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:52:05.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:52:05.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:52:05.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:51:35, diff=30.01594s, valid=True
2026-05-29T15:52:05.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:52:05.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:52:05.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:52:12, diff=-6.981252s, valid=True
2026-05-29T15:52:05.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:52:05.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:52:05.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:51:30, diff=35.025337s, valid=True
2026-05-29T15:52:05.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:52:05.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:52:05.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:52:05.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:52:05.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:52:05.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:52:05.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:52:12, diff=-6.971652s, valid=True
2026-05-29T15:52:05.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:52:05.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:52:05.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:52:05.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995367.029009s, valid=True
2026-05-29T15:52:05.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:52:05.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:52:05.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:52:05.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:52:05.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:52:05.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:52:05.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:52:05.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:52:05.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:52:05.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:52:05.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:52:05.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:52:05.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:52:05.346 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:52:05.620 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:52:05.969 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:52:06.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:52:06.070 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:52:06.070 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:52:06.327 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:52:06.328 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:52:36.350 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:52:36.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:52:36.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:52:36.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:52:36.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:52:36.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:52:36.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-05-29T15:52:36.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:52:36.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-05-29T15:52:36.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:52:36.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:52:36.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:52:36.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-05-29T15:52:39.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-05-29T15:52:39.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:52:39.431 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:52:39.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:52:39.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:52:39.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:52:39.452 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:52:39.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:52:39.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:52:39.453 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:52:39.453 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:52:39.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:52:39.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:52:39.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:52:39.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:52:39.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:52:39.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:52:39.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:52:39.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:52:39.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:52:39.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:52:39.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:52:39.716 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:52:39.778 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:52:35
2026-05-29T15:52:39.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72242, datetime.datetime(2026, 5, 29, 15, 52, 35), datetime.datetime(2026, 5, 29, 15, 52, 35), 'salt', 15.23, 44.71, None, 24.91, 36.02, 11.94, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:52:39.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:52:39.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:52:39.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:52:35, diff=4.784599s, valid=True
2026-05-29T15:52:39.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:52:39.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:52:39.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:53:12, diff=-32.212509s, valid=True
2026-05-29T15:52:39.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:52:39.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:52:39.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:52:32, diff=7.794356s, valid=True
2026-05-29T15:52:39.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:52:39.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:52:39.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:52:39.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:52:39.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:52:39.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:52:39.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:53:12, diff=-32.202553s, valid=True
2026-05-29T15:52:39.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:52:39.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:52:39.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:52:39.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995401.798121s, valid=True
2026-05-29T15:52:39.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:52:39.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:52:39.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:52:39.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:52:39.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:52:39.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:52:39.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:52:39.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:52:39.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:52:39.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:52:40.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:52:40.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:52:40.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:52:40.143 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:52:40.361 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:52:40.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:52:40.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:52:40.810 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:52:40.810 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:52:41.041 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:52:41.041 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:53:11.071 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:53:11.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:53:11.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:53:11.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:53:11.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:53:11.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:53:11.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-05-29T15:53:11.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:53:11.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-05-29T15:53:11.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:53:11.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:53:11.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:53:11.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T15:53:14.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-05-29T15:53:14.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:53:14.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:53:14.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:53:14.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:53:14.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:53:14.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:53:14.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:53:14.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:53:14.489 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:53:14.489 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:53:14.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:53:14.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:53:14.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:53:14.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:53:14.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:53:14.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:53:14.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:53:14.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:53:14.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:53:14.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:53:14.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:53:14.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:53:14.802 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:53:06
2026-05-29T15:53:14.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72243, datetime.datetime(2026, 5, 29, 15, 53, 6), datetime.datetime(2026, 5, 29, 15, 53, 5), 'salt', 15.16, 44.88, None, 25.3, 26.69, 11.88, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:53:14.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:53:14.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:53:14.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:53:05, diff=9.809123s, valid=True
2026-05-29T15:53:14.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:53:14.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:53:14.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:53:12, diff=2.81196s, valid=True
2026-05-29T15:53:14.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:53:14.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:53:14.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:53:03, diff=11.818759s, valid=True
2026-05-29T15:53:14.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:53:14.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:53:14.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:53:14.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:53:14.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:53:14.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:53:14.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:53:12, diff=2.821803s, valid=True
2026-05-29T15:53:14.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:53:14.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:53:14.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:53:14.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995436.82248s, valid=True
2026-05-29T15:53:14.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:53:14.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:53:14.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:53:14.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:53:14.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:53:14.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:53:14.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:53:14.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:53:14.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:53:14.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:53:15.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:53:15.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:53:15.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:53:15.137 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:53:15.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:53:15.774 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:53:15.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:53:15.877 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:53:15.877 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:53:16.027 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:53:16.027 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:53:46.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:53:46.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:53:46.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:53:46.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:53:46.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:53:46.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:53:46.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-05-29T15:53:46.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:53:46.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-05-29T15:53:46.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:53:46.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:53:46.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:53:46.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-05-29T15:53:49.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-05-29T15:53:49.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:53:49.385 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:53:49.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:53:49.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:53:49.405 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:53:49.405 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:53:49.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:53:49.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:53:49.405 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:53:49.405 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:53:49.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:53:49.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:53:49.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:53:49.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:53:49.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:53:49.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:53:49.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:53:49.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:53:49.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:53:49.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:53:49.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:53:49.657 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:53:49.716 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:53:36
2026-05-29T15:53:49.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72244, datetime.datetime(2026, 5, 29, 15, 53, 36), datetime.datetime(2026, 5, 29, 15, 53, 36), 'salt', 15.26, 44.78, None, 18.77, 33.16, 11.92, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:53:49.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:53:49.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:53:49.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:53:36, diff=13.722551s, valid=True
2026-05-29T15:53:49.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:53:49.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:53:49.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:54:12, diff=-22.274606s, valid=True
2026-05-29T15:53:49.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:53:49.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:53:49.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:53:35, diff=14.732227s, valid=True
2026-05-29T15:53:49.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:53:49.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:53:49.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:53:49.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:53:49.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:53:49.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:53:49.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:54:12, diff=-22.264714s, valid=True
2026-05-29T15:53:49.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:53:49.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:53:49.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:53:49.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995471.735967s, valid=True
2026-05-29T15:53:49.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:53:49.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:53:49.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:53:49.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:53:49.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:53:49.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:53:49.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:53:49.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:53:49.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:53:49.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:53:49.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:53:49.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:53:50.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:53:50.064 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:53:50.292 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:53:50.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:53:50.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:53:50.744 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:53:50.744 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:53:50.919 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:53:50.919 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:54:20.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:54:20.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:54:20.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:54:21.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:54:21.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:54:21.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:54:21.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-05-29T15:54:21.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:54:21.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-05-29T15:54:21.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:54:21.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:54:21.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:54:21.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-05-29T15:54:24.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-05-29T15:54:24.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:54:24.014 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:54:24.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:54:24.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:54:24.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:54:24.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:54:24.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:54:24.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:54:24.034 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:54:24.034 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:54:24.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:54:24.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:54:24.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:54:24.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:54:24.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:54:24.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:54:24.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:54:24.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:54:24.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:54:24.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:54:24.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:54:24.281 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:54:24.339 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:54:06
2026-05-29T15:54:24.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72245, datetime.datetime(2026, 5, 29, 15, 54, 6), datetime.datetime(2026, 5, 29, 15, 54, 6), 'salt', 15.29, 44.84, None, 26.64, 30.63, 11.9, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:54:24.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:54:24.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:54:24.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:54:06, diff=18.345531s, valid=True
2026-05-29T15:54:24.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:54:24.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:54:24.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:54:12, diff=12.34838s, valid=True
2026-05-29T15:54:24.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:54:24.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:54:24.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:54:02, diff=22.355121s, valid=True
2026-05-29T15:54:24.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:54:24.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:54:24.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:54:24.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:54:24.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:54:24.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:54:24.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:54:12, diff=12.358174s, valid=True
2026-05-29T15:54:24.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:54:24.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:54:24.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:54:24.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995506.358847s, valid=True
2026-05-29T15:54:24.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:54:24.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:54:24.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:54:24.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:54:24.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:54:24.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:54:24.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:54:24.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:54:24.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:54:24.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:54:24.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:54:24.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:54:24.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:54:24.744 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:54:24.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:54:25.310 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:54:25.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:54:25.411 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:54:25.411 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:54:25.699 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:54:25.699 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:54:55.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:54:55.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:54:55.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:54:55.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:54:55.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:54:56.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:54:56.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-05-29T15:54:56.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:54:56.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-05-29T15:54:56.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:54:56.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:54:56.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:54:56.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-05-29T15:54:58.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-05-29T15:54:58.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:54:58.811 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:54:58.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:54:58.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:54:58.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:54:58.831 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:54:58.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:54:58.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:54:58.832 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:54:58.832 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:54:58.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:54:58.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:54:58.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:54:59.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:54:59.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:54:59.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:54:59.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:54:59.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:54:59.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:54:59.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:54:59.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:54:59.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:54:59.149 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:54:36
2026-05-29T15:54:59.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72246, datetime.datetime(2026, 5, 29, 15, 54, 36), datetime.datetime(2026, 5, 29, 15, 54, 36), 'salt', 15.19, 44.21, None, 22.79, 34.99, 12.09, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:54:59.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:54:59.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:54:59.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:54:36, diff=23.155511s, valid=True
2026-05-29T15:54:59.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:54:59.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:54:59.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:55:12, diff=-12.841573s, valid=True
2026-05-29T15:54:59.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:54:59.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:54:59.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:54:32, diff=27.165224s, valid=True
2026-05-29T15:54:59.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:54:59.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:54:59.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:54:59.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:54:59.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:54:59.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:54:59.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:55:12, diff=-12.831676s, valid=True
2026-05-29T15:54:59.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:54:59.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:54:59.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:54:59.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995541.169009s, valid=True
2026-05-29T15:54:59.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:54:59.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:54:59.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:54:59.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:54:59.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:54:59.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:54:59.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:54:59.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:54:59.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:54:59.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:54:59.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:54:59.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:54:59.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:54:59.485 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:54:59.701 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:55:00.102 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:55:00.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:55:00.206 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:55:00.206 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:55:00.361 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:55:00.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:55:30.379 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:55:30.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:55:30.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:55:30.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:55:30.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:55:30.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:55:30.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-05-29T15:55:30.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:55:30.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-05-29T15:55:30.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:55:30.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:55:30.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:55:30.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-05-29T15:55:33.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-05-29T15:55:33.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:55:33.650 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:55:33.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:55:33.656 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:55:33.669 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:55:33.669 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:55:33.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:55:33.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:55:33.669 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:55:33.669 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:55:33.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:55:33.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:55:33.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:55:33.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:55:33.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:55:33.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:55:33.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:55:33.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:55:33.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:55:33.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:55:33.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:55:33.929 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:55:33.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:55:07
2026-05-29T15:55:33.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72247, datetime.datetime(2026, 5, 29, 15, 55, 7), datetime.datetime(2026, 5, 29, 15, 55, 6), 'salt', 15.19, 44.71, None, 24.14, 40.08, 11.93, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:55:33.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:55:33.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:55:33.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:55:06, diff=27.993869s, valid=True
2026-05-29T15:55:33.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:55:33.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:55:33.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:55:12, diff=21.996706s, valid=True
2026-05-29T15:55:33.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:55:33.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:55:34.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:55:03, diff=31.003368s, valid=True
2026-05-29T15:55:34.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:55:34.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:55:34.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:55:34.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:55:34.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:55:34.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:55:34.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:55:12, diff=22.006372s, valid=True
2026-05-29T15:55:34.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:55:34.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:55:34.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:55:34.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995576.007045s, valid=True
2026-05-29T15:55:34.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:55:34.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:55:34.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:55:34.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:55:34.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:55:34.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:55:34.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:55:34.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:55:34.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:55:34.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:55:34.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:55:34.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:55:34.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:55:34.393 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:55:34.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:55:34.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:55:35.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:55: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-05-29T15:55: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-05-29T15:55:35.224 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:55:35.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:56:05.254 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:56:05.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:56:05.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:56:05.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:56:05.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:56:05.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:56:05.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-05-29T15:56:05.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:56:05.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-05-29T15:56:05.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:56:05.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:56:05.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:56:05.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-05-29T15:56:08.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-05-29T15:56:08.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:56:08.353 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:56:08.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:56:08.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:56:08.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:56:08.374 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:56:08.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:56:08.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:56:08.374 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:56:08.374 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:56:08.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:56:08.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:56:08.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:56:08.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:56:08.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:56:08.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:56:08.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:56:08.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:56:08.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:56:08.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:56:08.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:56:08.636 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:56:08.693 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:56:07
2026-05-29T15:56:08.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72249, datetime.datetime(2026, 5, 29, 15, 56, 7), datetime.datetime(2026, 5, 29, 15, 56, 7), 'salt', 15.26, 44.41, None, 19.55, 35.81, 12.03, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:56:08.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:56:08.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:56:08.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:56:07, diff=1.699974s, valid=True
2026-05-29T15:56:08.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:56:08.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:56:08.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:56:12, diff=-3.297204s, valid=True
2026-05-29T15:56:08.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:56:08.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:56:08.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:56:03, diff=5.709593s, valid=True
2026-05-29T15:56:08.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:56:08.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:56:08.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:56:08.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:56:08.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:56:08.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:56:08.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:56:12, diff=-3.287346s, valid=True
2026-05-29T15:56:08.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:56:08.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:56:08.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:56:08.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995610.713313s, valid=True
2026-05-29T15:56:08.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:56:08.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:56:08.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:56:08.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:56:08.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:56:08.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:56:08.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:56:08.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:56:08.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:56:08.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:56:08.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:56:08.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:56:08.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:56:09.032 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:56:09.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:56:09.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:56:09.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:56:09.704 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:56:09.705 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:56:09.889 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:56:09.889 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:56:39.918 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:56:39.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:56:39.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:56:40.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:56:40.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:56:40.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:56:40.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-05-29T15:56:40.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:56:40.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-05-29T15:56:40.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:56:40.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:56:40.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:56:40.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-05-29T15:56:43.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-05-29T15:56:43.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:56:43.475 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:56:43.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:56:43.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:56:43.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:56:43.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:56:43.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:56:43.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:56:43.496 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:56:43.496 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:56:43.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:56:43.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:56:43.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:56:43.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:56:43.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:56:43.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:56:43.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:56:43.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:56:43.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:56:43.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:56:43.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:56:43.767 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:56:43.829 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:56:37
2026-05-29T15:56:43.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72250, datetime.datetime(2026, 5, 29, 15, 56, 37), datetime.datetime(2026, 5, 29, 15, 56, 37), 'salt', 15.36, 44.45, None, 15.74, 41.46, 12.03, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:56:43.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:56:43.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:56:43.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:56:37, diff=6.835726s, valid=True
2026-05-29T15:56:43.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:56:43.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:56:43.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:57:12, diff=-28.161517s, valid=True
2026-05-29T15:56:43.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:56:43.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:56:43.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:56:33, diff=10.844983s, valid=True
2026-05-29T15:56:43.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:56:43.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:56:43.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:56:43.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:56:43.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:56:43.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:56:43.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:57:12, diff=-28.15204s, valid=True
2026-05-29T15:56:43.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:56:43.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:56:43.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:56:43.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995645.848625s, valid=True
2026-05-29T15:56:43.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:56:43.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:56:43.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:56:43.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:56:43.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:56:43.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:56:43.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:56:43.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:56:43.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:56:43.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:56:44.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:56:44.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:56:44.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:56:44.163 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:56:44.378 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:56:44.726 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:56:44.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:56:44.827 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:56:44.827 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:56:47.123 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:56:47.123 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:57:17.153 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:57:17.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:57:17.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:57:17.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:57:17.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:57:17.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:57:17.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-05-29T15:57:17.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:57:17.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-05-29T15:57:17.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:57:17.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:57:17.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:57:17.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T15:57:20.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-05-29T15:57:20.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:57:20.276 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:57:20.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:57:20.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:57:20.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:57:20.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:57:20.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:57:20.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:57:20.299 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:57:20.299 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:57:20.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:57:20.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:57:20.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:57:20.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:57:20.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:57:20.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:57:20.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:57:20.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:57:20.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:57:20.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:57:20.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:57:20.574 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:57:20.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:57:07
2026-05-29T15:57:20.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72251, datetime.datetime(2026, 5, 29, 15, 57, 7), datetime.datetime(2026, 5, 29, 15, 57, 7), 'salt', 15.19, 44.71, None, 24.21, 47.65, 11.93, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:57:20.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:57:20.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:57:20.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:57:07, diff=13.640273s, valid=True
2026-05-29T15:57:20.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:57:20.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:57:20.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:57:12, diff=8.643355s, valid=True
2026-05-29T15:57:20.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:57:20.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:57:20.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:57:04, diff=16.650262s, valid=True
2026-05-29T15:57:20.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:57:20.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:57:20.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:57:20.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:57:20.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:57:20.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:57:20.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:57:12, diff=8.653351s, valid=True
2026-05-29T15:57:20.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:57:20.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:57:20.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:57:20.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995682.654017s, valid=True
2026-05-29T15:57:20.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:57:20.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:57:20.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:57:20.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:57:20.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:57:20.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:57:20.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:57:20.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:57:20.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:57:20.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:57:20.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:57:20.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:57:20.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:57:20.996 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:57:21.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:57:21.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:57:21.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:57:21.753 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:57:21.753 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:57:21.976 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:57:21.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:57:52.005 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:57:52.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:57:52.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:57:52.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:57:52.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:57:52.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:57: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-05-29T15:57:52.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:57: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-05-29T15:57:52.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:57:52.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:57:52.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:57: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-05-29T15:57:55.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-05-29T15:57:55.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:57:55.093 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:57:55.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:57:55.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:57:55.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:57:55.115 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:57:55.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:57:55.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:57:55.115 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:57:55.115 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:57:55.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:57:55.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:57:55.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:57:55.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:57:55.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:57:55.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:57:55.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:57:55.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:57:55.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:57:55.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:57:55.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:57:55.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:57:55.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:57:38
2026-05-29T15:57:55.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72252, datetime.datetime(2026, 5, 29, 15, 57, 38), datetime.datetime(2026, 5, 29, 15, 57, 37), 'salt', 15.13, 44.38, None, 20.11, 40.6, 12.03, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:57:55.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:57:55.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:57:55.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:57:37, diff=18.449271s, valid=True
2026-05-29T15:57:55.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:57:55.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:57:55.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:58:12, diff=-16.547914s, valid=True
2026-05-29T15:57:55.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:57:55.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:57:55.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:57:35, diff=20.458855s, valid=True
2026-05-29T15:57:55.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:57:55.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:57:55.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:57:55.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:57:55.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:57:55.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:57:55.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:58:12, diff=-16.538118s, valid=True
2026-05-29T15:57:55.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:57:55.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:57:55.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:57:55.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995717.462556s, valid=True
2026-05-29T15:57:55.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:57:55.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:57:55.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:57:55.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:57:55.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:57:55.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:57:55.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:57:55.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:57:55.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:57:55.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:57:55.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:57:55.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:57:55.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:57:55.780 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:57:55.996 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:57:56.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:57:56.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:57:56.447 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:57:56.448 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:57:56.693 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:57:56.693 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:58:26.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:58:26.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:58:26.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:58:26.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:58:26.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:58:27.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:58:27.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-05-29T15:58:27.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:58:27.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-05-29T15:58:27.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:58:27.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:58:27.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:58:27.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-05-29T15:58:30.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-05-29T15:58:30.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:58:30.778 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:58:30.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:58:30.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:58:30.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:58:30.798 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:58:30.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:58:30.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:58:30.799 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:58:30.799 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:58:30.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:58:30.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:58:30.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:58:30.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:58:30.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:58:31.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:58:31.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:58:31.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:58:31.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:58:31.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:58:31.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:58:31.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:58:31.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:58:08
2026-05-29T15:58:31.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72253, datetime.datetime(2026, 5, 29, 15, 58, 8), datetime.datetime(2026, 5, 29, 15, 58, 7), 'salt', 15.23, 43.82, None, 19.76, 43.71, 12.22, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:58:31.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:58:31.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:58:31.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:58:07, diff=24.144779s, valid=True
2026-05-29T15:58:31.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:58:31.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:58:31.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:58:12, diff=19.147671s, valid=True
2026-05-29T15:58:31.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:58:31.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:58:31.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:58:07, diff=24.154554s, valid=True
2026-05-29T15:58:31.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:58:31.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:58:31.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:58:31.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:58:31.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:58:31.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:58:31.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:58:12, diff=19.157649s, valid=True
2026-05-29T15:58:31.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:58:31.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:58:31.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:58:31.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995753.158387s, valid=True
2026-05-29T15:58:31.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:58:31.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:58:31.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:58:31.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:58:31.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:58:31.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:58:31.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:58:31.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:58:31.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:58:31.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:58:31.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:58:31.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:58:31.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:58:31.490 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:58:31.706 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:58:32.122 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:58:32.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:58:32.224 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:58:32.224 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:58:32.494 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:58:32.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:59:02.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:59:02.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:59:02.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:59:02.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:59:02.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:59:03.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:59:03.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-05-29T15:59:03.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:59:03.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-05-29T15:59:03.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:59:03.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:59:03.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:59: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-05-29T15:59:05.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-05-29T15:59:05.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:59:05.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:59:05.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:59:05.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:59:05.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:59:05.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:59:05.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:59:05.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:59:05.737 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:59:05.737 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:59:05.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:59:05.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T15:59:05.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:59:05.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T15:59:05.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:59:05.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:59:05.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:59:05.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T15:59:05.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:59:06.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:59:06.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:59:06.002 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:59:06.065 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:58:38
2026-05-29T15:59:06.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72254, datetime.datetime(2026, 5, 29, 15, 58, 38), datetime.datetime(2026, 5, 29, 15, 58, 38), 'salt', 15.19, 43.95, None, 21.21, 44.02, 12.17, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:59:06.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:59:06.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T15:59:06.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:58:38, diff=28.07113s, valid=True
2026-05-29T15:59:06.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:59:06.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:59:06.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:59:12, diff=-5.926055s, valid=True
2026-05-29T15:59:06.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:59:06.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T15:59:06.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:58:34, diff=32.080638s, valid=True
2026-05-29T15:59:06.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:59:06.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:59:06.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:59:06.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:59:06.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:59:06.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T15:59:06.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:59:12, diff=-5.916313s, valid=True
2026-05-29T15:59:06.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:59:06.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:59:06.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:59:06.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995788.084347s, valid=True
2026-05-29T15:59:06.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:59:06.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:59:06.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:59:06.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:59:06.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:59:06.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:59:06.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:59:06.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:59:06.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:59:06.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:59:06.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:59:06.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:59:06.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:59:06.398 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:59:06.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:59:06.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:59:07.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:59:07.059 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:59:07.059 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:59:07.329 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:59:07.329 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T15:59:37.358 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T15:59:37.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T15:59:37.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T15:59:37.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T15:59:37.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T15:59:37.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T15:59:37.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-05-29T15:59:37.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T15:59:37.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-05-29T15:59:37.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T15:59:37.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T15:59:37.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T15:59:37.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-05-29T15:59:40.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-05-29T15:59:40.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T15:59:40.977 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T15:59:40.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T15:59:40.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T15:59:40.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T15:59:40.996 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T15:59:40.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T15:59:40.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T15:59:40.997 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T15:59:40.997 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T15:59:41.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T15:59:41.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T15:59:41.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T15:59:41.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T15:59:41.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:59:41.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:59:41.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T15:59:41.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T15:59:41.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T15:59:41.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T15:59:41.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T15:59:41.256 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T15:59:41.319 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 15:59:39
2026-05-29T15:59:41.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72256, datetime.datetime(2026, 5, 29, 15, 59, 39), datetime.datetime(2026, 5, 29, 15, 59, 38), 'salt', 15.13, 42.49, None, 27.2, 35.13, 12.65, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T15:59:41.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T15:59:41.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T15:59:41.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:59:38, diff=3.325232s, valid=True
2026-05-29T15:59:41.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T15:59:41.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:59:41.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:00:12, diff=-30.671887s, valid=True
2026-05-29T15:59:41.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T15:59:41.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T15:59:41.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 15:59:35, diff=6.334959s, valid=True
2026-05-29T15:59:41.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T15:59:41.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:59:41.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T15:59:41.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T15:59:41.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T15:59:41.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T15:59:41.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:00:12, diff=-30.661987s, valid=True
2026-05-29T15:59:41.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T15:59:41.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T15:59:41.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T15:59:41.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995823.338704s, valid=True
2026-05-29T15:59:41.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T15:59:41.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T15:59:41.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T15:59:41.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T15:59:41.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T15:59:41.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T15:59:41.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T15:59:41.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T15:59:41.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T15:59:41.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T15:59:41.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T15:59:41.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T15:59:41.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T15:59:41.736 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T15:59:41.953 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:59:42.304 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T15:59:42.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T15:59:42.405 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T15:59:42.405 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T15:59:42.683 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T15:59:42.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:00:12.696 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:00:12.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:00:12.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:00:12.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:00:12.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:00:13.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:00: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-05-29T16:00:13.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:00:13.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-05-29T16:00:13.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:00:13.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:00:13.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:00:13.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T16:00:15.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T16:00:15.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:00:15.872 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:00:15.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:00:15.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:00:15.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:00:15.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:00:15.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:00:15.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:00:15.901 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:00:15.901 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:00:15.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:00:15.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:00:15.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:00:16.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:00:16.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:00:16.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:00:16.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:00:16.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:00:16.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:00:16.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:00:16.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:00:16.158 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:00:16.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:00:10
2026-05-29T16:00:16.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72257, datetime.datetime(2026, 5, 29, 16, 0, 10), datetime.datetime(2026, 5, 29, 16, 0, 9), 'salt', 15.23, 42.22, None, 22.58, 30.61, 12.75, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:00:16.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:00:16.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:00:16.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:00:09, diff=7.237816s, valid=True
2026-05-29T16:00:16.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:00:16.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:00:16.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:00:12, diff=4.240665s, valid=True
2026-05-29T16:00:16.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:00:16.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:00:16.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:00:06, diff=10.247209s, valid=True
2026-05-29T16:00:16.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:00:16.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:00:16.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:00:16.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:00:16.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:00:16.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:00:16.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:00:12, diff=4.250223s, valid=True
2026-05-29T16:00:16.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:00:16.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:00:16.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:00:16.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995858.250896s, valid=True
2026-05-29T16:00:16.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:00:16.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:00:16.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:00:16.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:00:16.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:00:16.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:00:16.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:00:16.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:00:16.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:00:16.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:00:16.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:00:16.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:00:16.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:00:16.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:00:16.802 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:00:17.147 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:00:17.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:00:17.247 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:00:17.247 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:00:17.463 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:00:17.463 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:00:47.470 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:00:47.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:00:47.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:00:47.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:00:47.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:00:48.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:00:48.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T16:00:48.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:00:48.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-05-29T16:00:48.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:00:48.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:00:48.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:00:48.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-05-29T16:00:51.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-05-29T16:00:51.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:00:51.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:00:51.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:00:51.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:00:51.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:00:51.732 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:00:51.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:00:51.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:00:51.733 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:00:51.733 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:00:51.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:00:51.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:00:51.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:00:51.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:00:51.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:00:51.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:00:51.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:00:51.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:00:51.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:00:51.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:00:51.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:00:51.993 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:00:52.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:00:40
2026-05-29T16:00:52.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72258, datetime.datetime(2026, 5, 29, 16, 0, 40), datetime.datetime(2026, 5, 29, 16, 0, 39), 'salt', 15.09, 42.26, None, 23.22, 30.3, 12.71, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:00:52.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:00:52.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:00:52.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:00:39, diff=13.060666s, valid=True
2026-05-29T16:00:52.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:00:52.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:00:52.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:01:12, diff=-19.936489s, valid=True
2026-05-29T16:00:52.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:00:52.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:00:52.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:00:36, diff=16.070174s, valid=True
2026-05-29T16:00:52.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:00:52.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:00:52.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:00:52.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:00:52.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:00:52.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:00:52.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:01:12, diff=-19.926766s, valid=True
2026-05-29T16:00:52.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:00:52.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:00:52.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:00:52.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995894.073898s, valid=True
2026-05-29T16:00:52.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:00:52.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:00:52.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:00:52.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:00:52.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:00:52.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:00:52.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:00:52.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:00:52.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:00:52.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:00:52.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:00:52.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:00:52.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:00:52.455 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:00:52.668 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:00:53.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:00:53.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:00:53.115 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:00:53.115 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:00:53.324 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:00:53.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:01:23.354 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:01:23.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:01:23.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:01:23.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:01:23.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:01:23.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:01:23.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-05-29T16:01:23.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:01: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-05-29T16:01:23.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:01:23.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:01:23.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:01:23.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-05-29T16:01:26.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-05-29T16:01:26.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:01:26.876 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:01:26.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:01:26.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:01:26.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:01:26.897 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:01:26.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:01:26.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:01:26.897 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:01:26.897 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:01:26.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:01:26.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:01:26.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:01:27.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:01:27.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:01:27.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:01:27.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:01:27.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:01:27.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:01:27.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:01:27.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:01:27.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:01:27.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:01:10
2026-05-29T16:01:27.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72259, datetime.datetime(2026, 5, 29, 16, 1, 10), datetime.datetime(2026, 5, 29, 16, 1, 10), 'salt', 15.23, 42.62, None, 20.43, 29.36, 12.61, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:01:27.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:01:27.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:01:27.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:01:10, diff=17.225633s, valid=True
2026-05-29T16:01:27.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:01:27.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:01:27.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:01:12, diff=15.228439s, valid=True
2026-05-29T16:01:27.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:01:27.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:01:27.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:01:06, diff=21.235048s, valid=True
2026-05-29T16:01:27.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:01:27.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:01:27.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:01:27.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:01:27.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:01:27.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:01:27.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:01:12, diff=15.238077s, valid=True
2026-05-29T16:01:27.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:01:27.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:01:27.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:01:27.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995929.238741s, valid=True
2026-05-29T16:01:27.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:01:27.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:01:27.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:01:27.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:01:27.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:01:27.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:01:27.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:01:27.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:01:27.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:01:27.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:01:27.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:01:27.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:01:27.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:01:27.555 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:01:27.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:01:28.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:01:28.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:01:28.216 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:01:28.216 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:01:28.284 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:01:28.284 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:01:58.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:01:58.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:01:58.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:01:58.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:01:58.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:01:58.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:01:58.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-05-29T16:01:58.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:01:58.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-05-29T16:01:58.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:01:58.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:01:58.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:01:58.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-05-29T16:02:01.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-05-29T16:02:01.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:02:01.503 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:02:01.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:02:01.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:02:01.523 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:02:01.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:02:01.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:02:01.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:02:01.524 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:02:01.524 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:02:01.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:02:01.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:02:01.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:02:01.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:02:01.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:02:01.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:02:01.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:02:01.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:02:01.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:02:01.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:02:01.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:02:01.791 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:02:01.848 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:01:40
2026-05-29T16:02:01.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72260, datetime.datetime(2026, 5, 29, 16, 1, 40), datetime.datetime(2026, 5, 29, 16, 1, 40), 'salt', 15.29, 43.75, None, 19.48, 23.76, 12.25, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:02:01.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:02:01.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:02:01.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:01:40, diff=21.854839s, valid=True
2026-05-29T16:02:01.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:02:01.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:02:01.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:02:12, diff=-10.142342s, valid=True
2026-05-29T16:02:01.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:02:01.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:02:01.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:01:37, diff=24.864245s, valid=True
2026-05-29T16:02:01.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:02:01.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:02:01.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:02:01.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:02:01.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:02:01.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:02:01.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:02:12, diff=-10.132775s, valid=True
2026-05-29T16:02:01.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:02:01.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:02:01.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:02:01.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=995963.867879s, valid=True
2026-05-29T16:02:01.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:02:01.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:02:01.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:02:01.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:02:01.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:02:01.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:02:01.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:02:01.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:02:01.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:02:02.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:02:02.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:02:02.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:02:02.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:02:02.247 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:02:02.463 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:02:02.809 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:02:02.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:02:02.909 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:02:02.910 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:02:04.840 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:02:04.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:02:34.865 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:02:34.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:02:34.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:02:35.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:02:35.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:02:35.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:02:35.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-05-29T16:02:35.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:02:35.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-05-29T16:02:35.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:02:35.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:02:35.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:02:35.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-05-29T16:02:38.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-05-29T16:02:38.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:02:38.230 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:02:38.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:02:38.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:02:38.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:02:38.256 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:02:38.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:02:38.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:02:38.256 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:02:38.256 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:02:38.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:02:38.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:02:38.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:02:38.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:02:38.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:02:38.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:02:38.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:02:38.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:02:38.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:02:38.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:02:38.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:02:38.519 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:02:38.580 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:02:11
2026-05-29T16:02:38.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72261, datetime.datetime(2026, 5, 29, 16, 2, 11), datetime.datetime(2026, 5, 29, 16, 2, 10), 'salt', 15.29, 43.25, None, 26.39, 29.32, 12.41, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:02:38.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:02:38.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:02:38.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:02:10, diff=28.586281s, valid=True
2026-05-29T16:02:38.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:02:38.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:02:38.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:02:12, diff=26.589122s, valid=True
2026-05-29T16:02:38.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:02:38.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:02:38.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:02:08, diff=30.595953s, valid=True
2026-05-29T16:02:38.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:02:38.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:02:38.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:02:38.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:02:38.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:02:38.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:02:38.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:02:12, diff=26.598992s, valid=True
2026-05-29T16:02:38.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:02:38.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:02:38.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:02:38.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996000.59967s, valid=True
2026-05-29T16:02:38.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:02:38.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:02:38.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:02:38.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:02:38.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:02:38.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:02:38.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:02:38.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:02:38.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:02:38.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:02:38.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:02:38.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:02:38.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:02:38.915 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:02:39.129 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:02:39.477 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:02:39.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:02:39.579 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:02:39.579 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:02:39.860 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:02:39.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:03:09.876 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:03:09.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:03:09.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:03:10.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:03:10.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:03:10.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:03:10.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-05-29T16:03:10.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:03:10.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-05-29T16:03:10.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:03:10.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:03:10.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:03:10.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-05-29T16:03:13.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-05-29T16:03:13.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:03:13.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:03:13.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:03:13.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:03:13.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:03:13.327 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:03:13.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:03:13.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:03:13.327 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:03:13.327 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:03:13.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:03:13.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:03:13.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:03:13.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:03:13.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:03:13.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:03:13.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:03:13.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:03:13.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:03:13.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:03:13.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:03:13.581 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:03:13.640 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:03:11
2026-05-29T16:03:13.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72263, datetime.datetime(2026, 5, 29, 16, 3, 11), datetime.datetime(2026, 5, 29, 16, 3, 11), 'salt', 15.29, 42.52, None, 21.7, 31.24, 12.65, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:03:13.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:03:13.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:03:13.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:03:11, diff=2.6466s, valid=True
2026-05-29T16:03:13.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:03:13.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:03:13.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:03:12, diff=1.649455s, valid=True
2026-05-29T16:03:13.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:03:13.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:03:13.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:03:07, diff=6.656091s, valid=True
2026-05-29T16:03:13.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:03:13.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:03:13.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:03:13.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:03:13.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:03:13.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:03:13.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:03:12, diff=1.659089s, valid=True
2026-05-29T16:03:13.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:03:13.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:03:13.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:03:13.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996035.659751s, valid=True
2026-05-29T16:03:13.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:03:13.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:03:13.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:03:13.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:03:13.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:03:13.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:03:13.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:03:13.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:03:13.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:03:13.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:03:13.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:03:13.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:03:13.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:03:13.973 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:03:14.212 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:03:14.561 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:03:14.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:03:14.662 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:03:14.662 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:03:14.836 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:03:14.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:03:44.866 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:03:44.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:03:44.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:03:45.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:03:45.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:03:45.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:03:45.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-05-29T16:03:45.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:03:45.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T16:03:45.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:03:45.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:03:45.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:03:45.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-05-29T16:03:47.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-05-29T16:03:47.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:03:47.971 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:03:47.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:03:47.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:03:47.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:03:47.985 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:03:47.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:03:47.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:03:47.985 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:03:47.985 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:03:47.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:03:48.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:03:48.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:03:48.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:03:48.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:03:48.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:03:48.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:03:48.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:03:48.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:03:48.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:03:48.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:03:48.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:03:48.301 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:03:41
2026-05-29T16:03:48.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72264, datetime.datetime(2026, 5, 29, 16, 3, 41), datetime.datetime(2026, 5, 29, 16, 3, 41), 'salt', 15.32, 42.22, None, 20.82, 37.06, 12.75, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:03:48.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:03:48.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:03:48.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:03:41, diff=7.307858s, valid=True
2026-05-29T16:03:48.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:03:48.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:03:48.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:04:12, diff=-23.689325s, valid=True
2026-05-29T16:03:48.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:03:48.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:03:48.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:03:38, diff=10.317479s, valid=True
2026-05-29T16:03:48.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:03:48.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:03:48.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:03:48.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:03:48.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:03:48.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:03:48.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:04:12, diff=-23.679473s, valid=True
2026-05-29T16:03:48.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:03:48.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:03:48.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:03:48.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996070.321206s, valid=True
2026-05-29T16:03:48.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:03:48.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:03:48.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:03:48.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:03:48.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:03:48.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:03:48.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:03:48.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:03:48.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:03:48.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:03:48.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:03:48.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:03:48.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:03:48.642 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:03:48.898 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:03:49.310 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:03:49.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:03:49.411 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:03:49.411 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:03:49.584 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:03:49.584 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:04:19.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:04:19.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:04:19.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:04:19.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:04:19.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:04:20.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:04: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-05-29T16:04:20.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:04:20.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-05-29T16:04:20.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:04:20.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:04:20.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:04:20.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-05-29T16:04:22.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-05-29T16:04:22.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:04:22.973 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:04:22.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:04:22.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:04:22.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:04:22.994 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:04:22.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:04:22.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:04:22.994 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:04:22.994 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:04:23.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:04:23.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:04:23.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:04:23.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:04:23.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:04:23.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:04:23.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:04:23.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:04:23.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:04:23.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:04:23.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:04:23.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:04:23.311 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:04:11
2026-05-29T16:04:23.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72265, datetime.datetime(2026, 5, 29, 16, 4, 11), datetime.datetime(2026, 5, 29, 16, 4, 11), 'salt', 15.23, 42.62, None, 19.9, 41.46, 12.61, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:04:23.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:04:23.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:04:23.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:04:11, diff=12.317957s, valid=True
2026-05-29T16:04:23.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:04:23.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:04:23.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:04:12, diff=11.320787s, valid=True
2026-05-29T16:04:23.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:04:23.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:04:23.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:04:08, diff=15.327544s, valid=True
2026-05-29T16:04:23.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:04:23.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:04:23.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:04:23.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:04:23.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:04:23.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:04:23.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:04:12, diff=11.330539s, valid=True
2026-05-29T16:04:23.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:04:23.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:04:23.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:04:23.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996105.331205s, valid=True
2026-05-29T16:04:23.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:04:23.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:04:23.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:04:23.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:04:23.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:04:23.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:04:23.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:04:23.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:04:23.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:04:23.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:04:23.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:04:23.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:04:23.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:04:23.644 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:04:23.857 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:04:24.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:04:24.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:04:24.302 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:04:24.302 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:04:24.513 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:04:24.514 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:04:54.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:04:54.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:04:54.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:04:54.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:04:54.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:04:54.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:04:54.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-05-29T16:04:54.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:04:54.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-05-29T16:04:55.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:04:55.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:04:55.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:04:55.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-05-29T16:04:57.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-05-29T16:04:57.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:04:57.507 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:04:57.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:04:57.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:04:57.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:04:57.537 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:04:57.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:04:57.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:04:57.538 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:04:57.538 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:04:57.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:04:57.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:04:57.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:04:57.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:04:57.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:04:57.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:04:57.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:04:57.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:04:57.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:04:57.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:04:57.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:04:57.812 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:04:57.870 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:04:42
2026-05-29T16:04:57.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72266, datetime.datetime(2026, 5, 29, 16, 4, 42), datetime.datetime(2026, 5, 29, 16, 4, 41), 'salt', 15.26, 42.62, None, 19.94, 39.68, 12.61, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:04:57.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:04:57.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:04:57.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:04:41, diff=16.876965s, valid=True
2026-05-29T16:04:57.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:04:57.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:04:57.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:05:12, diff=-14.120206s, valid=True
2026-05-29T16:04:57.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:04:57.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:04:57.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:04:38, diff=19.88625s, valid=True
2026-05-29T16:04:57.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:04:57.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:04:57.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:04:57.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:04:57.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:04:57.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:04:57.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:05:12, diff=-14.110639s, valid=True
2026-05-29T16:04:57.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:04:57.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:04:57.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:04:57.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996139.890032s, valid=True
2026-05-29T16:04:57.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:04:57.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:04:57.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:04:57.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:04:57.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:04:57.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:04:57.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:04:57.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:04:57.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:04:58.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:04:58.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:04:58.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:04:58.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:04:58.214 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:04:58.502 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:04:58.848 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:04:58.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:04:58.948 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:04:58.948 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:04:59.193 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:04:59.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:05:29.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:05:29.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:05:29.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:05:29.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:05:29.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:05:29.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:05: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-05-29T16:05:29.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:05:29.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-05-29T16:05:29.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:05:29.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:05:29.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:05:29.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T16:05:32.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-05-29T16:05:32.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:05:32.205 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:05:32.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:05:32.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:05:32.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:05:32.226 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:05:32.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:05:32.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:05:32.226 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:05:32.226 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:05:32.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:05:32.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:05:32.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:05:32.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:05:32.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:05:32.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:05:32.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:05:32.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:05:32.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:05:32.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:05:32.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:05:32.477 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:05:32.536 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:05:12
2026-05-29T16:05:32.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72267, datetime.datetime(2026, 5, 29, 16, 5, 12), datetime.datetime(2026, 5, 29, 16, 5, 11), 'salt', 15.23, 41.83, None, 19.97, 31.5, 12.88, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:05:32.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:05:32.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:05:32.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:05:11, diff=21.54225s, valid=True
2026-05-29T16:05:32.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:05:32.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:05:32.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:05:12, diff=20.545118s, valid=True
2026-05-29T16:05:32.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:05:32.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:05:32.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:05:08, diff=24.551901s, valid=True
2026-05-29T16:05:32.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:05:32.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:05:32.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:05:32.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:05:32.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:05:32.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:05:32.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:05:12, diff=20.554938s, valid=True
2026-05-29T16:05:32.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:05:32.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:05:32.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:05:32.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996174.555597s, valid=True
2026-05-29T16:05:32.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:05:32.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:05:32.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:05:32.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:05:32.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:05:32.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:05:32.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:05:32.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:05:32.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:05:32.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:05:32.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:05:32.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:05:32.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:05:32.872 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:05:33.089 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:05:33.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:05:33.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:05:33.540 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:05:33.540 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:05:33.797 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:05:33.797 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:06:03.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:06:03.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:06:03.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:06:04.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:06:04.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:06:04.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:06:04.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-05-29T16:06:04.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:06:04.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-05-29T16:06:04.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:06:04.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:06:04.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:06:04.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-05-29T16:06:06.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-05-29T16:06:06.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:06:06.651 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:06:06.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:06:06.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:06:06.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:06:06.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:06:06.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:06:06.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:06:06.673 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:06:06.673 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:06:06.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:06:06.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:06:06.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:06:06.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:06:06.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:06:06.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:06:06.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:06:06.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:06:06.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:06:06.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:06:06.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:06:06.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:06:06.988 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:05:42
2026-05-29T16:06:06.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72268, datetime.datetime(2026, 5, 29, 16, 5, 42), datetime.datetime(2026, 5, 29, 16, 5, 42), 'salt', 15.16, 42.79, None, 23.08, 42.94, 12.55, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:06:06.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:06:06.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:06:06.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:05:42, diff=24.994267s, valid=True
2026-05-29T16:06:06.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:06:06.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:06:06.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:06:12, diff=-5.00292s, valid=True
2026-05-29T16:06:06.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:06:06.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:06:07.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:05:38, diff=29.003728s, valid=True
2026-05-29T16:06:07.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:06:07.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:06:07.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:06:07.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:06:07.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:06:07.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:06:07.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:06:12, diff=-4.993232s, valid=True
2026-05-29T16:06:07.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:06:07.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:06:07.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:06:07.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996209.007417s, valid=True
2026-05-29T16:06:07.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:06:07.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:06:07.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:06:07.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:06:07.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:06:07.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:06:07.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:06:07.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:06:07.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:06:07.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:06:07.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:06:07.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:06:07.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:06:07.391 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:06:07.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:06:07.954 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:06:08.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:06:08.054 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:06:08.054 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:06:08.306 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:06:08.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:06:38.319 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:06:38.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:06:38.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:06:38.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:06:38.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:06:38.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:06:38.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-05-29T16:06:38.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:06:38.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-05-29T16:06:38.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:06:38.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:06:38.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:06:38.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-05-29T16:06:41.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T16:06:41.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:06:41.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:06:41.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:06:41.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:06:41.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:06:41.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:06:41.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:06:41.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:06:41.183 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:06:41.183 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:06:41.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:06:41.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:06:41.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:06:41.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:06:41.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:06:41.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:06:41.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:06:41.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:06:41.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:06:41.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:06:41.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:06:41.433 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:06:41.494 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:06:12
2026-05-29T16:06:41.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72269, datetime.datetime(2026, 5, 29, 16, 6, 12), datetime.datetime(2026, 5, 29, 16, 6, 12), 'salt', 15.13, 42.79, None, 18.17, 23.17, 12.55, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:06:41.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:06:41.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:06:41.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:06:12, diff=29.500045s, valid=True
2026-05-29T16:06:41.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:06:41.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:06:41.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:06:12, diff=29.502855s, valid=True
2026-05-29T16:06:41.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:06:41.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:06:41.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:06:10, diff=31.509445s, valid=True
2026-05-29T16:06:41.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:06:41.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:06:41.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:06:41.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:06:41.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:06:41.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:06:41.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:06:12, diff=29.512455s, valid=True
2026-05-29T16:06:41.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:06:41.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:06:41.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:06:41.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996243.513117s, valid=True
2026-05-29T16:06:41.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:06:41.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:06:41.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:06:41.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:06:41.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:06:41.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:06:41.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:06:41.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:06:41.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:06:41.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:06:41.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:06:41.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:06:41.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:06:41.828 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:06:42.041 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:06:42.385 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:06:42.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:06:42.486 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:06:42.486 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:06:42.663 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:06:42.663 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:07:12.693 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:07:12.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:07:12.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:07:12.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:07:13.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:07:13.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:07:13.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-05-29T16:07:13.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:07:13.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-05-29T16:07:13.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:07:13.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:07:13.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:07:13.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-05-29T16:07:15.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-05-29T16:07:15.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:07:15.572 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:07:15.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:07:15.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:07:15.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:07:15.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:07:15.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:07:15.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:07:15.593 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:07:15.593 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:07:15.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:07:15.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:07:15.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:07:15.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:07:15.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:07:15.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:07:15.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:07:15.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:07:15.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:07:15.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:07:15.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:07:15.850 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:07:15.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:07:13
2026-05-29T16:07:15.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72271, datetime.datetime(2026, 5, 29, 16, 7, 13), datetime.datetime(2026, 5, 29, 16, 7, 12), 'salt', 15.23, 43.38, None, 20.47, 39.94, 12.36, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:07:15.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:07:15.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:07:15.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:07:12, diff=3.92225s, valid=True
2026-05-29T16:07:15.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:07:15.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:07:15.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:07:12, diff=3.92511s, valid=True
2026-05-29T16:07:15.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:07:15.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:07:15.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:07:13, diff=2.931743s, valid=True
2026-05-29T16:07:15.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:07:15.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:07:15.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:07:15.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:07:15.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:07:15.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:07:15.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:07:12, diff=3.934803s, valid=True
2026-05-29T16:07:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:07:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:07:15.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:07:15.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996277.935483s, valid=True
2026-05-29T16:07:15.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:07:15.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:07:15.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:07:15.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:07:15.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:07:15.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:07:15.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:07:15.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:07:16.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:07:16.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:07:16.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:07:16.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:07:16.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:07:16.318 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:07:16.534 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:07:16.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:07:16.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:07:16.988 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:07:16.988 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:07:17.234 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:07:17.234 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:07:47.254 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:07:47.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:07:47.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:07:47.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:07:47.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:07:47.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:07:47.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-05-29T16:07:47.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:07:47.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-05-29T16:07:47.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:07:47.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:07:47.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:07:47.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-05-29T16:07:50.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-05-29T16:07:50.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:07:50.489 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:07:50.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:07:50.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:07:50.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:07:50.512 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:07:50.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:07:50.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:07:50.512 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:07:50.512 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:07:50.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:07:50.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:07:50.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:07:50.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:07:50.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:07:50.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:07:50.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:07:50.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:07:50.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:07:50.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:07:50.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:07:50.776 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:07:50.837 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:07:43
2026-05-29T16:07:50.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72272, datetime.datetime(2026, 5, 29, 16, 7, 43), datetime.datetime(2026, 5, 29, 16, 7, 43), 'salt', 15.23, 43.85, None, 20.18, 37.92, 12.21, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:07:50.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:07:50.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:07:50.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:07:43, diff=7.844127s, valid=True
2026-05-29T16:07:50.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:07:50.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:07:50.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:08:12, diff=-21.15308s, valid=True
2026-05-29T16:07:50.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:07:50.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:07:50.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:07:40, diff=10.853635s, valid=True
2026-05-29T16:07:50.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:07:50.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:07:50.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:07:50.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:07:50.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:07:50.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:07:50.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:08:12, diff=-21.14331s, valid=True
2026-05-29T16:07:50.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:07:50.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:07:50.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:07:50.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996312.857371s, valid=True
2026-05-29T16:07:50.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:07:50.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:07:50.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:07:50.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:07:50.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:07:50.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:07:50.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:07:50.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:07:50.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:07:50.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:07:51.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:07:51.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:07:51.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:07:51.171 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:07:51.385 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:07:51.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:07:51.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:07:51.830 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:07:51.830 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:07:51.983 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:07:51.984 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:08:22.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:08:22.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:08:22.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:08:22.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:08:22.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:08:22.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:08:22.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-05-29T16:08:22.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:08:22.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-05-29T16:08:22.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:08:22.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:08:22.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:08:22.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-05-29T16:08:24.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-05-29T16:08:24.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:08:24.967 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:08:24.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:08:24.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:08:24.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:08:24.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:08:24.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:08:24.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:08:24.989 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:08:24.989 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:08:24.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:08:25.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:08:25.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:08:25.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:08:25.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:08:25.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:08:25.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:08:25.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:08:25.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:08:25.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:08:25.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:08:25.244 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:08:25.304 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:08:13
2026-05-29T16:08:25.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72273, datetime.datetime(2026, 5, 29, 16, 8, 13), datetime.datetime(2026, 5, 29, 16, 8, 13), 'salt', 15.42, 44.51, None, 22.23, 37.78, 12.01, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:08:25.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:08:25.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:08:25.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:08:13, diff=12.311021s, valid=True
2026-05-29T16:08:25.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:08:25.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:08:25.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:08:12, diff=13.313903s, valid=True
2026-05-29T16:08:25.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:08:25.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:08:25.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:08:10, diff=15.320638s, valid=True
2026-05-29T16:08:25.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:08:25.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:08:25.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:08:25.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:08:25.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:08:25.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:08:25.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:08:12, diff=13.323667s, valid=True
2026-05-29T16:08:25.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:08:25.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:08:25.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:08:25.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996347.32432s, valid=True
2026-05-29T16:08:25.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:08:25.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:08:25.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:08:25.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:08:25.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:08:25.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:08:25.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:08:25.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:08:25.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:08:25.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:08:25.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:08:25.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:08:25.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:08:25.705 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:08:25.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:08:26.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:08:26.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:08:26.368 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:08:26.368 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:08:26.592 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:08:26.592 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:08:56.622 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:08:56.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:08:56.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:08:56.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:08:56.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:08:57.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:08:57.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-05-29T16:08:57.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:08:57.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-05-29T16:08:57.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:08:57.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:08:57.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:08:57.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-05-29T16:08:59.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-05-29T16:08:59.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:08:59.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:08:59.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:08:59.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:08:59.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:08:59.623 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:08:59.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:08:59.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:08:59.623 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:08:59.623 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:08:59.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:08:59.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:08:59.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:08:59.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:08:59.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:08:59.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:08:59.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:08:59.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:08:59.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:08:59.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:08:59.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:08:59.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:08:59.946 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:08:43
2026-05-29T16:08:59.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72274, datetime.datetime(2026, 5, 29, 16, 8, 43), datetime.datetime(2026, 5, 29, 16, 8, 43), 'salt', 15.39, 43.62, None, 25.72, 31.9, 12.3, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:08:59.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:08:59.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:08:59.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:08:43, diff=16.953176s, valid=True
2026-05-29T16:08:59.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:08:59.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:08:59.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:09:12, diff=-12.043847s, valid=True
2026-05-29T16:08:59.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:08:59.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:08:59.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:08:40, diff=19.963186s, valid=True
2026-05-29T16:08:59.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:08:59.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:08:59.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:08:59.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:08:59.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:08:59.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:08:59.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:09:12, diff=-12.033652s, valid=True
2026-05-29T16:08:59.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:08:59.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:08:59.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:08:59.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996381.96702s, valid=True
2026-05-29T16:08:59.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:08:59.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:08:59.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:08:59.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:08:59.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:09:00.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:09:00.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:09:00.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:09:00.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:09:00.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:09:00.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:09:00.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:09:00.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:09:00.292 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:09:00.505 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:09:00.849 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:09:00.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:09: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-05-29T16:09: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-05-29T16:09:01.118 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:09:01.118 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:09:31.127 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:09:31.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:09:31.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:09:31.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:09:31.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:09:31.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:09:31.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-05-29T16:09:31.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:09:31.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-05-29T16:09:31.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:09:31.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:09:31.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:09:31.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-05-29T16:09:34.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-05-29T16:09:34.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:09:34.448 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:09:34.448 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:09:34.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:09:34.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:09:34.469 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:09:34.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:09:34.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:09:34.469 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:09:34.469 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:09:34.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:09:34.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:09:34.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:09:34.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:09:34.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:09:34.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:09:34.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:09:34.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:09:34.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:09:34.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:09:34.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:09:34.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:09:34.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:09:14
2026-05-29T16:09:34.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72275, datetime.datetime(2026, 5, 29, 16, 9, 14), datetime.datetime(2026, 5, 29, 16, 9, 13), 'salt', 15.36, 44.05, None, 21.98, 34.31, 12.16, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:09:34.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:09:34.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:09:34.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:09:13, diff=21.787053s, valid=True
2026-05-29T16:09:34.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:09:34.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:09:34.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:09:12, diff=22.789817s, valid=True
2026-05-29T16:09:34.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:09:34.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:09:34.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:09:10, diff=24.796196s, valid=True
2026-05-29T16:09:34.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:09:34.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:09:34.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:09:34.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:09:34.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:09:34.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:09:34.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:09:12, diff=22.79915s, valid=True
2026-05-29T16:09:34.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:09:34.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:09:34.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:09:34.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996416.799811s, valid=True
2026-05-29T16:09:34.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:09:34.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:09:34.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:09:34.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:09:34.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:09:34.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:09:34.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:09:34.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:09:34.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:09:34.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:09:34.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:09:35.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:09:35.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:09:35.113 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:09:35.327 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:09:35.673 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:09:35.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:09:35.773 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:09:35.773 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:09:36.034 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:09:36.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:10:06.056 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:10:06.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:10:06.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:10:06.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:10:06.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:10:06.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:10:06.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-05-29T16:10:06.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:10:06.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-05-29T16:10:06.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:10:06.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:10:06.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16: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-05-29T16:10:09.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-05-29T16:10:09.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:10:09.006 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:10:09.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:10:09.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:10:09.028 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:10:09.028 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:10:09.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:10:09.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:10:09.029 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:10:09.029 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:10:09.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:10:09.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:10:09.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:10:09.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:10:09.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:10:09.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:10:09.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:10:09.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:10:09.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:10:09.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:10:09.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:10:09.283 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:10:09.341 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:09:44
2026-05-29T16:10:09.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72276, datetime.datetime(2026, 5, 29, 16, 9, 44), datetime.datetime(2026, 5, 29, 16, 9, 43), 'salt', 15.39, 44.31, None, 21.7, 40.41, 12.07, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:10:09.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:10:09.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:10:09.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:09:43, diff=26.347778s, valid=True
2026-05-29T16:10:09.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:10:09.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:10:09.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:10:12, diff=-2.64942s, valid=True
2026-05-29T16:10:09.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:10:09.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:10:09.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:09:41, diff=28.357267s, valid=True
2026-05-29T16:10:09.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:10:09.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:10:09.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:10:09.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:10:09.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:10:09.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:10:09.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:10:12, diff=-2.639742s, valid=True
2026-05-29T16:10:09.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:10:09.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:10:09.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:10:09.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996451.360927s, valid=True
2026-05-29T16:10:09.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:10:09.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:10:09.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:10:09.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:10:09.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:10:09.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:10:09.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:10:09.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:10:09.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:10:09.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:10:09.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:10:09.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:10:09.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:10:09.674 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:10:09.899 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:10:10.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:10:10.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:10:10.424 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:10:10.424 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:10:10.674 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:10:10.674 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:10:40.704 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:10:40.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:10:40.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:10:40.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:10:40.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:10:41.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:10:41.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-05-29T16:10:41.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:10:41.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-05-29T16:10:41.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:10:41.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:10:41.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:10:41.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-05-29T16:10:43.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-05-29T16:10:43.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:10:43.545 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:10:43.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:10:43.553 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:10:43.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:10:43.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:10:43.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:10:43.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:10:43.565 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:10:43.565 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:10:43.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:10:43.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:10:43.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:10:43.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:10:43.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:10:43.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:10:43.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:10:43.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:10:43.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:10:43.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:10:43.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:10:43.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:10:43.876 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:10:14
2026-05-29T16:10:43.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72277, datetime.datetime(2026, 5, 29, 16, 10, 14), datetime.datetime(2026, 5, 29, 16, 10, 14), 'salt', 15.16, 42.85, None, 23.46, 32.67, 12.53, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:10:43.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:10:43.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:10:43.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:10:14, diff=29.882607s, valid=True
2026-05-29T16:10:43.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:10:43.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:10:43.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:10:12, diff=31.88541s, valid=True
2026-05-29T16:10:43.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:10:43.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:10:43.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:10:11, diff=32.891957s, valid=True
2026-05-29T16:10:43.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:10:43.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:10:43.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:10:43.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:10:43.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:10:43.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:10:43.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:10:12, diff=31.894919s, valid=True
2026-05-29T16:10:43.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:10:43.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:10:43.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:10:43.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996485.895564s, valid=True
2026-05-29T16:10:43.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:10:43.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:10:43.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:10:43.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:10:43.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:10:43.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:10:43.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:10:43.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:10:43.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:10:44.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:10:44.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:10:44.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:10:44.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:10:44.210 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:10:44.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:10:44.770 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:10:44.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:10:44.870 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:10:44.870 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:10:45.045 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:10:45.045 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:11:15.076 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:11:15.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:11:15.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:11:15.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:11:15.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:11:15.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:11:15.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T16:11:15.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:11:15.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-05-29T16:11:15.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:11:15.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:11:15.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:11:15.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-05-29T16:11:18.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-05-29T16:11:18.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:11:18.419 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:11:18.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:11:18.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:11:18.441 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:11:18.441 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:11:18.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:11:18.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:11:18.441 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:11:18.441 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:11:18.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:11:18.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:11:18.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:11:18.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:11:18.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:11:18.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:11:18.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:11:18.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:11:18.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:11:18.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:11:18.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:11:18.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:11:18.771 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:11:15
2026-05-29T16:11:18.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72279, datetime.datetime(2026, 5, 29, 16, 11, 15), datetime.datetime(2026, 5, 29, 16, 11, 14), 'salt', 15.19, 43.42, None, 18.42, 28.78, 12.34, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:11:18.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:11:18.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:11:18.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:11:14, diff=4.778091s, valid=True
2026-05-29T16:11:18.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:11:18.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:11:18.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:11:12, diff=6.781023s, valid=True
2026-05-29T16:11:18.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:11:18.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:11:18.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:11:14, diff=4.787943s, valid=True
2026-05-29T16:11:18.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:11:18.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:11:18.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:11:18.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:11:18.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:11:18.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:11:18.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:11:12, diff=6.791082s, valid=True
2026-05-29T16:11:18.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:11:18.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:11:18.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:11:18.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996520.791769s, valid=True
2026-05-29T16:11:18.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:11:18.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:11:18.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:11:18.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:11:18.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:11:18.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:11:18.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:11:18.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:11:18.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:11:18.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:11:18.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:11:19.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:11:19.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:11:19.114 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:11:19.345 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:11:19.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:11:19.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:11:19.863 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:11:19.863 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:11:20.016 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:11:20.016 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:11:50.045 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:11:50.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:11:50.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:11:50.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:11:50.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:11:50.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:11:50.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-05-29T16:11:50.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:11:50.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-05-29T16:11:50.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:11:50.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:11:50.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:11: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-05-29T16:11:52.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-05-29T16:11:52.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:11:52.969 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:11:52.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:11:52.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:11:52.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:11:52.990 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:11:52.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:11:52.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:11:52.991 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:11:52.991 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:11:52.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:11:53.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:11:53.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:11:53.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:11:53.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:11:53.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:11:53.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:11:53.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:11:53.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:11:53.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:11:53.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:11:53.241 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:11:53.300 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:11:46
2026-05-29T16:11:53.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72280, datetime.datetime(2026, 5, 29, 16, 11, 46), datetime.datetime(2026, 5, 29, 16, 11, 45), 'salt', 15.13, 43.35, None, 18.35, 36.26, 12.37, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:11:53.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:11:53.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:11:53.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:11:45, diff=8.306806s, valid=True
2026-05-29T16:11:53.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:11:53.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:11:53.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:12:12, diff=-18.690335s, valid=True
2026-05-29T16:11:53.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:11:53.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:11:53.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:11:42, diff=11.316454s, valid=True
2026-05-29T16:11:53.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:11:53.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:11:53.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:11:53.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:11:53.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:11:53.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:11:53.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:12:12, diff=-18.680503s, valid=True
2026-05-29T16:11:53.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:11:53.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:11:53.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:11:53.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996555.320171s, valid=True
2026-05-29T16:11:53.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:11:53.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:11:53.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:11:53.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:11:53.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:11:53.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:11:53.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:11:53.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:11:53.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:11:53.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:11:53.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:11:53.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:11:53.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:11:53.633 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:11:53.846 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:11:54.193 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:11:54.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:11:54.293 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:11:54.293 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:11:54.457 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:11:54.457 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:12:24.487 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:12:24.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:12:24.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:12:24.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:12:24.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:12:25.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:12:25.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-05-29T16:12:25.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:12:25.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-05-29T16:12:25.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:12:25.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:12:25.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:12:25.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-05-29T16:12:28.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-05-29T16:12:28.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:12:28.185 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:12:28.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:12:28.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:12:28.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:12:28.206 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:12:28.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:12:28.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:12:28.207 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:12:28.207 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:12:28.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:12:28.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:12:28.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:12:28.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:12:28.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:12:28.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:12:28.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:12:28.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:12:28.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:12:28.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:12:28.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:12:28.462 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:12:28.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:12:16
2026-05-29T16:12:28.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72281, datetime.datetime(2026, 5, 29, 16, 12, 16), datetime.datetime(2026, 5, 29, 16, 12, 15), 'salt', 15.16, 43.42, None, 20.29, 25.24, 12.34, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:12:28.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:12:28.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:12:28.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:12:15, diff=13.527324s, valid=True
2026-05-29T16:12:28.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:12:28.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:12:28.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:12:12, diff=16.530144s, valid=True
2026-05-29T16:12:28.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:12:28.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:12:28.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:12:12, diff=16.536844s, valid=True
2026-05-29T16:12:28.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:12:28.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:12:28.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:12:28.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:12:28.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:12:28.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:12:28.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:12:12, diff=16.539866s, valid=True
2026-05-29T16:12:28.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:12:28.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:12:28.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:12:28.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996590.54052s, valid=True
2026-05-29T16:12:28.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:12:28.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:12:28.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:12:28.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:12:28.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:12:28.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:12:28.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:12:28.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:12:28.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:12:28.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:12:28.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:12:28.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:12:28.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:12:28.853 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:12:29.139 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:12:29.484 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:12:29.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:12:29.584 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:12:29.584 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:12:29.854 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:12:29.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:12:59.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:12:59.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:12:59.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:13:00.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:13:00.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:13:00.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:13:00.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T16:13:00.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:13:00.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T16:13:00.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:13:00.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:13:00.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:13:00.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-05-29T16:13:02.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-05-29T16:13:02.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:13:02.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:13:02.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:13:02.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:13:02.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:13:02.854 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:13:02.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:13:02.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:13:02.855 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:13:02.855 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:13:02.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:13:02.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:13:02.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:13:03.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:13:03.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:13:03.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:13:03.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:13:03.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:13:03.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:13:03.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:13:03.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:13:03.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:13:03.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:12:46
2026-05-29T16:13:03.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72282, datetime.datetime(2026, 5, 29, 16, 12, 46), datetime.datetime(2026, 5, 29, 16, 12, 46), 'salt', 15.23, 43.75, None, 18.67, 28.38, 12.25, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:13:03.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:13:03.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:13:03.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:12:46, diff=17.195588s, valid=True
2026-05-29T16:13:03.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:13:03.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:13:03.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:13:12, diff=-8.801546s, valid=True
2026-05-29T16:13:03.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:13:03.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:13:03.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:12:42, diff=21.205236s, valid=True
2026-05-29T16:13:03.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:13:03.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:13:03.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:13:03.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:13:03.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:13:03.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:13:03.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:13:12, diff=-8.791678s, valid=True
2026-05-29T16:13:03.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:13:03.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:13:03.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:13:03.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996625.208996s, valid=True
2026-05-29T16:13:03.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:13:03.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:13:03.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:13:03.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:13:03.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:13:03.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:13:03.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:13:03.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:13:03.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:13:03.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:13:03.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:13:03.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:13:03.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:13:03.561 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:13:03.802 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:13:04.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:13:04.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:13:04.249 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:13:04.249 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:13:04.414 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:13:04.414 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:13:34.419 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:13:34.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:13:34.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:13:35.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:13:35.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:13:35.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:13:35.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T16:13:35.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:13:35.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-05-29T16:13:35.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:13:35.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:13:35.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:13:35.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-05-29T16:13:37.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-05-29T16:13:37.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:13:37.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:13:37.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:13:37.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:13:37.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:13:37.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:13:37.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:13:37.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:13:37.659 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:13:37.659 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:13:37.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:13:37.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:13:37.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:13:37.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:13:37.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:13:37.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:13:37.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:13:37.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:13:37.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:13:37.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:13:37.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:13:37.914 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:13:37.976 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:13:16
2026-05-29T16:13:37.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72283, datetime.datetime(2026, 5, 29, 16, 13, 16), datetime.datetime(2026, 5, 29, 16, 13, 16), 'salt', 15.16, 43.72, None, 17.93, 33.4, 12.25, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:13:37.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:13:37.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:13:37.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:13:16, diff=21.982402s, valid=True
2026-05-29T16:13:37.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:13:37.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:13:37.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:13:12, diff=25.985265s, valid=True
2026-05-29T16:13:37.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:13:37.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:13:37.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:13:13, diff=24.991955s, valid=True
2026-05-29T16:13:37.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:13:37.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:13:37.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:13:37.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:13:37.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:13:37.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:13:37.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:13:12, diff=25.994966s, valid=True
2026-05-29T16:13:37.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:13:37.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:13:37.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:13:37.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996659.995626s, valid=True
2026-05-29T16:13:37.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:13:37.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:13:37.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:13:37.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:13:37.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:13:38.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:13:38.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:13:38.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:13:38.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:13:38.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:13:38.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:13:38.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:13:38.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:13:38.389 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:13:38.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:13:38.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:13:39.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:13:39.055 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:13:39.055 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:13:39.217 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:13:39.217 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:14:09.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:14:09.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:14:09.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:14:09.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:14:09.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:14:09.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:14:09.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-05-29T16:14:09.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:14:09.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-05-29T16:14:09.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:14:09.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:14:09.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:14:09.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-05-29T16:14:12.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-05-29T16:14:12.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:14:12.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:14:12.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:14:12.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:14:12.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:14:12.404 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:14:12.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:14:12.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:14:12.405 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:14:12.405 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:14:12.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:14:12.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:14:12.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:14:12.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:14:12.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:14:12.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:14:12.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:14:12.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:14:12.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:14:12.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:14:12.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:14:12.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:14:12.722 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:13:46
2026-05-29T16:14:12.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72284, datetime.datetime(2026, 5, 29, 16, 13, 46), datetime.datetime(2026, 5, 29, 16, 13, 45), 'salt', 15.33, 44.41, None, 18.46, 33.35, 12.04, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:14:12.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:14:12.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:14:12.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:13:45, diff=27.728929s, valid=True
2026-05-29T16:14:12.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:14:12.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:14:12.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:14:12, diff=0.731745s, valid=True
2026-05-29T16:14:12.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:14:12.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:14:12.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:13:43, diff=29.738415s, valid=True
2026-05-29T16:14:12.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:14:12.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:14:12.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:14:12.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:14:12.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:14:12.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:14:12.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:14:12, diff=0.741428s, valid=True
2026-05-29T16:14:12.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:14:12.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:14:12.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:14:12.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996694.742094s, valid=True
2026-05-29T16:14:12.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:14:12.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:14:12.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:14:12.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:14:12.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:14:12.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:14:12.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:14:12.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:14:12.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:14:12.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:14:12.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:14:12.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:14:13.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:14:13.057 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:14:13.271 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:14:13.619 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:14:13.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:14:13.720 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:14:13.720 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:14:13.787 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:14:13.787 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:14:43.803 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:14:43.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:14:43.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:14:44.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:14:44.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:14:44.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:14:44.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-05-29T16:14:44.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:14:44.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-05-29T16:14:44.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:14:44.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:14:44.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:14:44.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-05-29T16:14:46.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-05-29T16:14:46.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:14:46.673 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:14:46.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:14:46.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:14:46.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:14:46.692 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:14:46.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:14:46.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:14:46.693 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:14:46.693 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:14:46.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:14:46.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:14:46.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:14:46.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:14:46.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:14:46.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:14:46.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:14:46.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:14:46.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:14:46.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:14:46.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:14:46.944 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:14:47.002 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:14:17
2026-05-29T16:14:47.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72285, datetime.datetime(2026, 5, 29, 16, 14, 17), datetime.datetime(2026, 5, 29, 16, 14, 16), 'salt', 15.23, 44.01, None, 20.82, 35.55, 12.16, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:14:47.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:14:47.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:14:47.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:14:16, diff=31.008494s, valid=True
2026-05-29T16:14:47.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:14:47.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:14:47.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:14:12, diff=35.01132s, valid=True
2026-05-29T16:14:47.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:14:47.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:14:47.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:14:14, diff=33.018067s, valid=True
2026-05-29T16:14:47.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:14:47.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:14:47.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:14:47.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:14:47.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:14:47.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:14:47.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:14:12, diff=35.021075s, valid=True
2026-05-29T16:14:47.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:14:47.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:14:47.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:14:47.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996729.02174s, valid=True
2026-05-29T16:14:47.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:14:47.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:14:47.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:14:47.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:14:47.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:14:47.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:14:47.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:14:47.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:14:47.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:14:47.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:14:47.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:14:47.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:14:47.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:14:47.403 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:14:47.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:14:47.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:14:48.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:14:48.067 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:14:48.067 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:14:48.217 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:14:48.218 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:15:18.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:15:18.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:15:18.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:15:18.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:15:18.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:15:18.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:15:18.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-05-29T16:15:18.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:15:18.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-05-29T16:15:18.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:15:18.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:15:18.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:15:18.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-05-29T16:15:21.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-05-29T16:15:21.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:15:21.423 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:15:21.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:15:21.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:15:21.444 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:15:21.444 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:15:21.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:15:21.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:15:21.445 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:15:21.445 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:15:21.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:15:21.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:15:21.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:15:21.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:15:21.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:15:21.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:15:21.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:15:21.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:15:21.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:15:21.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:15:21.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:15:21.706 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:15:21.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:15:17
2026-05-29T16:15:21.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72287, datetime.datetime(2026, 5, 29, 16, 15, 17), datetime.datetime(2026, 5, 29, 16, 15, 17), 'salt', 15.33, 43.62, None, 23.43, 35.11, 12.3, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:15:21.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:15:21.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:15:21.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:15:17, diff=4.772303s, valid=True
2026-05-29T16:15:21.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:15:21.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:15:21.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:15:12, diff=9.775137s, valid=True
2026-05-29T16:15:21.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:15:21.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:15:21.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:15:15, diff=6.781787s, valid=True
2026-05-29T16:15:21.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:15:21.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:15:21.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:15:21.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:15:21.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:15:21.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:15:21.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:15:12, diff=9.784755s, valid=True
2026-05-29T16:15:21.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:15:21.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:15:21.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:15:21.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996763.785408s, valid=True
2026-05-29T16:15:21.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:15:21.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:15:21.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:15:21.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:15:21.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:15:21.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:15:21.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:15:21.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:15:21.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:15:21.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:15:21.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:15:22.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:15:22.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:15:22.115 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:15:22.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:15:22.759 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:15:22.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:15:22.869 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:15:22.869 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:15:23.040 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:15:23.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:15:53.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:15:53.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:15:53.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:15:53.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:15:53.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:15:53.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:15:53.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-05-29T16:15:53.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:15:53.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-05-29T16:15:53.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:15:53.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:15:53.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:15:53.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-05-29T16:15:55.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-05-29T16:15:55.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:15:55.985 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:15:55.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:15:55.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:15:56.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:15:56.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:15:56.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:15:56.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:15:56.007 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:15:56.007 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:15:56.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:15:56.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:15:56.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:15:56.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:15:56.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:15:56.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:15:56.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:15:56.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:15:56.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:15:56.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:15:56.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:15:56.273 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:15:56.336 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:15:47
2026-05-29T16:15:56.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72288, datetime.datetime(2026, 5, 29, 16, 15, 47), datetime.datetime(2026, 5, 29, 16, 15, 47), 'salt', 15.16, 43.29, None, 23.22, 33.89, 12.39, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:15:56.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:15:56.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:15:56.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:15:47, diff=9.342411s, valid=True
2026-05-29T16:15:56.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:15:56.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:15:56.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:16:12, diff=-15.654755s, valid=True
2026-05-29T16:15:56.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:15:56.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:15:56.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:15:46, diff=10.352033s, valid=True
2026-05-29T16:15:56.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:15:56.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:15:56.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:15:56.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:15:56.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:15:56.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:15:56.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:16:12, diff=-15.644894s, valid=True
2026-05-29T16:15:56.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:15:56.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:15:56.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:15:56.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996798.355766s, valid=True
2026-05-29T16:15:56.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:15:56.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:15:56.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:15:56.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:15:56.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:15:56.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:15:56.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:15:56.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:15:56.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:15:56.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:15:56.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:15:56.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:15:56.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:15:56.671 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:15:56.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:15:57.232 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:15:57.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:15:57.331 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:15:57.331 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:15:57.495 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:15:57.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:16:27.525 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:16:27.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:16:27.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:16:27.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:16:27.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:16:28.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:16:28.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-05-29T16:16:28.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:16:28.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-05-29T16:16:28.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:16:28.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:16:28.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:16:28.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-05-29T16:16:30.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-05-29T16:16:30.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:16:30.867 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:16:30.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:16:30.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:16:30.890 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:16:30.890 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:16:30.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:16:30.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:16:30.890 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:16:30.890 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:16:30.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:16:30.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:16:30.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:16:31.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:16:31.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:16:31.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:16:31.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:16:31.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:16:31.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:16:31.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:16:31.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:16:31.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:16:31.226 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:16:17
2026-05-29T16:16:31.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72289, datetime.datetime(2026, 5, 29, 16, 16, 17), datetime.datetime(2026, 5, 29, 16, 16, 17), 'salt', 15.09, 43.42, None, 24.28, 34.66, 12.33, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:16:31.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:16:31.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:16:31.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:16:17, diff=14.232715s, valid=True
2026-05-29T16:16:31.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:16:31.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:16:31.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:16:12, diff=19.235596s, valid=True
2026-05-29T16:16:31.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:16:31.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:16:31.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:16:15, diff=16.242508s, valid=True
2026-05-29T16:16:31.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:16:31.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:16:31.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:16:31.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:16:31.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:16:31.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:16:31.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:16:12, diff=19.245625s, valid=True
2026-05-29T16:16:31.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:16:31.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:16:31.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:16:31.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996833.246295s, valid=True
2026-05-29T16:16:31.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:16:31.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:16:31.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:16:31.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:16:31.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:16:31.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:16:31.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:16:31.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:16:31.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:16:31.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:16:31.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:16:31.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:16:31.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:16:31.577 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:16:31.793 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:16:32.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:16:32.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:16:32.300 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:16:32.300 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:16:32.466 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:16:32.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:17:02.496 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:17:02.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:17:02.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:17:02.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:17:02.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:17:02.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:17:02.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T16:17:02.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:17:02.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-05-29T16:17:02.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:17:02.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:17:02.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:17:02.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-05-29T16:17:05.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-05-29T16:17:05.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:17:05.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:17:05.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:17:05.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:17:05.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:17:05.409 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:17:05.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:17:05.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:17:05.410 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:17:05.410 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:17:05.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:17:05.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:17:05.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:17:05.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:17:05.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:17:05.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:17:05.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:17:05.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:17:05.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:17:05.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:17:05.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:17:05.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:17:05.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:16:48
2026-05-29T16:17:05.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72290, datetime.datetime(2026, 5, 29, 16, 16, 48), datetime.datetime(2026, 5, 29, 16, 16, 47), 'salt', 14.93, 44.25, None, 23.43, 37.88, 12.06, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:17:05.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:17:05.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:17:05.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:16:47, diff=18.741227s, valid=True
2026-05-29T16:17:05.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:17:05.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:17:05.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:17:12, diff=-6.255941s, valid=True
2026-05-29T16:17:05.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:17:05.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:17:05.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:16:45, diff=20.750617s, valid=True
2026-05-29T16:17:05.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:17:05.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:17:05.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:17:05.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:17:05.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:17:05.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:17:05.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:17:12, diff=-6.246369s, valid=True
2026-05-29T16:17:05.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:17:05.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:17:05.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:17:05.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996867.754285s, valid=True
2026-05-29T16:17:05.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:17:05.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:17:05.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:17:05.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:17:05.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:17:05.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:17:05.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:17:05.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:17:05.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:17:05.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:17:05.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:17:05.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:17:06.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:17:06.085 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:17:06.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:17:06.664 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:17:06.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:17:06.765 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:17: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-05-29T16:17:06.833 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:17:06.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:17:36.863 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:17:36.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:17:36.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:17:37.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:17:37.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:17:37.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:17:37.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-05-29T16:17:37.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:17:37.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T16:17:37.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:17:37.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:17:37.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:17:37.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-05-29T16:17:39.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-05-29T16:17:39.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:17:39.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:17:39.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:17:39.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:17:39.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:17:39.941 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:17:39.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:17:39.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:17:39.941 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:17:39.941 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:17:39.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:17:40.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:17:40.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:17:40.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:17:40.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:17:40.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:17:40.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:17:40.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:17:40.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:17:40.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:17:40.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:17:40.205 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:17:40.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:17:18
2026-05-29T16:17:40.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72291, datetime.datetime(2026, 5, 29, 16, 17, 18), datetime.datetime(2026, 5, 29, 16, 17, 18), 'salt', 14.96, 44.41, None, 24.98, 37.24, 12.0, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:17:40.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:17:40.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:17:40.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:17:18, diff=22.269577s, valid=True
2026-05-29T16:17:40.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:17:40.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:17:40.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:17:12, diff=28.2724s, valid=True
2026-05-29T16:17:40.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:17:40.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:17:40.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:17:15, diff=25.279015s, valid=True
2026-05-29T16:17:40.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:17:40.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:17:40.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:17:40.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:17:40.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:17:40.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:17:40.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:17:12, diff=28.282002s, valid=True
2026-05-29T16:17:40.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:17:40.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:17:40.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:17:40.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996902.282653s, valid=True
2026-05-29T16:17:40.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:17:40.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:17:40.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:17:40.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:17:40.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:17:40.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:17:40.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:17:40.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:17:40.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:17:40.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:17:40.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:17:40.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:17:40.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:17:40.595 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:17:40.882 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:17:41.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:17:41.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:17:41.328 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:17:41.328 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:17:41.565 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:17:41.565 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:18:11.595 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:18:11.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:18:11.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:18:12.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:18:12.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:18:12.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:18:12.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-05-29T16:18:12.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:18:12.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-05-29T16:18:12.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:18:12.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:18:12.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:18:12.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-05-29T16:18:14.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-05-29T16:18:14.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:18:14.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:18:14.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:18:14.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:18:14.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:18:14.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:18:14.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:18:14.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:18:14.659 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:18:14.659 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:18:14.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:18:14.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:18:14.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:18:14.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:18:14.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:18:14.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:18:14.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:18:14.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T16:18:14.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:18:14.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:18:14.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:18:14.923 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:18:14.981 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:17:48
2026-05-29T16:18:14.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72292, datetime.datetime(2026, 5, 29, 16, 17, 48), datetime.datetime(2026, 5, 29, 16, 17, 48), 'salt', 14.76, 44.28, None, 22.97, 43.81, 12.03, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:18:14.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:18:14.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:18:14.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:17:48, diff=26.987778s, valid=True
2026-05-29T16:18:14.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:18:14.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:18:14.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:18:12, diff=2.990557s, valid=True
2026-05-29T16:18:14.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:18:14.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:18:14.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:17:46, diff=28.997144s, valid=True
2026-05-29T16:18:14.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:18:14.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:18:14.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:18:14.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:18:14.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:18:14.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T16:18:15.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:18:12, diff=3.000167s, valid=True
2026-05-29T16:18:15.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:18:15.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:18:15.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:18:15.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996937.000829s, valid=True
2026-05-29T16:18:15.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:18:15.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:18:15.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:18:15.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:18:15.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:18:15.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:18:15.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:18:15.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:18:15.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:18:15.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:18:15.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:18:15.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:18:15.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:18:15.332 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:18:15.554 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:18:15.918 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:18:16.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:18:16.018 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:18:16.018 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:18:16.183 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:18:16.183 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:18:46.213 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:18:46.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:18:46.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:18:46.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:18:46.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:18:46.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:18:46.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-05-29T16:18:46.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:18:46.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-05-29T16:18:46.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:18:46.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:18:46.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:18:46.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-05-29T16:18:49.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-05-29T16:18:49.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:18:49.051 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:18:49.051 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:18:49.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:18:49.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:18:49.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:18:49.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:18:49.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:18:49.083 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:18:49.083 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:18:49.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:18:49.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:18:49.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:18:49.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:18:49.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:18:49.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:18:49.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:18:49.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:18:49.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:18:49.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:18:49.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:18:49.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:18:49.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:18:49
2026-05-29T16:18:49.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72294, datetime.datetime(2026, 5, 29, 16, 18, 49), datetime.datetime(2026, 5, 29, 16, 18, 48), 'salt', 14.83, 44.78, None, 20.18, 34.57, 11.88, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:18:49.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:18:49.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:18:49.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:18:48, diff=1.415554s, valid=True
2026-05-29T16:18:49.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:18:49.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:18:49.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:19:12, diff=-22.579683s, valid=True
2026-05-29T16:18:49.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:18:49.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:18:49.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:18:46, diff=3.427441s, valid=True
2026-05-29T16:18:49.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:18:49.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:18:49.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:18:49.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:18:49.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:18:49.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:18:49.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:19:12, diff=-22.569486s, valid=True
2026-05-29T16:18:49.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:18:49.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:18:49.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:18:49.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=996971.431191s, valid=True
2026-05-29T16:18:49.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:18:49.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:18:49.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:18:49.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:18:49.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:18:49.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:18:49.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:18:49.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:18:49.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:18:49.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:18:49.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:18:49.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:18:49.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:18:49.837 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:18:50.089 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:18:50.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:18:50.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:18:50.558 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:18:50.558 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:18:50.813 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:18:50.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:19:20.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:19:20.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:19:20.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:19:20.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:19:20.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:19:21.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:19:21.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-05-29T16:19:21.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:19:21.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-05-29T16:19:21.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:19:21.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:19:21.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:19:21.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-05-29T16:19:23.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-05-29T16:19:23.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:19:23.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:19:23.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:19:23.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:19:23.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:19:23.540 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:19:23.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:19:23.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:19:23.541 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:19:23.541 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:19:23.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:19:23.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:19:23.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:19:23.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:19:23.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:19:23.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:19:23.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:19:23.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T16:19:23.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:19:23.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:19:23.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:19:23.795 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:19:23.853 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:19:19
2026-05-29T16:19:23.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72295, datetime.datetime(2026, 5, 29, 16, 19, 19), datetime.datetime(2026, 5, 29, 16, 19, 18), 'salt', 14.86, 45.17, None, 23.39, 42.33, 11.75, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:19:23.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:19:23.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:19:23.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:19:18, diff=5.859413s, valid=True
2026-05-29T16:19:23.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:19:23.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:19:23.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:19:12, diff=11.862265s, valid=True
2026-05-29T16:19:23.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:19:23.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:19:23.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:19:16, diff=7.868991s, valid=True
2026-05-29T16:19:23.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:19:23.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:19:23.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:19:23.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:19:23.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:19:23.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T16:19:23.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:19:12, diff=11.872026s, valid=True
2026-05-29T16:19:23.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:19:23.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:19:23.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:19:23.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997005.872691s, valid=True
2026-05-29T16:19:23.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:19:23.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:19:23.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:19:23.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:19:23.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:19:23.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:19:23.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:19:23.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:19:23.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:19:24.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:19:24.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:19:24.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:19:24.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:19:24.210 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:19:24.446 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:19:24.807 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:19:24.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:19:24.910 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:19:24.910 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:19:25.263 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:19:25.263 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:19:55.292 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:19:55.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:19:55.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:19:55.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:19:55.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:19:55.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:19: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-05-29T16:19:55.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:19: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-05-29T16:19:55.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:19:55.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:19:55.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:19:55.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-05-29T16:19:58.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T16:19:58.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:19:58.141 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:19:58.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:19:58.150 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:19:58.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:19:58.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:19:58.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:19:58.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:19:58.163 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:19:58.163 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:19:58.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:19:58.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:19:58.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:19:58.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:19:58.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:19:58.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T16:19:58.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:19:58.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T16:19:58.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:19:58.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:19:58.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:19:58.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:19:58.482 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:19:49
2026-05-29T16:19:58.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72296, datetime.datetime(2026, 5, 29, 16, 19, 49), datetime.datetime(2026, 5, 29, 16, 19, 49), 'salt', 14.83, 44.81, None, 22.58, 42.66, 11.87, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:19:58.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:19:58.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:19:58.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:19:49, diff=9.4886s, valid=True
2026-05-29T16:19:58.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:19:58.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T16:19:58.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:20:12, diff=-13.508527s, valid=True
2026-05-29T16:19:58.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:19:58.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:19:58.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:19:47, diff=11.498189s, valid=True
2026-05-29T16:19:58.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:19:58.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:19:58.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:19:58.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:19:58.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:19:58.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T16:19:58.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:20:12, diff=-13.498791s, valid=True
2026-05-29T16:19:58.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:19:58.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:19:58.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:19:58.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997040.501869s, valid=True
2026-05-29T16:19:58.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:19:58.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:19:58.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:19:58.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:19:58.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:19:58.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:19:58.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:19:58.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:19:58.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:19:58.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:19:58.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:19:58.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:19:58.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:19:58.884 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:19:59.120 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:19:59.464 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:19:59.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:19:59.566 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:19:59.566 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:19:59.738 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:19:59.738 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:20:29.765 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:20:29.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:20:29.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:20:30.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:20:30.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:20:30.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:20:30.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-05-29T16:20:30.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:20:30.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-05-29T16:20:30.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:20:30.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:20:30.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:20:30.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-05-29T16:20:32.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-05-29T16:20:32.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:20:32.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:20:32.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:20:32.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:20:32.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:20:32.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:20:32.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:20:32.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:20:32.614 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:20:32.614 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:20:32.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:20:32.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:20:32.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:20:32.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:20:32.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:20:32.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T16:20:32.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:20:32.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T16:20:32.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:20:32.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:20:32.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:20:32.870 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:20:32.929 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:20:19
2026-05-29T16:20:32.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72297, datetime.datetime(2026, 5, 29, 16, 20, 19), datetime.datetime(2026, 5, 29, 16, 20, 19), 'salt', 14.76, 44.91, None, 23.36, 38.37, 11.83, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:20:32.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:20:32.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:20:32.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:20:19, diff=13.935462s, valid=True
2026-05-29T16:20:32.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:20:32.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T16:20:32.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:20:12, diff=20.938474s, valid=True
2026-05-29T16:20:32.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:20:32.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:20:32.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:20:19, diff=13.945646s, valid=True
2026-05-29T16:20:32.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:20:32.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:20:32.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:20:32.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:20:32.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:20:32.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T16:20:32.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:20:12, diff=20.948858s, valid=True
2026-05-29T16:20:32.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:20:32.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:20:32.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:20:32.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997074.949547s, valid=True
2026-05-29T16:20:32.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:20:32.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:20:32.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:20:32.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:20:32.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:20:33.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:20:33.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:20:33.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:20:33.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:20:33.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:20:33.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:20:33.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:20:33.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:20:33.267 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:20:33.484 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:20:33.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:20:33.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:20:33.935 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:20:33.935 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:20:34.002 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:20:34.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:21:04.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:21:04.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:21:04.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:21:04.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:21:04.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:21:04.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:21:04.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T16:21:04.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:21:04.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-05-29T16:21:04.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:21:04.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:21:04.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:21:04.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-05-29T16:21:06.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-05-29T16:21:06.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:21:06.756 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:21:06.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:21:06.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:21:06.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:21:06.777 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:21:06.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:21:06.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:21:06.778 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:21:06.778 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:21:06.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:21:06.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:21:06.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:21:06.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:21:06.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:21:06.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:21:06.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:21:07.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:21:07.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:21:07.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:21:07.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:21:07.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:21:07.099 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:20:49
2026-05-29T16:21:07.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72298, datetime.datetime(2026, 5, 29, 16, 20, 49), datetime.datetime(2026, 5, 29, 16, 20, 49), 'salt', 14.86, 44.38, None, 24.1, 29.74, 12.0, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:21:07.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:21:07.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:21:07.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:20:49, diff=18.105354s, valid=True
2026-05-29T16:21:07.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:21:07.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:21:07.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:21:12, diff=-4.891744s, valid=True
2026-05-29T16:21:07.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:21:07.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:21:07.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:20:47, diff=20.11504s, valid=True
2026-05-29T16:21:07.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:21:07.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:21:07.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:21:07.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:21:07.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:21:07.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:21:07.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:21:12, diff=-4.881888s, valid=True
2026-05-29T16:21:07.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:21:07.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:21:07.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:21:07.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997109.118805s, valid=True
2026-05-29T16:21:07.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:21:07.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:21:07.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:21:07.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:21:07.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:21:07.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:21:07.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:21:07.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:21:07.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:21:07.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:21:07.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:21:07.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:21:07.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:21:07.506 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:21:07.722 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:21:08.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:21:08.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:21:08.171 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:21:08.172 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:21:08.364 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:21:08.364 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:21:38.394 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:21:38.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:21:38.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:21:39.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:21:39.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:21:39.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:21:39.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-05-29T16:21:39.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:21:39.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-05-29T16:21:39.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:21:39.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:21:39.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:21:39.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-05-29T16:21:42.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-05-29T16:21:42.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:21:42.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:21:42.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:21:42.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:21:42.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:21:42.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:21:42.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:21:42.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:21:42.291 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:21:42.291 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:21:42.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:21:42.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:21:42.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:21:42.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:21:42.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:21:42.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:21:42.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:21:42.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:21:42.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:21:42.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:21:42.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:21:42.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:21:42.613 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:21:20
2026-05-29T16:21:42.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72299, datetime.datetime(2026, 5, 29, 16, 21, 20), datetime.datetime(2026, 5, 29, 16, 21, 19), 'salt', 14.83, 44.58, None, 22.41, 17.01, 11.94, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:21:42.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:21:42.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:21:42.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:21:19, diff=23.61921s, valid=True
2026-05-29T16:21:42.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:21:42.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:21:42.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:21:12, diff=30.62204s, valid=True
2026-05-29T16:21:42.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:21:42.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:21:42.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:21:17, diff=25.628781s, valid=True
2026-05-29T16:21:42.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:21:42.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:21:42.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:21:42.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:21:42.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:21:42.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:21:42.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:21:12, diff=30.631865s, valid=True
2026-05-29T16:21:42.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:21:42.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:21:42.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:21:42.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997144.63253s, valid=True
2026-05-29T16:21:42.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:21:42.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:21:42.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:21:42.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:21:42.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:21:42.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:21:42.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:21:42.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:21:42.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:21:42.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:21:42.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:21:42.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:21:42.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:21:42.953 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:21:43.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:21:43.533 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:21:43.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:21:43.633 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:21:43.633 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:21:43.827 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:21:43.827 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:22:13.838 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:22:13.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:22:13.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:22:14.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:22:14.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:22:14.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:22:14.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-05-29T16:22:14.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:22:14.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-05-29T16:22:14.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:22:14.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:22:14.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:22:14.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-05-29T16:22:17.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-05-29T16:22:17.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:22:17.485 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:22:17.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:22:17.493 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:22:17.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:22:17.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:22:17.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:22:17.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:22:17.506 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:22:17.506 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:22:17.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:22:17.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:22:17.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:22:17.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:22:17.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:22:17.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:22:17.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:22:17.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:22:17.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:22:17.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:22:17.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:22:17.761 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:22:17.819 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:21:50
2026-05-29T16:22:17.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72300, datetime.datetime(2026, 5, 29, 16, 21, 50), datetime.datetime(2026, 5, 29, 16, 21, 49), 'salt', 14.96, 44.68, None, 19.94, 33.42, 11.92, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:22:17.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:22:17.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:22:17.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:21:49, diff=28.826541s, valid=True
2026-05-29T16:22:17.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:22:17.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:22:17.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:22:12, diff=5.829361s, valid=True
2026-05-29T16:22:17.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:22:17.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:22:17.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:21:48, diff=29.835886s, valid=True
2026-05-29T16:22:17.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:22:17.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:22:17.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:22:17.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:22:17.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:22:17.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:22:17.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:22:12, diff=5.838884s, valid=True
2026-05-29T16:22:17.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:22:17.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:22:17.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:22:17.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997179.83954s, valid=True
2026-05-29T16:22:17.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:22:17.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:22:17.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:22:17.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:22:17.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:22:17.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:22:17.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:22:17.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:22:17.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:22:17.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:22:18.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:22:18.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:22:18.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:22:18.156 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:22:18.371 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:22:18.721 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:22:18.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:22:18.827 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:22:18.827 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:22:18.995 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:22:18.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:22:49.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:22:49.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:22:49.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:22:49.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:22:49.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:22:49.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:22:49.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-05-29T16:22:49.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:22:49.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-05-29T16:22:49.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:22:49.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:22:49.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:22:49.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-05-29T16:22:51.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-05-29T16:22:51.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:22:51.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:22:51.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:22:51.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:22:51.922 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:22:51.922 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:22:51.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:22:51.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:22:51.922 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:22:51.922 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:22:51.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:22:52.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:22:52.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:22:52.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:22:52.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:22:52.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:22:52.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:22:52.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:22:52.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:22:52.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:22:52.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:22:52.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:22:52.229 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:22:50
2026-05-29T16:22:52.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72302, datetime.datetime(2026, 5, 29, 16, 22, 50), datetime.datetime(2026, 5, 29, 16, 22, 50), 'salt', 15.06, 44.71, None, 17.5, 25.52, 11.92, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:22:52.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:22:52.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:22:52.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:22:50, diff=2.235594s, valid=True
2026-05-29T16:22:52.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:22:52.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:22:52.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:23:12, diff=-19.761572s, valid=True
2026-05-29T16:22:52.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:22:52.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:22:52.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:22:48, diff=4.245138s, valid=True
2026-05-29T16:22:52.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:22:52.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:22:52.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:22:52.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:22:52.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:22:52.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:22:52.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:23:12, diff=-19.751861s, valid=True
2026-05-29T16:22:52.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:22:52.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:22:52.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:22:52.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997214.248797s, valid=True
2026-05-29T16:22:52.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:22:52.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:22:52.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:22:52.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:22:52.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:22:52.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:22:52.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:22:52.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:22:52.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:22:52.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:22:52.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:22:52.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:22:52.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:22:52.603 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:22:52.902 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:22:53.348 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:22:53.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:22:53.457 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:22:53.457 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:22:53.614 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:22:53.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:23:23.633 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:23:23.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:23:23.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:23:23.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:23:23.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:23:24.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:23:24.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-05-29T16:23:24.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:23:24.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-05-29T16:23:24.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:23:24.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:23:24.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:23:24.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T16:23:26.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-05-29T16:23:26.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:23:26.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:23:26.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:23:26.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:23:26.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:23:26.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:23:26.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:23:26.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:23:26.765 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:23:26.765 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:23:26.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:23:26.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:23:26.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:23:26.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:23:26.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:23:26.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:23:26.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:23:27.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:23:27.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:23:27.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:23:27.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:23:27.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:23:27.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:23:20
2026-05-29T16:23:27.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72303, datetime.datetime(2026, 5, 29, 16, 23, 20), datetime.datetime(2026, 5, 29, 16, 23, 20), 'salt', 15.09, 44.81, None, 17.47, 24.96, 11.89, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:23:27.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:23:27.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:23:27.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:23:20, diff=7.109273s, valid=True
2026-05-29T16:23:27.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:23:27.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:23:27.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:23:12, diff=15.112102s, valid=True
2026-05-29T16:23:27.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:23:27.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:23:27.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:23:18, diff=9.118815s, valid=True
2026-05-29T16:23:27.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:23:27.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:23:27.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:23:27.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:23:27.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:23:27.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:23:27.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:23:12, diff=15.121835s, valid=True
2026-05-29T16:23:27.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:23:27.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:23:27.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:23:27.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997249.12248s, valid=True
2026-05-29T16:23:27.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:23:27.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:23:27.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:23:27.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:23:27.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:23:27.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:23:27.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:23:27.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:23:27.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:23:27.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:23:27.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:23:27.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:23:27.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:23:27.436 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:23:27.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:23:27.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:23:28.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:23:28.097 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:23:28.097 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:23:28.258 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:23:28.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:23:58.289 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:23:58.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:23:58.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:23:58.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:23:58.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:23:58.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:23:58.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-05-29T16:23:58.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:23:58.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-05-29T16:23:58.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:23:58.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:23:58.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:23:58.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-05-29T16:24:02.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-05-29T16:24:02.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:24:02.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:24:02.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:24:02.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:24:02.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:24:02.085 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:24:02.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:24:02.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:24:02.085 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:24:02.085 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:24:02.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:24:02.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:24:02.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:24:02.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:24:02.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:24:02.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:24:02.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:24:02.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:24:02.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:24:02.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:24:02.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:24:02.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:24:02.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:23:51
2026-05-29T16:24:02.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72304, datetime.datetime(2026, 5, 29, 16, 23, 51), datetime.datetime(2026, 5, 29, 16, 23, 50), 'salt', 15.13, 44.64, None, 21.77, 31.38, 11.95, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:24:02.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:24:02.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:24:02.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:23:50, diff=12.401216s, valid=True
2026-05-29T16:24:02.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:24:02.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:24:02.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:24:12, diff=-9.595947s, valid=True
2026-05-29T16:24:02.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:24:02.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:24:02.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:23:49, diff=13.410753s, valid=True
2026-05-29T16:24:02.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:24:02.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:24:02.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:24:02.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:24:02.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:24:02.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:24:02.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:24:12, diff=-9.586228s, valid=True
2026-05-29T16:24:02.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:24:02.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:24:02.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:24:02.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997284.414483s, valid=True
2026-05-29T16:24:02.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:24:02.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:24:02.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:24:02.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:24:02.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:24:02.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:24:02.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:24:02.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:24:02.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:24:02.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:24:02.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:24:02.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:24:02.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:24:02.731 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:24:03.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:24:03.382 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:24:03.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:24:03.481 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:24:03.481 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:24:03.549 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:24:03.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:24:33.566 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:24:33.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:24:33.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:24:33.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:24:33.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:24:34.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:24:34.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-05-29T16:24:34.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:24:34.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-05-29T16:24:34.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:24:34.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:24:34.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:24:34.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-05-29T16:24:36.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-05-29T16:24:36.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:24:36.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:24:36.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:24:36.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:24:36.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:24:36.517 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:24:36.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:24:36.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:24:36.517 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:24:36.517 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:24:36.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:24:36.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:24:36.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:24:36.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:24:36.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:24:36.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:24:36.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:24:36.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:24:36.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:24:36.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:24:36.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:24:36.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:24:36.827 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:24:21
2026-05-29T16:24:36.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72305, datetime.datetime(2026, 5, 29, 16, 24, 21), datetime.datetime(2026, 5, 29, 16, 24, 21), 'salt', 15.13, 44.68, None, 20.18, 39.59, 11.94, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:24:36.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:24:36.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:24:36.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:24:21, diff=15.834095s, valid=True
2026-05-29T16:24:36.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:24:36.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:24:36.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:24:12, diff=24.836962s, valid=True
2026-05-29T16:24:36.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:24:36.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:24:36.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:24:20, diff=16.843648s, valid=True
2026-05-29T16:24:36.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:24:36.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:24:36.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:24:36.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:24:36.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:24:36.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:24:36.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:24:12, diff=24.84669s, valid=True
2026-05-29T16:24:36.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:24:36.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:24:36.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:24:36.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997318.847387s, valid=True
2026-05-29T16:24:36.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:24:36.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:24:36.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:24:36.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:24:36.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:24:36.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:24:36.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:24:36.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:24:36.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:24:36.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:24:37.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:24:37.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:24:37.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:24:37.162 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:24:37.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:24:37.721 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:24:37.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:24:37.821 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:24:37.821 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:24:37.970 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:24:37.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:25:08.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:25:08.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:25:08.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:25:08.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:25:08.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:25:08.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:25:08.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-05-29T16:25:08.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:25:08.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-05-29T16:25:08.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:25:08.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:25:08.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:25:08.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-05-29T16:25: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-05-29T16:25:10.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:25:10.861 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:25:10.861 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:25:10.869 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:25:10.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:25:10.882 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:25:10.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:25:10.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:25:10.882 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:25:10.882 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:25:10.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:25:10.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:25:10.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:25:11.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:25:11.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:25:11.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:25:11.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:25:11.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:25:11.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:25:11.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:25:11.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:25:11.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:25:11.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:24:51
2026-05-29T16:25:11.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72306, datetime.datetime(2026, 5, 29, 16, 24, 51), datetime.datetime(2026, 5, 29, 16, 24, 51), 'salt', 14.99, 45.04, None, 23.61, 35.55, 11.8, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:25:11.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:25:11.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:25:11.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:24:51, diff=20.202429s, valid=True
2026-05-29T16:25:11.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:25:11.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:25:11.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:25:12, diff=-0.794707s, valid=True
2026-05-29T16:25:11.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:25:11.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:25:11.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:24:49, diff=22.211927s, valid=True
2026-05-29T16:25:11.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:25:11.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:25:11.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:25:11.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:25:11.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:25:11.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:25:11.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:25:12, diff=-0.784973s, valid=True
2026-05-29T16:25:11.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:25:11.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:25:11.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:25:11.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997353.215687s, valid=True
2026-05-29T16:25:11.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:25:11.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:25:11.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:25:11.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:25:11.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:25:11.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:25:11.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:25:11.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:25:11.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:25:11.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:25:11.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:25:11.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:25:11.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:25:11.600 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:25:11.814 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:25:12.169 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:25:12.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:25:12.271 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:25:12.271 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:25:12.440 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:25:12.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:25:42.470 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:25:42.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:25:42.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:25:42.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:25:42.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:25:42.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:25:42.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-05-29T16:25:42.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:25:42.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-05-29T16:25:42.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:25:42.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:25:42.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:25:42.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-05-29T16:25:45.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-05-29T16:25:45.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:25:45.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:25:45.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:25:45.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:25:45.444 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:25:45.444 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:25:45.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:25:45.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:25:45.444 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:25:45.444 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:25:45.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:25:45.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:25:45.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:25:45.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:25:45.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:25:45.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:25:45.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:25:45.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:25:45.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:25:45.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:25:45.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:25:45.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:25:45.785 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:25:21
2026-05-29T16:25:45.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72307, datetime.datetime(2026, 5, 29, 16, 25, 21), datetime.datetime(2026, 5, 29, 16, 25, 21), 'salt', 15.06, 44.94, None, 21.07, 35.91, 11.85, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:25:45.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:25:45.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:25:45.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:25:21, diff=24.79194s, valid=True
2026-05-29T16:25:45.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:25:45.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:25:45.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:25:12, diff=33.794778s, valid=True
2026-05-29T16:25:45.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:25:45.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:25:45.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:25:19, diff=26.801519s, valid=True
2026-05-29T16:25:45.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:25:45.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:25:45.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:25:45.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:25:45.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:25:45.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:25:45.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:25:12, diff=33.804596s, valid=True
2026-05-29T16:25:45.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:25:45.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:25:45.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:25:45.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997387.805264s, valid=True
2026-05-29T16:25:45.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:25:45.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:25:45.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:25:45.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:25:45.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:25:45.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:25:45.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:25:45.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:25:45.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:25:45.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:25:46.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:25:46.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:25:46.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:25:46.131 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:25:46.359 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:25:46.731 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:25:46.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:25:46.831 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:25:46.831 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:25:47.086 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:25:47.086 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:26:17.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:26:17.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:26:17.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:26:17.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:26:17.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:26:17.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:26:17.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-05-29T16:26:17.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:26:17.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-05-29T16:26:17.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:26:17.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:26:17.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:26:17.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-05-29T16:26:20.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-05-29T16:26:20.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:26:20.169 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:26:20.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:26:20.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:26:20.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:26:20.191 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:26:20.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:26:20.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:26:20.191 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:26:20.192 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:26:20.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:26:20.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:26:20.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:26:20.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:26:20.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:26:20.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:26:20.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:26:20.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:26:20.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:26:20.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:26:20.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:26:20.449 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:26:20.508 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:25:52
2026-05-29T16:26:20.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72308, datetime.datetime(2026, 5, 29, 16, 25, 52), datetime.datetime(2026, 5, 29, 16, 25, 51), 'salt', 15.03, 45.77, None, 19.8, 50.65, 11.59, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:26:20.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:26:20.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:26:20.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:25:51, diff=29.515751s, valid=True
2026-05-29T16:26:20.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:26:20.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:26:20.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:26:12, diff=8.518778s, valid=True
2026-05-29T16:26:20.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:26:20.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:26:20.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:25:49, diff=31.525444s, valid=True
2026-05-29T16:26:20.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:26:20.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:26:20.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:26:20.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:26:20.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:26:20.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:26:20.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:26:12, diff=8.528507s, valid=True
2026-05-29T16:26:20.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:26:20.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:26:20.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:26:20.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997422.529208s, valid=True
2026-05-29T16:26:20.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:26:20.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:26:20.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:26:20.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:26:20.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:26:20.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:26:20.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:26:20.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:26:20.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:26:20.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:26:20.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:26:20.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:26:20.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:26:20.917 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:26:21.138 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:26:21.495 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:26:21.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:26:21.598 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:26:21.598 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:26:21.770 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:26:21.770 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:26:51.773 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:26:51.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:26:51.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:26:51.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:26:51.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:26:52.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:26:52.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-05-29T16:26:52.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:26:52.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-05-29T16:26:52.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:26:52.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:26:52.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:26:52.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-05-29T16:26:55.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-05-29T16:26:55.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:26:55.197 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:26:55.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:26:55.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:26:55.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:26:55.217 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:26:55.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:26:55.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:26:55.217 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:26:55.217 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:26:55.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:26:55.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:26:55.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:26:55.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:26:55.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:26:55.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:26:55.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:26:55.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:26:55.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:26:55.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:26:55.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:26:55.482 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:26:55.540 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:26:52
2026-05-29T16:26:55.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72310, datetime.datetime(2026, 5, 29, 16, 26, 52), datetime.datetime(2026, 5, 29, 16, 26, 52), 'salt', 14.99, 46.24, None, 18.14, 27.86, 11.43, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:26:55.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:26:55.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:26:55.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:26:52, diff=3.546353s, valid=True
2026-05-29T16:26:55.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:26:55.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:26:55.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:27:12, diff=-16.450807s, valid=True
2026-05-29T16:26:55.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:26:55.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:26:55.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:26:50, diff=5.555842s, valid=True
2026-05-29T16:26:55.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:26:55.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:26:55.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:26:55.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:26:55.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:26:55.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:26:55.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:27:12, diff=-16.441115s, valid=True
2026-05-29T16:26:55.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:26:55.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:26:55.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:26:55.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997457.559535s, valid=True
2026-05-29T16:26:55.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:26:55.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:26:55.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:26:55.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:26:55.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:26:55.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:26:55.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:26:55.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:26:55.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:26:55.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:26:55.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:26:55.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:26:55.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:26:55.886 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:26:56.109 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:26:56.473 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:26:56.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:26:56.575 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:26:56.575 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:26:56.772 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:26:56.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:27:26.802 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:27:26.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:27:26.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:27:27.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:27:27.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:27:27.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:27:27.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-05-29T16:27:27.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:27:27.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-05-29T16:27:27.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:27:27.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:27:27.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:27:27.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-05-29T16:27:30.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-05-29T16:27:30.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:27:30.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:27:30.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:27:30.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:27:30.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:27:30.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:27:30.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:27:30.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:27:30.105 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:27:30.105 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:27:30.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:27:30.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:27:30.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:27:30.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:27:30.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:27:30.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:27:30.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:27:30.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:27:30.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:27:30.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:27:30.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:27:30.363 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:27:30.423 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:27:22
2026-05-29T16:27:30.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72311, datetime.datetime(2026, 5, 29, 16, 27, 22), datetime.datetime(2026, 5, 29, 16, 27, 22), 'salt', 14.86, 45.67, None, 17.93, 30.35, 11.6, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:27:30.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:27:30.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:27:30.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:27:22, diff=8.429269s, valid=True
2026-05-29T16:27:30.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:27:30.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:27:30.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:27:12, diff=18.432143s, valid=True
2026-05-29T16:27:30.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:27:30.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:27:30.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:27:20, diff=10.438868s, valid=True
2026-05-29T16:27:30.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:27:30.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:27:30.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:27:30.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:27:30.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:27:30.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:27:30.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:27:12, diff=18.441919s, valid=True
2026-05-29T16:27:30.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:27:30.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:27:30.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:27:30.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997492.442575s, valid=True
2026-05-29T16:27:30.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:27:30.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:27:30.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:27:30.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:27:30.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:27:30.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:27:30.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:27:30.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:27:30.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:27:30.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:27:30.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:27:30.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:27:30.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:27:30.832 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:27:31.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:27:31.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:27:31.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:27:31.564 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:27:31.564 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:27:31.734 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:27:31.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:28:01.758 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:28:01.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:28:01.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:28:01.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:28:01.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:28:02.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:28:02.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T16:28:02.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:28:02.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-05-29T16:28:02.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:28:02.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:28:02.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:28:02.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-05-29T16:28:04.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-05-29T16:28:04.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:28:04.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:28:04.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:28:04.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:28:04.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:28:04.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:28:04.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:28:04.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:28:04.818 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:28:04.818 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:28:04.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:28:04.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:28:04.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:28:04.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:28:04.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:28:05.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:28:05.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:28:05.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:28:05.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:28:05.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:28:05.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:28:05.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:28:05.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:27:52
2026-05-29T16:28:05.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72312, datetime.datetime(2026, 5, 29, 16, 27, 52), datetime.datetime(2026, 5, 29, 16, 27, 52), 'salt', 14.99, 44.84, None, 21.81, 30.89, 11.87, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:28:05.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:28:05.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:28:05.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:27:52, diff=13.137978s, valid=True
2026-05-29T16:28:05.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:28:05.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:28:05.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:28:12, diff=-6.859159s, valid=True
2026-05-29T16:28:05.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:28:05.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:28:05.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:27:50, diff=15.147375s, valid=True
2026-05-29T16:28:05.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:28:05.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:28:05.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:28:05.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:28:05.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:28:05.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:28:05.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:28:12, diff=-6.849589s, valid=True
2026-05-29T16:28:05.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:28:05.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:28:05.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:28:05.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997527.151078s, valid=True
2026-05-29T16:28:05.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:28:05.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:28:05.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:28:05.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:28:05.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:28:05.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:28:05.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:28:05.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:28:05.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:28:05.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:28:05.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:28:05.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:28:05.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:28:05.469 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:28:05.684 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:28:06.033 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:28:06.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:28:06.134 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:28:06.135 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:28:07.824 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:28:07.824 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:28:37.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:28:37.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:28:37.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:28:38.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:28:38.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:28:38.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:28:38.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T16:28:38.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:28:38.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T16:28:38.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:28:38.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:28:38.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:28:38.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-05-29T16:28:41.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-05-29T16:28:41.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:28:41.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:28:41.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:28:41.051 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:28:41.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:28:41.063 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:28:41.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:28:41.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:28:41.064 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:28:41.064 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:28:41.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:28:41.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:28:41.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:28:41.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:28:41.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:28:41.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:28:41.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:28:41.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:28:41.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:28:41.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:28:41.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:28:41.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:28:41.376 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:28:23
2026-05-29T16:28:41.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72313, datetime.datetime(2026, 5, 29, 16, 28, 23), datetime.datetime(2026, 5, 29, 16, 28, 22), 'salt', 15.09, 44.25, None, 25.26, 36.14, 12.07, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:28:41.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:28:41.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:28:41.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:28:22, diff=19.382754s, valid=True
2026-05-29T16:28:41.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:28:41.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:28:41.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:28:12, diff=29.385594s, valid=True
2026-05-29T16:28:41.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:28:41.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:28:41.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:28:21, diff=20.392295s, valid=True
2026-05-29T16:28:41.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:28:41.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:28:41.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:28:41.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:28:41.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:28:41.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:28:41.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:28:12, diff=29.395376s, valid=True
2026-05-29T16:28:41.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:28:41.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:28:41.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:28:41.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997563.396046s, valid=True
2026-05-29T16:28:41.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:28:41.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:28:41.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:28:41.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:28:41.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:28:41.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:28:41.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:28:41.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:28:41.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:28:41.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:28:41.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:28:41.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:28:41.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:28:41.716 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:28:41.934 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:28:42.283 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:28:42.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:28:42.384 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:28:42.384 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:28:42.560 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:28:42.561 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:29:12.568 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:29:12.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:29:12.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:29:12.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:29:12.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:29:13.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:29:13.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-05-29T16:29:13.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:29:13.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-05-29T16:29:13.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:29:13.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:29:13.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:29:13.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-05-29T16:29:16.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-05-29T16:29:16.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:29:16.246 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:29:16.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:29:16.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:29:16.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:29:16.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:29:16.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:29:16.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:29:16.269 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:29:16.269 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:29:16.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:29:16.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:29:16.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:29:16.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:29:16.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:29:16.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:29:16.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:29:16.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:29:16.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:29:16.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:29:16.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:29:16.534 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:29:16.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:28:53
2026-05-29T16:29:16.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72314, datetime.datetime(2026, 5, 29, 16, 28, 53), datetime.datetime(2026, 5, 29, 16, 28, 52), 'salt', 14.96, 44.54, None, 22.97, 26.11, 11.96, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:29:16.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:29:16.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:29:16.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:28:52, diff=24.600895s, valid=True
2026-05-29T16:29:16.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:29:16.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:29:16.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:29:12, diff=4.603722s, valid=True
2026-05-29T16:29:16.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:29:16.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:29:16.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:28:53, diff=23.610537s, valid=True
2026-05-29T16:29:16.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:29:16.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:29:16.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:29:16.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:29:16.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:29:16.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:29:16.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:29:12, diff=4.613571s, valid=True
2026-05-29T16:29:16.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:29:16.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:29:16.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:29:16.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997598.614224s, valid=True
2026-05-29T16:29:16.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:29:16.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:29:16.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:29:16.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:29:16.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:29:16.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:29:16.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:29:16.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:29:16.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:29:16.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:29:16.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:29:16.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:29:16.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:29:16.937 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:29:17.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:29:17.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:29:17.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:29: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-05-29T16:29: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-05-29T16:29:17.869 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:29:17.869 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:29:47.900 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:29:47.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:29:47.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:29:48.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:29:48.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:29:48.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:29: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-05-29T16:29:48.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:29:48.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-05-29T16:29:48.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:29:48.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:29:48.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:29:48.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-05-29T16:29:51.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T16:29:51.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:29:51.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:29:51.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:29:51.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:29:51.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:29:51.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:29:51.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:29:51.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:29:51.284 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:29:51.284 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:29:51.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:29:51.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:29:51.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:29:51.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:29:51.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:29:51.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:29:51.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:29:51.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:29:51.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:29:51.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:29:51.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:29:51.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:29:51.609 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:29:23
2026-05-29T16:29:51.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72315, datetime.datetime(2026, 5, 29, 16, 29, 23), datetime.datetime(2026, 5, 29, 16, 29, 23), 'salt', 14.93, 44.01, None, 22.44, 30.21, 12.13, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:29:51.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:29:51.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:29:51.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:29:23, diff=28.616008s, valid=True
2026-05-29T16:29:51.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:29:51.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:29:51.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:29:12, diff=39.619947s, valid=True
2026-05-29T16:29:51.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:29:51.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:29:51.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:29:21, diff=30.626658s, valid=True
2026-05-29T16:29:51.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:29:51.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:29:51.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:29:51.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:29:51.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:29:51.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:29:51.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:29:12, diff=39.629796s, valid=True
2026-05-29T16:29:51.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:29:51.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:29:51.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:29:51.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997633.630454s, valid=True
2026-05-29T16:29:51.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:29:51.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:29:51.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:29:51.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:29:51.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:29:51.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:29:51.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:29:51.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:29:51.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:29:51.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:29:51.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:29:51.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:29:51.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:29:51.960 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:29:52.207 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:29:52.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:29:52.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:29: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-05-29T16:29: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-05-29T16:29:52.919 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:29:52.919 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:30:22.931 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:30:22.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:30:22.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:30:23.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:30:23.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:30:23.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:30:23.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-05-29T16:30:23.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:30:23.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-05-29T16:30:23.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:30:23.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:30:23.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:30:23.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-05-29T16:30:26.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-05-29T16:30:26.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:30:26.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:30:26.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:30:26.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:30:26.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:30:26.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:30:26.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:30:26.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:30:26.846 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:30:26.846 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:30:26.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:30:26.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:30:26.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:30:27.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:30:27.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:30:27.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:30:27.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:30:27.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:30:27.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:30:27.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:30:27.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:30:27.117 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:30:27.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:30:23
2026-05-29T16:30:27.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72317, datetime.datetime(2026, 5, 29, 16, 30, 23), datetime.datetime(2026, 5, 29, 16, 30, 23), 'salt', 14.9, 44.08, None, 22.12, 35.55, 12.11, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:30:27.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:30:27.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:30:27.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:30:23, diff=4.195357s, valid=True
2026-05-29T16:30:27.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:30:27.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:30:27.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:30:12, diff=15.198259s, valid=True
2026-05-29T16:30:27.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:30:27.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:30:27.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:30:22, diff=5.205146s, valid=True
2026-05-29T16:30:27.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:30:27.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:30:27.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:30:27.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:30:27.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:30:27.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:30:27.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:30:12, diff=15.208232s, valid=True
2026-05-29T16:30:27.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:30:27.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:30:27.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:30:27.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997669.20891s, valid=True
2026-05-29T16:30:27.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:30:27.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:30:27.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:30:27.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:30:27.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:30:27.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:30:27.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:30:27.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:30:27.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:30:27.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:30:27.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:30:27.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:30:27.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:30:27.532 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:30:27.756 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:30:28.195 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:30:28.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:30:28.295 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:30:28.295 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:30:28.462 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:30:28.462 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:30:58.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:30:58.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:30:58.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:30:58.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:30:58.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:30:58.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:30:58.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-05-29T16:30:58.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:30:58.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-05-29T16:30:58.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:30:58.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:30:58.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:30:58.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-05-29T16:31:01.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-05-29T16:31:01.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:31:01.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:31:01.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:31:01.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:31:01.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:31:01.385 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:31:01.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:31:01.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:31:01.386 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:31:01.386 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:31:01.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:31:01.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:31:01.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:31:01.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:31:01.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:31:01.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:31:01.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:31:01.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:31:01.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:31:01.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:31:01.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:31:01.671 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:31:01.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:30:54
2026-05-29T16:31:01.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72318, datetime.datetime(2026, 5, 29, 16, 30, 54), datetime.datetime(2026, 5, 29, 16, 30, 53), 'salt', 14.89, 44.18, None, 21.28, 36.47, 12.07, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:31:01.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:31:01.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:31:01.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:30:53, diff=8.736962s, valid=True
2026-05-29T16:31:01.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:31:01.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:31:01.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:31:12, diff=-10.260165s, valid=True
2026-05-29T16:31:01.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:31:01.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:31:01.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:30:52, diff=9.746575s, valid=True
2026-05-29T16:31:01.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:31:01.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:31:01.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:31:01.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:31:01.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:31:01.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:31:01.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:31:12, diff=-10.250335s, valid=True
2026-05-29T16:31:01.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:31:01.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:31:01.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:31:01.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997703.750327s, valid=True
2026-05-29T16:31:01.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:31:01.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:31:01.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:31:01.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:31:01.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:31:01.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:31:01.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:31:01.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:31:01.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:31:01.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:31:01.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:31:01.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:31:02.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:31:02.066 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:31:02.282 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:31:02.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:31:02.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:31:02.735 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:31:02.735 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:31:02.911 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:31:02.911 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:31:32.925 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:31:32.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:31:32.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:31:33.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:31:33.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:31:33.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:31:33.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-05-29T16:31:33.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:31:33.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-05-29T16:31:33.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:31:33.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:31:33.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:31:33.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-05-29T16:31:35.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-05-29T16:31:35.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:31:35.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:31:35.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:31:35.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:31:35.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:31:35.756 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:31:35.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:31:35.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:31:35.756 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:31:35.756 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:31:35.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:31:35.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:31:35.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:31:35.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:31:35.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:31:35.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:31:35.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:31:36.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:31:36.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:31:36.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:31:36.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:31:36.012 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:31:36.072 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:31:24
2026-05-29T16:31:36.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72319, datetime.datetime(2026, 5, 29, 16, 31, 24), datetime.datetime(2026, 5, 29, 16, 31, 23), 'salt', 14.96, 43.62, None, 19.2, 26.03, 12.26, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:31:36.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:31:36.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:31:36.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:31:23, diff=13.078838s, valid=True
2026-05-29T16:31:36.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:31:36.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:31:36.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:31:12, diff=24.081715s, valid=True
2026-05-29T16:31:36.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:31:36.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:31:36.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:31:22, diff=14.088539s, valid=True
2026-05-29T16:31:36.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:31:36.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:31:36.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:31:36.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:31:36.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:31:36.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:31:36.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:31:12, diff=24.091592s, valid=True
2026-05-29T16:31:36.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:31:36.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:31:36.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:31:36.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997738.092264s, valid=True
2026-05-29T16:31:36.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:31:36.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:31:36.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:31:36.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:31:36.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:31:36.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:31:36.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:31:36.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:31:36.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:31:36.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:31:36.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:31:36.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:31:36.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:31:36.418 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:31:36.729 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:31:37.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:31:37.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:31:37.190 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:31:37.190 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:31:37.437 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:31:37.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:32:07.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:32:07.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:32:07.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:32:07.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:32:07.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:32:07.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:32:07.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-05-29T16:32:07.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:32:07.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-05-29T16:32:07.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:32:07.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:32:07.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:32:07.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-05-29T16:32:10.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-05-29T16:32:10.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:32:10.341 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:32:10.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:32:10.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:32:10.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:32:10.363 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:32:10.363 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:32:10.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:32:10.363 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:32:10.363 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:32:10.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:32:10.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:32:10.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:32:10.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:32:10.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:32:10.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:32:10.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:32:10.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:32:10.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:32:10.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:32:10.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:32:10.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:32:10.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:31:54
2026-05-29T16:32:10.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72320, datetime.datetime(2026, 5, 29, 16, 31, 54), datetime.datetime(2026, 5, 29, 16, 31, 54), 'salt', 14.99, 43.19, None, 20.22, 36.52, 12.4, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:32:10.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:32:10.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:32:10.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:31:54, diff=16.682035s, valid=True
2026-05-29T16:32:10.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:32:10.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:32:10.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:32:12, diff=-1.31515s, valid=True
2026-05-29T16:32:10.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:32:10.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:32:10.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:31:52, diff=18.691396s, valid=True
2026-05-29T16:32:10.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:32:10.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:32:10.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:32:10.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:32:10.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:32:10.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:32:10.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:32:12, diff=-1.305549s, valid=True
2026-05-29T16:32:10.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:32:10.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:32:10.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:32:10.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997772.695111s, valid=True
2026-05-29T16:32:10.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:32:10.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:32:10.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:32:10.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:32:10.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:32:10.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:32:10.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:32:10.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:32:10.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:32:10.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:32:10.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:32:10.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:32:10.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:32:11.009 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:32:11.222 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:32:11.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:32:11.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:32:11.672 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:32:11.672 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:32:11.838 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:32:11.838 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:32:41.868 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:32:41.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:32:41.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:32:42.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:32:42.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:32:42.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:32:42.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-05-29T16:32:42.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:32:42.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-05-29T16:32:42.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:32:42.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:32:42.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:32:42.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-05-29T16:32:44.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-05-29T16:32:44.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:32:44.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:32:44.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:32:44.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:32:44.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:32:44.948 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:32:44.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:32:44.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:32:44.949 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:32:44.949 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:32:44.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:32:45.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:32:45.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:32:45.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:32:45.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:32:45.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:32:45.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:32:45.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:32:45.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:32:45.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:32:45.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:32:45.202 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:32:45.259 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:32:24
2026-05-29T16:32:45.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72321, datetime.datetime(2026, 5, 29, 16, 32, 24), datetime.datetime(2026, 5, 29, 16, 32, 24), 'salt', 14.99, 43.65, None, 19.34, 36.98, 12.25, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:32:45.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:32:45.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:32:45.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:32:24, diff=21.266047s, valid=True
2026-05-29T16:32:45.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:32:45.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:32:45.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:32:12, diff=33.268892s, valid=True
2026-05-29T16:32:45.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:32:45.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:32:45.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:32:23, diff=22.275641s, valid=True
2026-05-29T16:32:45.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:32:45.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:32:45.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:32:45.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:32:45.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:32:45.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:32:45.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:32:12, diff=33.278669s, valid=True
2026-05-29T16:32:45.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:32:45.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:32:45.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:32:45.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997807.27932s, valid=True
2026-05-29T16:32:45.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:32:45.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:32:45.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:32:45.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:32:45.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:32:45.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:32:45.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:32:45.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:32:45.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:32:45.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:32:45.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:32:45.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:32:45.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:32:45.682 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:32:45.906 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:32:46.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:32:46.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:32:46.372 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:32:46.372 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:32:46.614 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:32:46.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:33:16.644 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:33:16.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:33:16.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:33:17.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:33:17.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:33:17.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:33:17.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-05-29T16:33:17.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:33:17.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-05-29T16:33:17.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:33:17.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:33:17.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:33:17.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-05-29T16:33:19.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-05-29T16:33:19.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:33:19.734 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:33:19.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:33:19.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:33:19.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:33:19.756 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:33:19.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:33:19.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:33:19.756 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:33:19.756 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:33:19.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:33:19.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:33:19.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:33:19.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:33:19.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:33:20.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:33:20.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:33:20.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:33:20.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:33:20.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:33:20.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:33:20.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:33:20.117 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:32:55
2026-05-29T16:33:20.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72322, datetime.datetime(2026, 5, 29, 16, 32, 55), datetime.datetime(2026, 5, 29, 16, 32, 55), 'salt', 14.93, 43.88, None, 21.63, 34.5, 12.17, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:33:20.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:33:20.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:33:20.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:32:55, diff=25.123299s, valid=True
2026-05-29T16:33:20.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:33:20.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:33:20.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:33:12, diff=8.126264s, valid=True
2026-05-29T16:33:20.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:33:20.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:33:20.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:32:54, diff=26.133125s, valid=True
2026-05-29T16:33:20.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:33:20.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:33:20.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:33:20.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:33:20.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:33:20.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:33:20.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:33:12, diff=8.136323s, valid=True
2026-05-29T16:33:20.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:33:20.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:33:20.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:33:20.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997842.13702s, valid=True
2026-05-29T16:33:20.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:33:20.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:33:20.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:33:20.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:33:20.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:33:20.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:33:20.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:33:20.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:33:20.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:33:20.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:33:20.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:33:20.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:33:20.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:33:20.452 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:33:20.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:33:21.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:33:21.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:33:21.112 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:33:21.112 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:33:21.281 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:33:21.281 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:33:51.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:33:51.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:33:51.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:33:51.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:33:51.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:33:51.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:33:51.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-05-29T16:33:51.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:33:51.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-05-29T16:33:51.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:33:51.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:33:51.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:33:51.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-05-29T16:33:54.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-05-29T16:33:54.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:33:54.570 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:33:54.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:33:54.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:33:54.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:33:54.590 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:33:54.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:33:54.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:33:54.591 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:33:54.591 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:33:54.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:33:54.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:33:54.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:33:54.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:33:54.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:33:54.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:33:54.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:33:54.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:33:54.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:33:54.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:33:54.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:33:54.856 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:33:54.915 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:33:25
2026-05-29T16:33:54.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72323, datetime.datetime(2026, 5, 29, 16, 33, 25), datetime.datetime(2026, 5, 29, 16, 33, 25), 'salt', 14.86, 44.45, None, 23.36, 26.88, 11.98, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:33:54.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:33:54.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:33:54.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:33:25, diff=29.92176s, valid=True
2026-05-29T16:33:54.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:33:54.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:33:54.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:33:12, diff=42.924682s, valid=True
2026-05-29T16:33:54.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:33:54.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:33:54.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:33:23, diff=31.931318s, valid=True
2026-05-29T16:33:54.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:33:54.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:33:54.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:33:54.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:33:54.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:33:54.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:33:54.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:33:12, diff=42.934325s, valid=True
2026-05-29T16:33:54.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:33:54.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:33:54.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:33:54.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997876.934991s, valid=True
2026-05-29T16:33:54.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:33:54.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:33:54.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:33:54.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:33:54.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:33:55.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:33:55.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:33:55.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:33:55.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:33:55.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:33:55.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:33:55.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:33:55.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:33:55.339 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:33:55.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:33:55.933 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:33:56.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:33:56.043 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:33:56.043 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:33:56.211 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:33:56.212 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:34:26.216 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:34:26.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:34:26.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:34:26.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:34:26.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:34:26.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:34:26.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-05-29T16:34:26.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:34:26.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-05-29T16:34:26.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:34:26.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:34:26.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:34:26.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-05-29T16:34:29.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-05-29T16:34:29.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:34:29.039 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:34:29.039 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:34:29.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:34:29.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:34:29.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:34:29.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:34:29.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:34:29.065 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:34:29.065 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:34:29.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:34:29.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:34:29.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:34:29.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:34:29.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:34:29.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:34:29.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:34:29.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:34:29.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:34:29.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:34:29.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:34:29.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:34:29.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:34:26
2026-05-29T16:34:29.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72325, datetime.datetime(2026, 5, 29, 16, 34, 26), datetime.datetime(2026, 5, 29, 16, 34, 25), 'salt', 14.86, 45.17, None, 21.91, 27.96, 11.75, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:34:29.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:34:29.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:34:29.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:34:25, diff=4.376413s, valid=True
2026-05-29T16:34:29.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:34:29.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:34:29.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:34:12, diff=17.379249s, valid=True
2026-05-29T16:34:29.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:34:29.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:34:29.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:34:23, diff=6.385916s, valid=True
2026-05-29T16:34:29.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:34:29.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:34:29.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:34:29.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:34:29.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:34:29.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:34:29.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:34:12, diff=17.388939s, valid=True
2026-05-29T16:34:29.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:34:29.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:34:29.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:34:29.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997911.389591s, valid=True
2026-05-29T16:34:29.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:34:29.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:34:29.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:34:29.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:34:29.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:34:29.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:34:29.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:34:29.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:34:29.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:34:29.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:34:29.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:34:29.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:34:29.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:34:29.703 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:34:29.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:34:30.297 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:34:30.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:34:30.398 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:34:30.398 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:34:30.559 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:34:30.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:35:00.588 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:35:00.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:35:00.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:35:01.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:35:01.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:35:01.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:35:01.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-05-29T16:35:01.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:35:01.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-05-29T16:35:01.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:35:01.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:35:01.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:35:01.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-05-29T16:35:03.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-05-29T16:35:03.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:35:03.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:35:03.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:35:03.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:35:03.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:35:03.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:35:03.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:35:03.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:35:03.735 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:35:03.736 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:35:03.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:35:03.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:35:03.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:35:03.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:35:03.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:35:03.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:35:03.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:35:03.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:35:03.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:35:03.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:35:03.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:35:03.991 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:35:04.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:34:56
2026-05-29T16:35:04.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72326, datetime.datetime(2026, 5, 29, 16, 34, 56), datetime.datetime(2026, 5, 29, 16, 34, 56), 'salt', 14.83, 44.94, None, 22.9, 47.04, 11.83, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:35:04.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:35:04.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:35:04.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:34:56, diff=8.092168s, valid=True
2026-05-29T16:35:04.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:35:04.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:35:04.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:35:12, diff=-7.905003s, valid=True
2026-05-29T16:35:04.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:35:04.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:35:04.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:34:54, diff=10.101548s, valid=True
2026-05-29T16:35:04.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:35:04.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:35:04.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:35:04.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:35:04.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:35:04.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:35:04.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:35:12, diff=-7.895369s, valid=True
2026-05-29T16:35:04.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:35:04.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:35:04.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:35:04.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997946.105312s, valid=True
2026-05-29T16:35:04.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:35:04.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:35:04.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:35:04.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:35:04.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:35:04.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:35:04.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:35:04.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:35:04.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:35:04.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:35:04.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:35:04.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:35:04.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:35:04.422 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:35:04.677 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:35:05.030 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:35:05.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:35:05.132 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:35:05.132 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:35:05.381 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:35:05.381 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:35:35.411 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:35:35.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:35:35.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:35:35.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:35:35.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:35:36.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:35:36.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-05-29T16:35:36.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:35:36.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-05-29T16:35:36.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:35:36.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:35:36.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:35:36.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-05-29T16:35:38.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-05-29T16:35:38.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:35:38.457 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:35:38.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:35:38.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:35:38.478 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:35:38.479 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:35:38.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:35:38.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:35:38.479 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:35:38.479 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:35:38.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:35:38.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:35:38.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:35:38.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:35:38.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:35:38.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:35:38.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:35:38.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:35:38.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:35:38.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:35:38.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:35:38.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:35:38.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:35:26
2026-05-29T16:35:38.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72327, datetime.datetime(2026, 5, 29, 16, 35, 26), datetime.datetime(2026, 5, 29, 16, 35, 26), 'salt', 14.7, 44.84, None, 22.9, 29.76, 11.85, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:35:38.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:35:38.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:35:38.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:35:26, diff=12.801043s, valid=True
2026-05-29T16:35:38.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:35:38.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:35:38.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:35:12, diff=26.80394s, valid=True
2026-05-29T16:35:38.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:35:38.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:35:38.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:35:24, diff=14.810737s, valid=True
2026-05-29T16:35:38.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:35:38.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:35:38.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:35:38.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:35:38.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:35:38.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:35:38.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:35:12, diff=26.813837s, valid=True
2026-05-29T16:35:38.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:35:38.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:35:38.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:35:38.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=997980.814518s, valid=True
2026-05-29T16:35:38.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:35:38.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:35:38.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:35:38.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:35:38.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:35:38.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:35:38.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:35:38.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:35:38.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:35:38.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:35:39.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:35:39.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:35:39.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:35:39.132 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:35:39.348 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:35:39.761 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:35:39.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:35:39.868 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:35:39.868 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:35:40.045 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:35:40.045 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:36:10.074 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:36:10.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:36:10.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:36:10.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:36:10.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:36:10.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:36:10.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-05-29T16:36:10.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:36:10.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-05-29T16:36:10.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:36:10.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:36:10.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:36:10.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-05-29T16:36:12.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-05-29T16:36:12.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:36:12.929 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:36:12.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:36:12.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:36:12.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:36:12.957 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:36:12.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:36:12.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:36:12.958 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:36:12.958 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:36:12.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:36:13.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:36:13.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:36:13.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:36:13.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:36:13.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:36:13.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:36:13.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:36:13.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:36:13.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:36:13.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:36:13.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:36:13.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:35:56
2026-05-29T16:36:13.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72328, datetime.datetime(2026, 5, 29, 16, 35, 56), datetime.datetime(2026, 5, 29, 16, 35, 56), 'salt', 14.73, 44.78, None, 22.79, 31.85, 11.87, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:36:13.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:36:13.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:36:13.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:35:56, diff=17.285323s, valid=True
2026-05-29T16:36:13.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:36:13.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:36:13.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:36:12, diff=1.288206s, valid=True
2026-05-29T16:36:13.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:36:13.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:36:13.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:35:54, diff=19.294975s, valid=True
2026-05-29T16:36:13.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:36:13.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:36:13.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:36:13.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:36:13.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:36:13.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:36:13.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:36:12, diff=1.298021s, valid=True
2026-05-29T16:36:13.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:36:13.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:36:13.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:36:13.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998015.298694s, valid=True
2026-05-29T16:36:13.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:36:13.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:36:13.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:36:13.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:36:13.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:36:13.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:36:13.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:36:13.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:36:13.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:36:13.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:36:13.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:36:13.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:36:13.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:36:13.623 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:36:13.846 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:36:14.279 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:36:14.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:36:14.380 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:36:14.380 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:36:14.632 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:36:14.632 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:36:44.662 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:36:44.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:36:44.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:36:44.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:36:44.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:36:45.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:36:45.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-05-29T16:36:45.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:36:45.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T16:36:45.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:36:45.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:36:45.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:36:45.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T16:36:47.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-05-29T16:36:47.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:36:47.750 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:36:47.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:36:47.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:36:47.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:36:47.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:36:47.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:36:47.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:36:47.771 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:36:47.771 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:36:47.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:36:47.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:36:47.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:36:47.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:36:47.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:36:47.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:36:47.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:36:48.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:36:48.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:36:48.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:36:48.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:36:48.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:36:48.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:36:27
2026-05-29T16:36:48.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72329, datetime.datetime(2026, 5, 29, 16, 36, 27), datetime.datetime(2026, 5, 29, 16, 36, 26), 'salt', 14.56, 44.91, None, 18.98, 33.84, 11.81, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:36:48.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:36:48.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:36:48.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:36:26, diff=22.103994s, valid=True
2026-05-29T16:36:48.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:36:48.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:36:48.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:36:12, diff=36.106917s, valid=True
2026-05-29T16:36:48.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:36:48.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:36:48.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:36:25, diff=23.113842s, valid=True
2026-05-29T16:36:48.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:36:48.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:36:48.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:36:48.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:36:48.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:36:48.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:36:48.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:36:12, diff=36.116993s, valid=True
2026-05-29T16:36:48.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:36:48.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:36:48.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:36:48.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998050.1177s, valid=True
2026-05-29T16:36:48.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:36:48.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:36:48.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:36:48.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:36:48.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:36:48.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:36:48.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:36:48.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:36:48.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:36:48.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:36:48.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:36:48.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:36:48.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:36:48.439 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:36:48.657 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:36:49.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:36:49.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:36:49.177 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:36:49.177 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:36:49.341 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:36:49.341 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:37:19.372 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:37:19.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:37:19.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:37:19.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:37:19.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:37:19.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:37:19.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-05-29T16:37:19.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:37:19.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-05-29T16:37:19.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:37:19.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:37:19.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:37:19.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T16:37:22.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-05-29T16:37:22.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:37:22.534 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:37:22.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:37:22.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:37:22.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:37:22.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:37:22.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:37:22.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:37:22.556 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:37:22.556 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:37:22.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:37:22.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:37:22.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:37:22.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:37:22.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:37:22.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:37:22.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:37:22.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:37:22.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:37:22.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:37:22.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:37:22.816 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:37:22.879 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:36:57
2026-05-29T16:37:22.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72330, datetime.datetime(2026, 5, 29, 16, 36, 57), datetime.datetime(2026, 5, 29, 16, 36, 57), 'salt', 14.6, 45.21, None, 21.17, 38.53, 11.72, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:37:22.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:37:22.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:37:22.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:36:57, diff=25.885385s, valid=True
2026-05-29T16:37:22.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:37:22.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:37:22.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:37:12, diff=10.888229s, valid=True
2026-05-29T16:37:22.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:37:22.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:37:22.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:36:55, diff=27.894977s, valid=True
2026-05-29T16:37:22.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:37:22.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:37:22.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:37:22.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:37:22.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:37:22.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:37:22.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:37:12, diff=10.897997s, valid=True
2026-05-29T16:37:22.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:37:22.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:37:22.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:37:22.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998084.898673s, valid=True
2026-05-29T16:37:22.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:37:22.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:37:22.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:37:22.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:37:22.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:37:22.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:37:22.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:37:22.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:37:22.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:37:23.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:37:23.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:37:23.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:37:23.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:37:23.216 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:37:23.427 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:37:23.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:37:23.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:37:23.876 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:37:23.876 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:37:24.108 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:37:24.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:37:54.138 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:37:54.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:37:54.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:37:54.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:37:54.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:37:54.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:37:54.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-05-29T16:37:54.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:37:54.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-05-29T16:37:54.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:37:54.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:37:54.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:37:54.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-05-29T16:37:57.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-05-29T16:37:57.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:37:57.725 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:37:57.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:37:57.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:37:57.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:37:57.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:37:57.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:37:57.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:37:57.759 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:37:57.759 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:37:57.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:37:57.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:37:57.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:37:57.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:37:57.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:37:57.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:37:57.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:37:58.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:37:58.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:37:58.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:37:58.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:37:58.017 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:37:58.076 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:37:57
2026-05-29T16:37:58.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72332, datetime.datetime(2026, 5, 29, 16, 37, 57), datetime.datetime(2026, 5, 29, 16, 37, 57), 'salt', 14.5, 44.61, None, 21.21, 42.35, 11.9, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:37:58.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:37:58.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:37:58.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:37:57, diff=1.082557s, valid=True
2026-05-29T16:37:58.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:37:58.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:37:58.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:38:12, diff=-13.914598s, valid=True
2026-05-29T16:37:58.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:37:58.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:37:58.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:37:55, diff=3.091992s, valid=True
2026-05-29T16:37:58.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:37:58.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:37:58.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:37:58.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:37:58.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:37:58.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:37:58.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:38:12, diff=-13.904999s, valid=True
2026-05-29T16:37:58.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:37:58.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:37:58.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:37:58.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998120.095675s, valid=True
2026-05-29T16:37:58.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:37:58.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:37:58.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:37:58.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:37:58.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:37:58.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:37:58.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:37:58.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:37:58.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:37:58.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:37:58.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:37:58.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:37:58.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:37:58.412 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:37:58.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:37:59.029 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:37:59.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:37:59.128 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:37:59.128 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:37:59.422 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:37:59.422 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:38:29.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:38:29.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:38:29.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:38:29.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:38:29.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:38:29.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:38: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-05-29T16:38:29.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:38:29.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-05-29T16:38:29.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:38:29.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:38:29.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:38: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-05-29T16:38:32.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-05-29T16:38:32.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:38:32.831 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:38:32.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:38:32.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:38:32.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:38:32.861 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:38:32.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:38:32.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:38:32.861 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:38:32.861 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:38:32.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:38:32.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:38:32.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:38:33.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:38:33.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:38:33.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:38:33.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:38:33.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:38:33.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:38:33.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:38:33.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:38:33.127 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:38:33.186 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:38:28
2026-05-29T16:38:33.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72333, datetime.datetime(2026, 5, 29, 16, 38, 28), datetime.datetime(2026, 5, 29, 16, 38, 27), 'salt', 14.46, 44.98, None, 20.64, 41.04, 11.78, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:38:33.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:38:33.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:38:33.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:38:27, diff=6.193091s, valid=True
2026-05-29T16:38:33.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:38:33.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:38:33.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:38:12, diff=21.195915s, valid=True
2026-05-29T16:38:33.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:38:33.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:38:33.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:38:25, diff=8.202495s, valid=True
2026-05-29T16:38:33.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:38:33.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:38:33.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:38:33.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:38:33.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:38:33.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:38:33.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:38:12, diff=21.205556s, valid=True
2026-05-29T16:38:33.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:38:33.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:38:33.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:38:33.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998155.206221s, valid=True
2026-05-29T16:38:33.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:38:33.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:38:33.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:38:33.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:38:33.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:38:33.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:38:33.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:38:33.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:38:33.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:38:33.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:38:33.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:38:33.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:38:33.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:38:33.522 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:38:33.752 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:38:34.092 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:38:34.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:38:34.191 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:38:34.191 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:38:34.356 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:38:34.356 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:39:04.367 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:39:04.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:39:04.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:39:04.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:39:04.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:39:05.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:39:05.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-05-29T16:39:05.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:39:05.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-05-29T16:39:05.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:39:05.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:39:05.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:39:05.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-05-29T16:39:07.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-05-29T16:39:07.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:39:07.450 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:39:07.450 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:39:07.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:39:07.471 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:39:07.472 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:39:07.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:39:07.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:39:07.472 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:39:07.472 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:39:07.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:39:07.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:39:07.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:39:07.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:39:07.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:39:07.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:39:07.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:39:07.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:39:07.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:39:07.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:39:07.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:39:07.728 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:39:07.792 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:38:58
2026-05-29T16:39:07.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72334, datetime.datetime(2026, 5, 29, 16, 38, 58), datetime.datetime(2026, 5, 29, 16, 38, 57), 'salt', 14.33, 44.28, None, 21.98, 44.28, 11.99, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:39:07.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:39:07.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:39:07.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:38:57, diff=10.798704s, valid=True
2026-05-29T16:39:07.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:39:07.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:39:07.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:39:12, diff=-4.198482s, valid=True
2026-05-29T16:39:07.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:39:07.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:39:07.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:38:56, diff=11.80816s, valid=True
2026-05-29T16:39:07.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:39:07.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:39:07.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:39:07.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:39:07.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:39:07.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:39:07.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:39:12, diff=-4.188809s, valid=True
2026-05-29T16:39:07.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:39:07.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:39:07.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:39:07.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998189.81188s, valid=True
2026-05-29T16:39:07.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:39:07.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:39:07.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:39:07.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:39:07.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:39:07.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:39:07.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:39:07.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:39:07.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:39:07.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:39:08.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:39:08.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:39:08.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:39:08.198 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:39:08.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:39:08.739 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:39:08.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:39:08.837 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:39:08.837 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:39:09.005 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:39:09.005 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:39:39.035 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:39:39.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:39:39.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:39:39.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:39:39.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:39:39.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:39:39.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-05-29T16:39:39.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:39:39.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-05-29T16:39:39.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:39:39.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:39:39.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:39:39.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-05-29T16:39:42.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-05-29T16:39:42.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:39:42.019 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:39:42.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:39:42.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:39:42.039 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:39:42.039 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:39:42.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:39:42.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:39:42.039 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:39:42.039 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:39:42.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:39:42.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:39:42.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:39:42.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:39:42.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:39:42.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:39:42.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:39:42.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:39:42.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:39:42.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:39:42.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:39:42.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:39:42.350 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:39:28
2026-05-29T16:39:42.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72335, datetime.datetime(2026, 5, 29, 16, 39, 28), datetime.datetime(2026, 5, 29, 16, 39, 28), 'salt', 14.2, 45.14, None, 21.42, 30.21, 11.71, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:39:42.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:39:42.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:39:42.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:39:28, diff=14.35619s, valid=True
2026-05-29T16:39:42.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:39:42.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:39:42.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:39:12, diff=30.359067s, valid=True
2026-05-29T16:39:42.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:39:42.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:39:42.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:39:26, diff=16.365777s, valid=True
2026-05-29T16:39:42.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:39:42.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:39:42.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:39:42.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:39:42.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:39:42.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:39:42.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:39:12, diff=30.368846s, valid=True
2026-05-29T16:39:42.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:39:42.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:39:42.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:39:42.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998224.3695s, valid=True
2026-05-29T16:39:42.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:39:42.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:39:42.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:39:42.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:39:42.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:39:42.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:39:42.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:39:42.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:39:42.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:39:42.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:39:42.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:39:42.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:39:42.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:39:42.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:39:42.897 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:39:43.237 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:39:43.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:39:43.335 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:39:43.335 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:39:43.589 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:39:43.589 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:40:13.619 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:40:13.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:40:13.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:40:14.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:40:14.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:40:14.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:40:14.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-05-29T16:40:14.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:40:14.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-05-29T16:40:14.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:40:14.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:40:14.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:40:14.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-05-29T16:40:16.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-05-29T16:40:16.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:40:16.853 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:40:16.853 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:40:16.864 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:40:16.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:40:16.877 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:40:16.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:40:16.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:40:16.878 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:40:16.878 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:40:16.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:40:17.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:40:17.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:40:17.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:40:17.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:40:17.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:40:17.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:40:17.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:40:17.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:40:17.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:40:17.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:40:17.202 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:40:17.268 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:39:58
2026-05-29T16:40:17.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72336, datetime.datetime(2026, 5, 29, 16, 39, 58), datetime.datetime(2026, 5, 29, 16, 39, 58), 'salt', 14.23, 45.27, None, 20.11, 40.76, 11.67, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:40:17.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:40:17.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:40:17.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:39:58, diff=19.275603s, valid=True
2026-05-29T16:40:17.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:40:17.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:40:17.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:40:12, diff=5.279038s, valid=True
2026-05-29T16:40:17.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:40:17.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:40:17.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:39:56, diff=21.287131s, valid=True
2026-05-29T16:40:17.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:40:17.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:40:17.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:40:17.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:40:17.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:40:17.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:40:17.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:40:12, diff=5.290802s, valid=True
2026-05-29T16:40:17.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:40:17.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:40:17.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:40:17.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998259.291548s, valid=True
2026-05-29T16:40:17.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:40:17.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:40:17.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:40:17.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:40:17.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:40:17.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:40:17.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:40:17.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:40:17.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:40:17.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:40:17.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:40:17.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:40:17.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:40:17.709 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:40:17.916 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:40:18.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:40:18.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:40:18.356 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:40:18.356 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:40:18.556 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:40:18.557 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:40:48.587 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:40:48.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:40:48.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:40:48.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:40:48.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:40:49.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:40:49.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-05-29T16:40:49.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:40:49.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-05-29T16:40:49.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:40:49.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:40:49.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:40:49.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-05-29T16:40:51.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-05-29T16:40:51.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:40:51.479 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:40:51.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:40:51.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:40:51.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:40:51.507 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:40:51.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:40:51.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:40:51.507 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:40:51.508 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:40:51.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:40:51.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:40:51.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:40:51.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:40:51.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:40:51.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:40:51.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:40:51.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:40:51.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:40:51.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:40:51.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:40:51.773 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:40:51.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:40:28
2026-05-29T16:40:51.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72337, datetime.datetime(2026, 5, 29, 16, 40, 28), datetime.datetime(2026, 5, 29, 16, 40, 28), 'salt', 14.23, 45.31, None, 21.98, 27.89, 11.66, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:40:51.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:40:51.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:40:51.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:40:28, diff=23.840561s, valid=True
2026-05-29T16:40:51.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:40:51.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:40:51.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:40:12, diff=39.843517s, valid=True
2026-05-29T16:40:51.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:40:51.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:40:51.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:40:26, diff=25.850371s, valid=True
2026-05-29T16:40:51.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:40:51.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:40:51.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:40:51.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:40:51.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:40:51.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:40:51.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:40:12, diff=39.853429s, valid=True
2026-05-29T16:40:51.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:40:51.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:40:51.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:40:51.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998293.854111s, valid=True
2026-05-29T16:40:51.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:40:51.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:40:51.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:40:51.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:40:51.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:40:51.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:40:51.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:40:51.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:40:51.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:40:51.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:40:52.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:40:52.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:40:52.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:40:52.168 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:40:52.373 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:40:52.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:40:52.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:40:52.810 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:40:52.810 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:40:53.062 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:40:53.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:41:23.074 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:41:23.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:41:23.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:41:23.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:41:23.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:41:23.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:41:23.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-05-29T16:41:23.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:41:23.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-05-29T16:41:23.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:41:23.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:41:23.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:41:23.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-05-29T16:41:26.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-05-29T16:41:26.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:41:26.288 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:41:26.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:41:26.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:41:26.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:41:26.308 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:41:26.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:41:26.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:41:26.309 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:41:26.309 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:41:26.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:41:26.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:41:26.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:41:26.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:41:26.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:41:26.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:41:26.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:41:26.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:41:26.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:41:26.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:41:26.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:41:26.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:41:26.686 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:40:59
2026-05-29T16:41:26.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72338, datetime.datetime(2026, 5, 29, 16, 40, 59), datetime.datetime(2026, 5, 29, 16, 40, 58), 'salt', 14.33, 44.91, None, 18.56, 39.35, 11.79, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:41:26.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:41:26.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:41:26.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:40:58, diff=28.692178s, valid=True
2026-05-29T16:41:26.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:41:26.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:41:26.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:41:12, diff=14.694994s, valid=True
2026-05-29T16:41:26.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:41:26.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:41:26.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:40:57, diff=29.701608s, valid=True
2026-05-29T16:41:26.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:41:26.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:41:26.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:41:26.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:41:26.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:41:26.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:41:26.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:41:12, diff=14.704596s, valid=True
2026-05-29T16:41:26.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:41:26.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:41:26.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:41:26.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998328.705239s, valid=True
2026-05-29T16:41:26.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:41:26.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:41:26.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:41:26.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:41:26.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:41:26.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:41:26.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:41:26.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:41:26.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:41:26.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:41:26.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:41:26.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:41:26.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:41:27.016 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:41:27.221 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:41:27.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:41:27.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:41:27.656 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:41:27.656 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:41:27.835 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:41:27.835 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:41:57.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:41:57.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:41:57.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:41:58.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:41:58.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:41:58.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:41:58.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-05-29T16:41:58.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:41:58.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T16:41:58.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:41:58.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:41:58.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:41:58.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-05-29T16:42:00.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-05-29T16:42:00.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:42:00.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:42:00.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:42:00.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:42:00.899 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:42:00.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:42:00.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:42:00.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:42:00.900 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:42:00.900 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:42:00.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:42:00.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:42:00.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:42:01.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:42:01.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:42:01.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:42:01.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:42:01.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:42:01.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:42:01.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:42:01.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:42:01.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:42:01.228 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:41:59
2026-05-29T16:42:01.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72340, datetime.datetime(2026, 5, 29, 16, 41, 59), datetime.datetime(2026, 5, 29, 16, 41, 59), 'salt', 14.5, 45.34, None, 16.2, 39.59, 11.67, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:42:01.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:42:01.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:42:01.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:41:59, diff=2.235108s, valid=True
2026-05-29T16:42:01.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:42:01.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:42:01.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:42:12, diff=-10.76198s, valid=True
2026-05-29T16:42:01.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:42:01.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:42:01.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:41:59, diff=2.244924s, valid=True
2026-05-29T16:42:01.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:42:01.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:42:01.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:42:01.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:42:01.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:42:01.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:42:01.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:42:12, diff=-10.75196s, valid=True
2026-05-29T16:42:01.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:42:01.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:42:01.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:42:01.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998363.248734s, valid=True
2026-05-29T16:42:01.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:42:01.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:42:01.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:42:01.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:42:01.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:42:01.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:42:01.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:42:01.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:42:01.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:42:01.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:42:01.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:42:01.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:42:01.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:42:01.592 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:42:01.812 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:42:02.200 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:42:02.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:42:02.301 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:42:02.301 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:42:02.468 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:42:02.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:42:32.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:42:32.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:42:32.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:42:33.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:42:33.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:42:33.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:42:33.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T16:42:33.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:42:33.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-05-29T16:42:33.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:42:33.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:42:33.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:42:33.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-05-29T16:42:35.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-05-29T16:42:35.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:42:35.696 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:42:35.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:42:35.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:42:35.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:42:35.717 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:42:35.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:42:35.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:42:35.717 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:42:35.717 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:42:35.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:42:35.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:42:35.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:42:35.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:42:35.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:42:35.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:42:35.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:42:35.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:42:35.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:42:35.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:42:35.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:42:35.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:42:36.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:42:29
2026-05-29T16:42:36.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72341, datetime.datetime(2026, 5, 29, 16, 42, 29), datetime.datetime(2026, 5, 29, 16, 42, 29), 'salt', 14.53, 44.58, None, 20.64, 35.41, 11.91, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:42:36.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:42:36.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:42:36.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:42:29, diff=7.06545s, valid=True
2026-05-29T16:42:36.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:42:36.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:42:36.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:42:12, diff=24.068304s, valid=True
2026-05-29T16:42:36.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:42:36.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:42:36.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:42:28, diff=8.075075s, valid=True
2026-05-29T16:42:36.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:42:36.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:42:36.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:42:36.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:42:36.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:42:36.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:42:36.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:42:12, diff=24.078086s, valid=True
2026-05-29T16:42:36.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:42:36.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:42:36.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:42:36.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998398.078734s, valid=True
2026-05-29T16:42:36.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:42:36.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:42:36.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:42:36.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:42:36.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:42:36.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:42:36.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:42:36.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:42:36.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:42:36.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:42:36.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:42:36.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:42:36.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:42:36.401 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:42:36.614 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:42:36.970 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:42:37.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:42:37.068 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:42:37.068 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:42:37.237 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:42:37.237 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:43:07.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:43:07.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:43:07.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:43:07.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:43:07.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:43:07.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:43:07.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-05-29T16:43:07.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:43:07.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-05-29T16:43:07.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:43:07.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:43:07.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:43:07.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-05-29T16:43:10.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-05-29T16:43:10.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:43:10.121 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:43:10.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:43:10.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:43:10.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:43:10.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:43:10.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:43:10.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:43:10.143 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:43:10.143 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:43:10.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:43:10.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:43:10.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:43:10.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:43:10.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:43:10.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:43:10.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:43:10.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:43:10.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:43:10.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:43:10.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:43:10.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:43:10.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:43:00
2026-05-29T16:43:10.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72342, datetime.datetime(2026, 5, 29, 16, 43), datetime.datetime(2026, 5, 29, 16, 42, 59), 'salt', 14.6, 44.68, None, 20.85, 40.08, 11.89, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:43:10.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:43:10.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:43:10.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:42:59, diff=11.473189s, valid=True
2026-05-29T16:43:10.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:43:10.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:43:10.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:43:12, diff=-1.523912s, valid=True
2026-05-29T16:43:10.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:43:10.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:43:10.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:42:58, diff=12.482821s, valid=True
2026-05-29T16:43:10.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:43:10.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:43:10.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:43:10.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:43:10.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:43:10.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:43:10.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:43:12, diff=-1.514121s, valid=True
2026-05-29T16:43:10.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:43:10.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:43:10.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:43:10.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998432.486535s, valid=True
2026-05-29T16:43:10.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:43:10.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:43:10.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:43:10.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:43:10.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:43:10.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:43:10.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:43:10.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:43:10.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:43:10.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:43:10.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:43:10.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:43:10.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:43:10.802 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:43:11.010 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:43:11.355 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:43:11.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:43:11.514 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:43:11.514 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:43:11.681 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:43:11.681 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:43:41.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:43:41.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:43:41.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:43:42.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:43:42.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:43:42.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:43:42.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-05-29T16:43:42.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:43:42.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T16:43:42.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:43:42.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:43:42.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:43:42.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-05-29T16:43:48.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-05-29T16:43:48.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:43:48.762 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:43:48.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:43:48.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:43:48.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:43:48.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:43:48.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:43:48.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:43:48.786 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:43:48.786 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:43:48.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:43:48.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:43:48.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:43:48.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:43:48.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:43:49.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:43:49.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:43:49.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:43:49.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:43:49.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:43:49.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:43:49.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:43:49.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:43:30
2026-05-29T16:43:49.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72343, datetime.datetime(2026, 5, 29, 16, 43, 30), datetime.datetime(2026, 5, 29, 16, 43, 29), 'salt', 14.56, 44.84, None, 24.56, 43.48, 11.83, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:43:49.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:43:49.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:43:49.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:43:29, diff=20.113788s, valid=True
2026-05-29T16:43:49.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:43:49.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:43:49.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:43:12, diff=37.116627s, valid=True
2026-05-29T16:43:49.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:43:49.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:43:49.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:43:28, diff=21.1233s, valid=True
2026-05-29T16:43:49.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:43:49.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:43:49.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:43:49.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:43:49.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:43:49.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:43:49.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:43:12, diff=37.12635s, valid=True
2026-05-29T16:43:49.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:43:49.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:43:49.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:43:49.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998471.127012s, valid=True
2026-05-29T16:43:49.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:43:49.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:43:49.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:43:49.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:43:49.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:43:49.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:43:49.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:43:49.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:43:49.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:43:49.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:43:49.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:43:49.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:43:49.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:43:49.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:43:49.664 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:43:50.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:43:50.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:43: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-05-29T16:43: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-05-29T16:43:50.388 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:43:50.388 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:44:20.418 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:44:20.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:44:20.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:44:20.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:44:20.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:44:20.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:44:20.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-05-29T16:44:20.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:44:20.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-05-29T16:44:20.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:44:20.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:44:20.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:44:20.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-05-29T16:44:23.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-05-29T16:44:23.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:44:23.144 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:44:23.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:44:23.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:44:23.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:44:23.171 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:44:23.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:44:23.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:44:23.171 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:44:23.171 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:44:23.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:44:23.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:44:23.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:44:23.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:44:23.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:44:23.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:44:23.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:44:23.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:44:23.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:44:23.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:44:23.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:44:23.433 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:44:23.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:44:01
2026-05-29T16:44:23.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72344, datetime.datetime(2026, 5, 29, 16, 44, 1), datetime.datetime(2026, 5, 29, 16, 44), 'salt', 14.43, 44.45, None, 23.82, 46.32, 11.94, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:44:23.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:44:23.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:44:23.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:44:00, diff=23.50756s, valid=True
2026-05-29T16:44:23.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:44:23.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:44:23.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:44:12, diff=11.510393s, valid=True
2026-05-29T16:44:23.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:44:23.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:44:23.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:43:58, diff=25.51698s, valid=True
2026-05-29T16:44:23.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:44:23.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:44:23.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:44:23.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:44:23.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:44:23.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:44:23.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:44:12, diff=11.520047s, valid=True
2026-05-29T16:44:23.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:44:23.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:44:23.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:44:23.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998505.520731s, valid=True
2026-05-29T16:44:23.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:44:23.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:44:23.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:44:23.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:44:23.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:44:23.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:44:23.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:44:23.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:44:23.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:44:23.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:44:23.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:44:23.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:44:23.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:44:23.837 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:44:24.066 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:44:24.511 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:44:24.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:44:24.611 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:44:24.611 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:44:24.781 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:44:24.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:44:54.812 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:44:54.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:44:54.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:44:55.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:44:55.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:44:55.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:44:55.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-05-29T16:44:55.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:44:55.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-05-29T16:44:55.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:44:55.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:44:55.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:44:55.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-05-29T16:44:57.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T16:44:57.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:44:57.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:44:57.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:44:57.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:44:57.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:44:57.732 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:44:57.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:44:57.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:44:57.733 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:44:57.733 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:44:57.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:44:57.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:44:57.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:44:57.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:44:57.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:44:57.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:44:57.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:44:57.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:44:57.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:44:57.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:44:57.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:44:57.998 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:44:58.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:44:31
2026-05-29T16:44:58.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72345, datetime.datetime(2026, 5, 29, 16, 44, 31), datetime.datetime(2026, 5, 29, 16, 44, 31), 'salt', 14.27, 44.21, None, 23.08, 36.38, 12.01, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:44:58.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:44:58.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:44:58.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:44:31, diff=27.066006s, valid=True
2026-05-29T16:44:58.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:44:58.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:44:58.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:44:12, diff=46.069765s, valid=True
2026-05-29T16:44:58.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:44:58.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:44:58.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:44:29, diff=29.076516s, valid=True
2026-05-29T16:44:58.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:44:58.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:44:58.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:44:58.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:44:58.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:44:58.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:44:58.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:44:12, diff=46.079551s, valid=True
2026-05-29T16:44:58.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:44:58.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:44:58.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:44:58.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998540.080224s, valid=True
2026-05-29T16:44:58.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:44:58.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:44:58.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:44:58.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:44:58.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:44:58.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:44:58.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:44:58.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:44:58.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:44:58.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:44:58.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:44:58.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:44:58.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:44:58.417 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:44:58.634 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:44:58.983 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:44:59.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:44:59.082 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:44:59.082 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:44:59.245 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:44:59.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:45:29.264 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:45:29.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:45:29.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:45:29.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:45:29.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:45:29.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:45:29.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-05-29T16:45:29.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:45:29.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-05-29T16:45:29.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:45:29.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:45:29.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:45:29.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-05-29T16:45:32.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-05-29T16:45:32.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:45:32.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:45:32.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:45:32.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:45:32.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:45:32.267 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:45:32.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:45:32.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:45:32.267 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:45:32.267 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:45:32.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:45:32.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:45:32.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:45:32.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:45:32.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:45:32.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:45:32.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:45:32.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T16:45:32.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:45:32.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:45:32.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:45:32.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:45:32.598 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:45:31
2026-05-29T16:45:32.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72347, datetime.datetime(2026, 5, 29, 16, 45, 31), datetime.datetime(2026, 5, 29, 16, 45, 31), 'salt', 14.13, 44.21, None, 23.5, 39.96, 11.99, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:45:32.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:45:32.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:45:32.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:45:31, diff=1.604322s, valid=True
2026-05-29T16:45:32.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:45:32.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:45:32.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:45:12, diff=20.607246s, valid=True
2026-05-29T16:45:32.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:45:32.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:45:32.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:45:29, diff=3.614035s, valid=True
2026-05-29T16:45:32.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:45:32.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:45:32.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:45:32.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:45:32.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:45:32.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T16:45:32.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:45:12, diff=20.617146s, valid=True
2026-05-29T16:45:32.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:45:32.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:45:32.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:45:32.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998574.617832s, valid=True
2026-05-29T16:45:32.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:45:32.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:45:32.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:45:32.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:45:32.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:45:32.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:45:32.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:45:32.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:45:32.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:45:32.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:45:32.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:45:32.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:45:32.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:45:32.948 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:45:33.248 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:45:33.588 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:45:33.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:45:33.684 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:45:33.684 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:45:33.856 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:45:33.856 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:46:03.886 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:46:03.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:46:03.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:46:04.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:46:04.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:46:04.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:46:04.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-05-29T16:46:04.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:46:04.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-05-29T16:46:04.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:46:04.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:46:04.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:46:04.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-05-29T16:46:08.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-05-29T16:46:08.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:46:08.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:46:08.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:46:08.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:46:08.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:46:08.032 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:46:08.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:46:08.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:46:08.032 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:46:08.032 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:46:08.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:46:08.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:46:08.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:46:08.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:46:08.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:46:08.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:46:08.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:46:08.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:46:08.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:46:08.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:46:08.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:46:08.304 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:46:08.367 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:46:02
2026-05-29T16:46:08.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72348, datetime.datetime(2026, 5, 29, 16, 46, 2), datetime.datetime(2026, 5, 29, 16, 46, 1), 'salt', 14.07, 44.48, None, 24.31, 43.57, 11.91, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:46:08.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:46:08.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:46:08.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:46:01, diff=7.37396s, valid=True
2026-05-29T16:46:08.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:46:08.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:46:08.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:45:12, diff=56.376807s, valid=True
2026-05-29T16:46:08.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:46:08.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:46:08.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:46:00, diff=8.383433s, valid=True
2026-05-29T16:46:08.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:46:08.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:46:08.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:46:08.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:46:08.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:46:08.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:46:08.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:45:12, diff=56.386499s, valid=True
2026-05-29T16:46:08.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:46:08.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:46:08.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:46:08.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998610.38718s, valid=True
2026-05-29T16:46:08.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:46:08.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:46:08.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:46:08.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:46:08.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:46:08.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:46:08.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:46:08.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:46:08.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:46:08.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:46:08.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:46:08.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:46:08.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:46:08.712 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:46:08.928 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:46:09.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:46:09.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:46:09.385 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:46:09.385 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:46:09.556 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:46:09.556 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:46:39.586 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:46:39.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:46:39.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:46:39.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:46:39.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:46:40.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:46:40.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-05-29T16:46:40.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:46:40.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-05-29T16:46:40.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:46:40.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:46:40.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:46:40.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-05-29T16:46:42.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-05-29T16:46:42.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:46:42.432 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:46:42.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:46:42.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:46:42.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:46:42.452 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:46:42.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:46:42.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:46:42.452 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:46:42.452 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:46:42.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:46:42.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:46:42.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:46:42.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:46:42.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:46:42.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:46:42.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:46:42.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:46:42.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:46:42.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:46:42.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:46:42.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:46:42.787 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:46:32
2026-05-29T16:46:42.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72349, datetime.datetime(2026, 5, 29, 16, 46, 32), datetime.datetime(2026, 5, 29, 16, 46, 32), 'salt', 14.2, 44.68, None, 21.07, 29.2, 11.85, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:46:42.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:46:42.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:46:42.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:46:32, diff=10.79419s, valid=True
2026-05-29T16:46:42.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:46:42.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:46:42.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:45:12, diff=90.797095s, valid=True
2026-05-29T16:46:42.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:46:42.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:46:42.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:46:31, diff=11.803845s, valid=True
2026-05-29T16:46:42.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:46:42.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:46:42.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:46:42.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:46:42.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:46:42.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:46:42.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:45:12, diff=90.806897s, valid=True
2026-05-29T16:46:42.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:46:42.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:46:42.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:46:42.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998644.807551s, valid=True
2026-05-29T16:46:42.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:46:42.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:46:42.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:46:42.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:46:42.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:46:42.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:46:42.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:46:42.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:46:42.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:46:42.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:46:43.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:46:43.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:46:43.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:46:43.208 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:46:43.422 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:46:43.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:46:43.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:46:43.910 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:46:43.910 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:46:45.564 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:46:45.564 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:47:15.565 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:47:15.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:47:15.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:47:15.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:47:15.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:47:16.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:47:16.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-05-29T16:47:16.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:47:16.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-05-29T16:47:16.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:47:16.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:47:16.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:47:16.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-05-29T16:47:18.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-05-29T16:47:18.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:47:18.356 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:47:18.356 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:47:18.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:47:18.376 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:47:18.376 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:47:18.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:47:18.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:47:18.376 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:47:18.376 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:47:18.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:47:18.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:47:18.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:47:18.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:47:18.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:47:18.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:47:18.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:47:18.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:47:18.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:47:18.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:47:18.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:47:18.658 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:47:18.717 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:47:03
2026-05-29T16:47:18.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72350, datetime.datetime(2026, 5, 29, 16, 47, 3), datetime.datetime(2026, 5, 29, 16, 47, 2), 'salt', 14.2, 44.98, None, 19.73, 38.93, 11.76, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:47:18.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:47:18.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:47:18.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:47:02, diff=16.72316s, valid=True
2026-05-29T16:47:18.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:47:18.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:47:18.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:45:12, diff=126.726009s, valid=True
2026-05-29T16:47:18.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:47:18.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:47:18.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:47:00, diff=18.732713s, valid=True
2026-05-29T16:47:18.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:47:18.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:47:18.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:47:18.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:47:18.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:47:18.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:47:18.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:45:12, diff=126.735723s, valid=True
2026-05-29T16:47:18.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:47:18.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:47:18.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:47:18.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998680.736375s, valid=True
2026-05-29T16:47:18.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:47:18.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:47:18.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:47:18.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:47:18.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:47:18.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:47:18.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:47:18.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:47:18.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:47:18.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:47:18.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:47:18.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:47:19.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:47:19.073 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:47:19.290 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:47:19.642 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:47:19.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:47:19.741 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:47:19.742 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:47:20.014 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:47:20.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:47:50.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:47:50.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:47:50.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:47:50.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:47:50.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:47:50.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:47: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-05-29T16:47:50.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:47:50.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-05-29T16:47:50.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:47:50.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:47:50.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:47:50.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-05-29T16:47:53.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-05-29T16:47:53.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:47:53.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:47:53.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:47:53.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:47:53.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:47:53.866 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:47:53.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:47:53.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:47:53.866 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:47:53.867 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:47:53.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:47:53.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:47:53.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:47:54.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:47:54.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:47:54.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:47:54.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:47:54.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:47:54.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:47:54.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:47:54.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:47:54.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:47:54.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:47:33
2026-05-29T16:47:54.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72351, datetime.datetime(2026, 5, 29, 16, 47, 33), datetime.datetime(2026, 5, 29, 16, 47, 33), 'salt', 14.13, 45.14, None, 21.42, 49.65, 11.7, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:47:54.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:47:54.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:47:54.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:47:33, diff=21.195747s, valid=True
2026-05-29T16:47:54.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:47:54.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:47:54.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:48:12, diff=-17.801333s, valid=True
2026-05-29T16:47:54.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:47:54.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:47:54.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:47:30, diff=24.205376s, valid=True
2026-05-29T16:47:54.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:47:54.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:47:54.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:47:54.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:47:54.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:47:54.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:47:54.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:48:12, diff=-17.791522s, valid=True
2026-05-29T16:47:54.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:47:54.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:47:54.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:47:54.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998716.209149s, valid=True
2026-05-29T16:47:54.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:47:54.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:47:54.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:47:54.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:47:54.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:47:54.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:47:54.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:47:54.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:47:54.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:47:54.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:47:54.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:47:54.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:47:54.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:47:54.608 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:47:54.823 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:47:55.173 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:47:55.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:47:55.282 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:47:55.282 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:47:55.533 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:47:55.533 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:48:25.563 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:48:25.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:48:25.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:48:26.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:48:26.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:48:26.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:48:26.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-05-29T16:48:26.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:48:26.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-05-29T16:48:26.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:48:26.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:48:26.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:48:26.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-05-29T16:48:28.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-05-29T16:48:28.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:48:28.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:48:28.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:48:28.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:48:28.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:48:28.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:48:28.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:48:28.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:48:28.695 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:48:28.695 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:48:28.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:48:28.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:48:28.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:48:28.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:48:28.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:48:28.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:48:28.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:48:28.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:48:28.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:48:28.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:48:28.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:48:28.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:48:29.020 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:48:04
2026-05-29T16:48:29.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72352, datetime.datetime(2026, 5, 29, 16, 48, 4), datetime.datetime(2026, 5, 29, 16, 48, 3), 'salt', 14.13, 44.51, None, 25.23, 45.03, 11.9, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:48:29.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:48:29.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:48:29.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:48:03, diff=26.026966s, valid=True
2026-05-29T16:48:29.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:48:29.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:48:29.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:48:12, diff=17.029878s, valid=True
2026-05-29T16:48:29.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:48:29.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:48:29.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:48:01, diff=28.036662s, valid=True
2026-05-29T16:48:29.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:48:29.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:48:29.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:48:29.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:48:29.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:48:29.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:48:29.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:48:12, diff=17.039751s, valid=True
2026-05-29T16:48:29.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:48:29.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:48:29.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:48:29.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998751.040408s, valid=True
2026-05-29T16:48:29.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:48:29.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:48:29.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:48:29.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:48:29.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:48:29.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:48:29.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:48:29.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:48:29.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:48:29.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:48:29.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:48:29.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:48:29.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:48:29.368 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:48:29.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:48:29.920 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:48:30.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:48:30.025 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:48:30.025 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:48:30.200 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:48:30.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:49:00.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:49:00.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:49:00.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:49:00.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:49:00.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:49:00.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:49:00.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-05-29T16:49:00.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:49:00.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-05-29T16:49:00.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:49:00.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:49:00.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:49:00.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T16:49:03.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-05-29T16:49:03.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:49:03.156 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:49:03.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:49:03.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:49:03.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:49:03.178 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:49:03.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:49:03.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:49:03.178 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:49:03.178 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:49:03.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:49:03.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:49:03.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:49:03.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:49:03.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:49:03.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:49:03.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:49:03.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:49:03.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:49:03.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:49:03.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:49:03.431 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:49:03.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:48:34
2026-05-29T16:49:03.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72353, datetime.datetime(2026, 5, 29, 16, 48, 34), datetime.datetime(2026, 5, 29, 16, 48, 34), 'salt', 13.9, 45.47, None, 22.55, 42.03, 11.58, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:49:03.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:49:03.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:49:03.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:48:34, diff=29.496743s, valid=True
2026-05-29T16:49:03.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:49:03.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:49:03.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:49:12, diff=-8.50035s, valid=True
2026-05-29T16:49:03.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:49:03.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:49:03.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:48:31, diff=32.506426s, valid=True
2026-05-29T16:49:03.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:49:03.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:49:03.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:49:03.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:49:03.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:49:03.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:49:03.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:49:12, diff=-8.490497s, valid=True
2026-05-29T16:49:03.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:49:03.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:49:03.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:49:03.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998785.510169s, valid=True
2026-05-29T16:49:03.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:49:03.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:49:03.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:49:03.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:49:03.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:49:03.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:49:03.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:49:03.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:49:03.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:49:03.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:49:03.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:49:03.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:49:03.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:49:03.893 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:49:04.099 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:49:04.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:49:04.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:49:04.539 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:49:04.539 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:49:04.769 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:49:04.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:49:34.787 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:49:34.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:49:34.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:49:35.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:49:35.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:49:35.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:49: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-05-29T16:49:35.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:49:35.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T16:49:35.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:49:35.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:49:35.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:49:35.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-05-29T16:49:37.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-05-29T16:49:37.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:49:37.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:49:37.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:49:37.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:49:37.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:49:37.777 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:49:37.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:49:37.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:49:37.778 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:49:37.778 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:49:37.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:49:37.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:49:37.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:49:37.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:49:37.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:49:37.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:49:37.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:49:38.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:49:38.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:49:38.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:49:38.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:49:38.028 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:49:38.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:49:34
2026-05-29T16:49:38.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72355, datetime.datetime(2026, 5, 29, 16, 49, 34), datetime.datetime(2026, 5, 29, 16, 49, 34), 'salt', 13.97, 45.54, None, 21.98, 39.82, 11.57, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:49:38.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:49:38.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:49:38.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:49:34, diff=4.093168s, valid=True
2026-05-29T16:49:38.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:49:38.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:49:38.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:50:12, diff=-33.903971s, valid=True
2026-05-29T16:49:38.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:49:38.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:49:38.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:49:32, diff=6.102712s, valid=True
2026-05-29T16:49:38.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:49:38.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:49:38.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:49:38.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:49:38.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:49:38.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:49:38.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:50:12, diff=-33.89423s, valid=True
2026-05-29T16:49:38.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:49:38.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:49:38.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:49:38.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998820.106437s, valid=True
2026-05-29T16:49:38.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:49:38.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:49:38.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:49:38.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:49:38.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:49:38.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:49:38.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:49:38.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:49:38.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:49:38.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:49:38.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:49:38.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:49:38.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:49:38.422 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:49:38.630 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:49:38.972 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:49:39.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:49:39.072 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:49:39.072 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:49:39.319 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:49:39.320 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:50:09.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:50:09.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:50:09.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:50:09.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:50:09.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:50:09.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:50: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-05-29T16:50:09.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:50:09.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-05-29T16:50:09.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:50:09.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:50:09.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:50:09.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-05-29T16:50: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-05-29T16:50:12.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:50:12.599 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:50:12.599 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:50:12.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:50:12.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:50:12.623 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:50:12.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:50:12.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:50:12.623 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:50:12.623 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:50:12.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:50:12.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:50:12.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:50:12.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:50:12.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:50:12.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:50:12.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:50:12.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:50:12.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:50:12.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:50:12.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:50:12.943 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:50:13.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:50:05
2026-05-29T16:50:13.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72356, datetime.datetime(2026, 5, 29, 16, 50, 5), datetime.datetime(2026, 5, 29, 16, 50, 4), 'salt', 13.97, 45.81, None, 21.84, 33.19, 11.48, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:50:13.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:50:13.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:50:13.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:50:04, diff=9.010201s, valid=True
2026-05-29T16:50:13.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:50:13.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:50:13.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:50:12, diff=1.013011s, valid=True
2026-05-29T16:50:13.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:50:13.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:50:13.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:50:02, diff=11.019597s, valid=True
2026-05-29T16:50:13.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:50:13.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:50:13.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:50:13.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:50:13.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:50:13.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:50:13.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:50:12, diff=1.022606s, valid=True
2026-05-29T16:50:13.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:50:13.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:50:13.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:50:13.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998855.023275s, valid=True
2026-05-29T16:50:13.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:50:13.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:50:13.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:50:13.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:50:13.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:50:13.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:50:13.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:50:13.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:50:13.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:50:13.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:50:13.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:50:13.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:50:13.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:50:13.336 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:50:13.551 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:50:13.898 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:50:13.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:50:13.999 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:50:13.999 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:50:14.162 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:50:14.162 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:50:44.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:50:44.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:50:44.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:50:44.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:50:44.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:50:44.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:50:44.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T16:50:44.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:50:44.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-05-29T16:50:44.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:50:44.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:50:44.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:50:44.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-05-29T16:50:47.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-05-29T16:50:47.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:50:47.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:50:47.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:50:47.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:50:47.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:50:47.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:50:47.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:50:47.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:50:47.035 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:50:47.035 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:50:47.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:50:47.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:50:47.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:50:47.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:50:47.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:50:47.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:50:47.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:50:47.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:50:47.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:50:47.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:50:47.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:50:47.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:50:47.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:50:35
2026-05-29T16:50:47.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72357, datetime.datetime(2026, 5, 29, 16, 50, 35), datetime.datetime(2026, 5, 29, 16, 50, 34), 'salt', 14.07, 45.31, None, 23.04, 35.93, 11.65, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:50:47.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:50:47.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:50:47.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:50:34, diff=13.352896s, valid=True
2026-05-29T16:50:47.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:50:47.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:50:47.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:51:12, diff=-24.644229s, valid=True
2026-05-29T16:50:47.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:50:47.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:50:47.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:50:33, diff=14.362564s, valid=True
2026-05-29T16:50:47.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:50:47.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:50:47.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:50:47.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:50:47.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:50:47.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:50:47.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:51:12, diff=-24.634402s, valid=True
2026-05-29T16:50:47.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:50:47.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:50:47.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:50:47.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998889.366274s, valid=True
2026-05-29T16:50:47.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:50:47.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:50:47.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:50:47.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:50:47.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:50:47.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:50:47.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:50:47.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:50:47.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:50:47.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:50:47.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:50:47.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:50:47.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:50:47.682 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:50:47.899 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:50:48.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:50:48.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:50:48.354 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:50:48.354 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:50:48.539 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:50:48.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:51:18.569 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:51:18.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:51:18.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:51:18.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:51:18.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:51:19.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:51:19.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-05-29T16:51:19.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:51:19.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-05-29T16:51:19.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:51:19.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:51:19.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:51:19.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-05-29T16:51:21.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-05-29T16:51:21.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:51:21.640 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:51:21.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:51:21.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:51:21.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:51:21.661 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:51:21.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:51:21.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:51:21.661 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:51:21.662 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:51:21.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:51:21.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:51:21.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:51:21.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:51:21.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:51:21.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:51:21.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:51:21.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:51:21.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:51:21.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:51:21.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:51:21.918 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:51:21.979 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:51:05
2026-05-29T16:51:21.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72358, datetime.datetime(2026, 5, 29, 16, 51, 5), datetime.datetime(2026, 5, 29, 16, 51, 5), 'salt', 13.97, 45.34, None, 23.5, 33.42, 11.63, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:51:21.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:51:21.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:51:21.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:51:05, diff=16.988912s, valid=True
2026-05-29T16:51:21.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:51:21.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:51:21.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:51:12, diff=9.991787s, valid=True
2026-05-29T16:51:21.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:51:21.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:51:21.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:51:04, diff=17.998435s, valid=True
2026-05-29T16:51:21.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:51:21.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:51:21.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:51:21.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:51:21.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:51:21.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:51:22.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:51:12, diff=10.001569s, valid=True
2026-05-29T16:51:22.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:51:22.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:51:22.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:51:22.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998924.002231s, valid=True
2026-05-29T16:51:22.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:51:22.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:51:22.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:51:22.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:51:22.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:51:22.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:51:22.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:51:22.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:51:22.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:51:22.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:51:22.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:51:22.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:51:22.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:51:22.318 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:51:22.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:51:22.884 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:51:22.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:51:22.985 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:51:22.985 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:51:23.156 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:51:23.156 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:51:53.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:51:53.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:51:53.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:51:53.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:51:53.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:51:53.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:51:53.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-05-29T16:51:53.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:51: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-05-29T16:51:53.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:51:53.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:51:53.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:51:53.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-05-29T16:51:56.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-05-29T16:51:56.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:51:56.215 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:51:56.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:51:56.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:51:56.234 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:51:56.234 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:51:56.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:51:56.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:51:56.234 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:51:56.234 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:51:56.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:51:56.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:51:56.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:51:56.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:51:56.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:51:56.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:51:56.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:51:56.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:51:56.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:51:56.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:51:56.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:51:56.493 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:51:56.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:51:35
2026-05-29T16:51:56.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72359, datetime.datetime(2026, 5, 29, 16, 51, 35), datetime.datetime(2026, 5, 29, 16, 51, 35), 'salt', 14.13, 45.41, None, 20.71, 45.22, 11.62, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:51:56.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:51:56.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:51:56.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:51:35, diff=21.560386s, valid=True
2026-05-29T16:51:56.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:51:56.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:51:56.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:52:12, diff=-15.436259s, valid=True
2026-05-29T16:51:56.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:51:56.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:51:56.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:51:33, diff=23.571388s, valid=True
2026-05-29T16:51:56.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:51:56.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:51:56.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:51:56.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:51:56.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:51:56.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:51:56.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:52:12, diff=-15.425019s, valid=True
2026-05-29T16:51:56.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:51:56.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:51:56.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:51:56.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998958.575746s, valid=True
2026-05-29T16:51:56.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:51:56.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:51:56.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:51:56.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:51:56.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:51:56.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:51:56.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:51:56.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:51:56.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:51:56.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:51:56.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:51:56.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:51:56.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:51:56.933 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:51:57.231 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:51:57.597 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:51:57.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:51:57.698 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:51:57.698 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:51:57.870 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:51:57.870 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:52:27.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:52:27.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:52:27.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:52:28.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:52:28.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:52:28.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:52:28.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-05-29T16:52:28.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:52:28.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-05-29T16:52:28.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:52:28.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:52:28.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:52:28.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-05-29T16:52:30.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-05-29T16:52:30.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:52:30.703 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:52:30.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:52:30.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:52:30.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:52:30.722 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:52:30.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:52:30.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:52:30.723 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:52:30.723 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:52:30.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:52:30.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:52:30.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:52:30.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:52:30.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:52:30.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:52:30.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:52:30.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:52:30.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:52:30.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:52:30.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:52:30.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:52:31.046 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:52:05
2026-05-29T16:52:31.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72360, datetime.datetime(2026, 5, 29, 16, 52, 5), datetime.datetime(2026, 5, 29, 16, 52, 5), 'salt', 14.03, 45.27, None, 21.24, 43.69, 11.65, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:52:31.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:52:31.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:52:31.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:52:05, diff=26.05314s, valid=True
2026-05-29T16:52:31.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:52:31.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:52:31.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:52:12, diff=19.056022s, valid=True
2026-05-29T16:52:31.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:52:31.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:52:31.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:52:03, diff=28.062686s, valid=True
2026-05-29T16:52:31.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:52:31.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:52:31.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:52:31.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:52:31.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:52:31.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:52:31.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:52:12, diff=19.065713s, valid=True
2026-05-29T16:52:31.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:52:31.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:52:31.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:52:31.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=998993.066359s, valid=True
2026-05-29T16:52:31.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:52:31.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:52:31.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:52:31.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:52:31.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:52:31.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:52:31.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:52:31.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:52:31.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:52:31.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:52:31.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:52:31.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:52:31.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:52:31.451 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:52:31.723 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:52:32.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:52:32.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:52:32.273 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:52:32.273 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:52:32.454 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:52:32.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:53:02.475 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:53:02.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:53:02.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:53:03.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:53:03.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:53:03.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:53:03.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-05-29T16:53:03.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:53:03.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-05-29T16:53:03.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:53:03.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:53:03.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:53:03.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-05-29T16:53:05.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T16:53:05.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:53:05.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:53:05.585 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:53:05.595 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:53:05.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:53:05.607 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:53:05.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:53:05.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:53:05.608 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:53:05.608 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:53:05.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:53:05.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:53:05.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:53:05.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:53:05.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:53:05.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:53:05.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:53:05.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:53:05.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:53:05.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:53:05.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:53:05.862 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:53:05.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:52:36
2026-05-29T16:53:05.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72361, datetime.datetime(2026, 5, 29, 16, 52, 36), datetime.datetime(2026, 5, 29, 16, 52, 35), 'salt', 14.07, 45.14, None, 21.49, 39.24, 11.7, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:53:05.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:53:05.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:53:05.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:52:35, diff=30.93081s, valid=True
2026-05-29T16:53:05.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:53:05.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:53:05.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:53:12, diff=-6.066327s, valid=True
2026-05-29T16:53:05.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:53:05.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:53:05.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:52:33, diff=32.940403s, valid=True
2026-05-29T16:53:05.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:53:05.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:53:05.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:53:05.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:53:05.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:53:05.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:53:05.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:53:12, diff=-6.056522s, valid=True
2026-05-29T16:53:05.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:53:05.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:53:05.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:53:05.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999027.944144s, valid=True
2026-05-29T16:53:05.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:53:05.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:53:05.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:53:05.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:53:05.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:53:06.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:53:06.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:53:06.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:53:06.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:53:06.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:53:06.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:53:06.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:53:06.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:53:06.338 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:53:06.551 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:53:06.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:53:07.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:53:07.003 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:53:07.003 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:53:07.104 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:53:07.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:53:37.134 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:53:37.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:53:37.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:53:37.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:53:37.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:53:37.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:53:37.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-05-29T16:53:37.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:53:37.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-05-29T16:53:37.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:53:37.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:53:37.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:53:37.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-05-29T16:53:40.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-05-29T16:53:40.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:53:40.099 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:53:40.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:53:40.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:53:40.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:53:40.120 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:53:40.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:53:40.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:53:40.121 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:53:40.121 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:53:40.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:53:40.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:53:40.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:53:40.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:53:40.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:53:40.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:53:40.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:53:40.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:53:40.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:53:40.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:53:40.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:53:40.368 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:53:40.426 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:53:36
2026-05-29T16:53:40.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72363, datetime.datetime(2026, 5, 29, 16, 53, 36), datetime.datetime(2026, 5, 29, 16, 53, 35), 'salt', 14.03, 45.31, None, 20.5, 40.39, 11.64, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:53:40.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:53:40.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:53:40.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:53:35, diff=5.432795s, valid=True
2026-05-29T16:53:40.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:53:40.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:53:40.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:54:12, diff=-31.564384s, valid=True
2026-05-29T16:53:40.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:53:40.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:53:40.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:53:34, diff=6.442364s, valid=True
2026-05-29T16:53:40.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:53:40.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:53:40.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:53:40.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:53:40.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:53:40.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:53:40.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:54:12, diff=-31.554606s, valid=True
2026-05-29T16:53:40.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:53:40.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:53:40.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:53:40.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999062.446064s, valid=True
2026-05-29T16:53:40.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:53:40.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:53:40.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:53:40.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:53:40.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:53:40.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:53:40.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:53:40.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:53:40.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:53:40.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:53:40.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:53:40.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:53:40.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:53:40.762 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:53:40.975 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:53:41.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:53:41.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:53:41.423 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:53:41.423 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:53:41.620 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:53:41.620 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:54:11.651 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:54:11.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:54:11.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:54:12.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:54:12.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:54:12.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:54:12.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-05-29T16:54:12.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:54:12.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-05-29T16:54:12.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:54:12.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:54:12.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:54:12.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-05-29T16:54:14.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-05-29T16:54:14.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:54:14.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:54:14.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:54:14.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:54:14.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:54:14.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:54:14.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:54:14.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:54:14.840 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:54:14.840 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:54:14.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:54:14.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:54:14.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:54:15.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:54:15.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:54:15.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:54:15.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:54:15.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:54:15.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:54:15.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:54:15.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:54:15.093 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:54:15.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:54:06
2026-05-29T16:54:15.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72364, datetime.datetime(2026, 5, 29, 16, 54, 6), datetime.datetime(2026, 5, 29, 16, 54, 6), 'salt', 14.0, 45.08, None, 22.87, 36.63, 11.71, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:54:15.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:54:15.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:54:15.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:54:06, diff=9.158683s, valid=True
2026-05-29T16:54:15.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:54:15.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:54:15.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:54:12, diff=3.161549s, valid=True
2026-05-29T16:54:15.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:54:15.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:54:15.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:54:04, diff=11.168256s, valid=True
2026-05-29T16:54:15.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:54:15.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:54:15.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:54:15.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:54:15.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:54:15.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:54:15.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:54:12, diff=3.171262s, valid=True
2026-05-29T16:54:15.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:54:15.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:54:15.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:54:15.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999097.171944s, valid=True
2026-05-29T16:54:15.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:54:15.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:54:15.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:54:15.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:54:15.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:54:15.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:54:15.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:54:15.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:54:15.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:54:15.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:54:15.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:54:15.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:54:15.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:54:15.561 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:54:15.779 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:54:16.133 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:54:16.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:54:16.233 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:54:16.233 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:54:16.402 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:54:16.402 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:54:46.432 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:54:46.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:54:46.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:54:46.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:54:46.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:54:46.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:54:46.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-05-29T16:54:46.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:54:46.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-05-29T16:54:46.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:54:46.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:54:46.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:54:46.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-05-29T16:54:49.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-05-29T16:54:49.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:54:49.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:54:49.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:54:49.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:54:49.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:54:49.269 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:54:49.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:54:49.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:54:49.269 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:54:49.269 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:54:49.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:54:49.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:54:49.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:54:49.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:54:49.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:54:49.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:54:49.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:54:49.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:54:49.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:54:49.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:54:49.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:54:49.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:54:49.579 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:54:37
2026-05-29T16:54:49.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72365, datetime.datetime(2026, 5, 29, 16, 54, 37), datetime.datetime(2026, 5, 29, 16, 54, 36), 'salt', 14.13, 45.04, None, 21.21, 36.33, 11.73, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:54:49.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:54:49.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:54:49.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:54:36, diff=13.585573s, valid=True
2026-05-29T16:54:49.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:54:49.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:54:49.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:55:12, diff=-22.411532s, valid=True
2026-05-29T16:54:49.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:54:49.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:54:49.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:54:34, diff=15.595291s, valid=True
2026-05-29T16:54:49.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:54:49.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:54:49.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:54:49.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:54:49.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:54:49.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:54:49.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:55:12, diff=-22.401556s, valid=True
2026-05-29T16:54:49.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:54:49.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:54:49.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:54:49.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999131.599144s, valid=True
2026-05-29T16:54:49.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:54:49.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:54:49.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:54:49.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:54:49.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:54:49.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:54:49.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:54:49.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:54:49.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:54:49.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:54:49.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:54:49.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:54:49.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:54:49.949 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:54:50.192 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:54:50.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:54:50.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:54:50.669 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:54:50.669 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:54:50.833 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:54:50.834 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:55:20.864 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:55:20.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:55:20.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:55:21.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:55:21.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:55:21.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:55:21.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-05-29T16:55:21.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:55: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-05-29T16:55:21.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:55:21.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:55:21.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:55:21.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-05-29T16:55:23.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T16:55:23.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:55:23.914 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:55:23.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:55:23.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:55:23.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:55:23.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:55:23.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:55:23.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:55:23.935 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:55:23.935 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:55:23.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:55:24.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:55:24.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:55:24.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:55:24.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:55:24.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:55:24.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:55:24.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:55:24.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:55:24.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:55:24.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:55:24.195 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:55:24.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:55:07
2026-05-29T16:55:24.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72366, datetime.datetime(2026, 5, 29, 16, 55, 7), datetime.datetime(2026, 5, 29, 16, 55, 6), 'salt', 14.03, 45.34, None, 18.14, 36.0, 11.63, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:55:24.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:55:24.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:55:24.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:55:06, diff=18.260894s, valid=True
2026-05-29T16:55:24.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:55:24.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:55:24.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:55:12, diff=12.26405s, valid=True
2026-05-29T16:55:24.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:55:24.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:55:24.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:55:05, diff=19.271637s, valid=True
2026-05-29T16:55:24.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:55:24.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:55:24.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:55:24.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:55:24.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:55:24.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:55:24.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:55:12, diff=12.275034s, valid=True
2026-05-29T16:55:24.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:55:24.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:55:24.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:55:24.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999166.275798s, valid=True
2026-05-29T16:55:24.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:55:24.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:55:24.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:55:24.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:55:24.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:55:24.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:55:24.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:55:24.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:55:24.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:55:24.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:55:24.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:55:24.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:55:24.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:55:24.708 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:55:24.922 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:55:25.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:55:25.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:55:25.370 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:55:25.370 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:55:25.545 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:55:25.545 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:55:55.575 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:55:55.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:55:55.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:55:56.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:55:56.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:55:56.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:55: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-05-29T16:55:56.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:55:56.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-05-29T16:55:56.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:55:56.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:55:56.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:55:56.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-05-29T16:55:58.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-05-29T16:55:58.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:55:58.762 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:55:58.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:55:58.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:55:58.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:55:58.783 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:55:58.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:55:58.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:55:58.783 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:55:58.783 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:55:58.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:55:58.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:55:58.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:55:58.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:55:58.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:55:58.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:55:58.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:55:59.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:55:59.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:55:59.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:55:59.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:55:59.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:55:59.098 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:55:37
2026-05-29T16:55:59.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72367, datetime.datetime(2026, 5, 29, 16, 55, 37), datetime.datetime(2026, 5, 29, 16, 55, 37), 'salt', 14.1, 45.51, None, 19.2, 41.51, 11.58, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:55:59.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:55:59.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:55:59.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:55:37, diff=22.104988s, valid=True
2026-05-29T16:55:59.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:55:59.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:55:59.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:56:12, diff=-12.892114s, valid=True
2026-05-29T16:55:59.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:55:59.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:55:59.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:55:37, diff=22.114646s, valid=True
2026-05-29T16:55:59.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:55:59.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:55:59.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:55:59.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:55:59.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:55:59.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:55:59.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:56:12, diff=-12.88229s, valid=True
2026-05-29T16:55:59.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:55:59.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:55:59.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:55:59.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999201.118359s, valid=True
2026-05-29T16:55:59.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:55:59.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:55:59.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:55:59.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:55:59.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:55:59.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:55:59.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:55:59.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:55:59.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:55:59.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:55:59.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:55:59.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:55:59.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:55:59.431 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:55:59.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:56:00.020 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:56:00.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:56:00.124 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:56:00.124 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:56:00.286 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:56:00.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:56:30.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:56:30.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:56:30.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:56:30.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:56:30.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:56:30.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:56:30.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-05-29T16:56:30.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:56:30.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T16:56:30.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:56:30.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:56:30.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:56:30.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-05-29T16:56:33.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-05-29T16:56:33.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:56:33.240 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:56:33.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:56:33.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:56:33.260 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:56:33.260 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:56:33.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:56:33.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:56:33.260 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:56:33.260 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:56:33.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:56:33.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:56:33.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:56:33.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:56:33.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:56:33.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:56:33.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:56:33.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:56:33.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:56:33.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:56:33.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:56:33.582 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:56:33.640 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:56:08
2026-05-29T16:56:33.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72368, datetime.datetime(2026, 5, 29, 16, 56, 8), datetime.datetime(2026, 5, 29, 16, 56, 7), 'salt', 14.07, 44.98, None, 17.89, 41.77, 11.75, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:56:33.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:56:33.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:56:33.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:56:07, diff=26.64694s, valid=True
2026-05-29T16:56:33.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:56:33.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:56:33.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:56:12, diff=21.649725s, valid=True
2026-05-29T16:56:33.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:56:33.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:56:33.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:56:05, diff=28.65629s, valid=True
2026-05-29T16:56:33.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:56:33.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:56:33.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:56:33.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:56:33.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:56:33.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:56:33.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:56:12, diff=21.65928s, valid=True
2026-05-29T16:56:33.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:56:33.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:56:33.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:56:33.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999235.659931s, valid=True
2026-05-29T16:56:33.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:56:33.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:56:33.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:56:33.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:56:33.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:56:33.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:56:33.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:56:33.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:56:33.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:56:33.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:56:33.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:56:33.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:56:33.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:56:33.971 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:56:34.184 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:56:34.528 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:56:34.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:56:34.624 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:56:34.624 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:56:34.794 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:56:34.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:57:04.801 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:57:04.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:57:04.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:57:05.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:57:05.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:57:05.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:57:05.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-05-29T16:57:05.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:57:05.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-05-29T16:57:05.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:57:05.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:57:05.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:57:05.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-05-29T16:57:07.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-05-29T16:57:07.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:57:07.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:57:07.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:57:07.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:57:07.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:57:07.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:57:07.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:57:07.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:57:07.879 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:57:07.879 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:57:07.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:57:07.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T16:57:07.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:57:08.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T16:57:08.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:57:08.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:57:08.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:57:08.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:57:08.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:57:08.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:57:08.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:57:08.146 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:57:08.209 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:56:38
2026-05-29T16:57:08.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72369, datetime.datetime(2026, 5, 29, 16, 56, 38), datetime.datetime(2026, 5, 29, 16, 56, 37), 'salt', 14.07, 45.14, None, 16.87, 46.46, 11.7, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:57:08.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:57:08.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T16:57:08.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:56:37, diff=31.215433s, valid=True
2026-05-29T16:57:08.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:57:08.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:57:08.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:57:12, diff=-3.781704s, valid=True
2026-05-29T16:57:08.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:57:08.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T16:57:08.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:56:35, diff=33.225023s, valid=True
2026-05-29T16:57:08.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:57:08.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:57:08.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:57:08.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:57:08.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:57:08.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:57:08.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:57:12, diff=-3.771955s, valid=True
2026-05-29T16:57:08.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:57:08.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:57:08.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:57:08.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999270.22872s, valid=True
2026-05-29T16:57:08.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:57:08.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:57:08.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:57:08.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:57:08.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:57:08.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:57:08.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:57:08.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:57:08.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:57:08.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:57:08.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:57:08.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:57:08.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:57:08.541 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:57:08.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:57:09.103 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:57:09.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:57:09.203 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:57:09.203 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:57:09.374 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:57:09.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:57:39.383 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:57:39.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:57:39.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:57:39.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:57:39.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:57:39.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:57:39.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-05-29T16:57:39.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:57:39.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-05-29T16:57:39.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:57:39.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:57:39.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:57:39.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-05-29T16:57:42.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-05-29T16:57:42.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:57:42.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:57:42.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:57:42.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:57:42.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:57:42.815 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:57:42.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:57:42.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:57:42.815 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:57:42.815 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:57:42.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:57:42.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:57:42.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:57:42.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:57:42.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:57:43.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:57:43.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:57:43.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:57:43.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:57:43.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:57:43.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:57:43.071 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:57:43.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:57:38
2026-05-29T16:57:43.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72371, datetime.datetime(2026, 5, 29, 16, 57, 38), datetime.datetime(2026, 5, 29, 16, 57, 38), 'salt', 14.04, 45.51, None, 16.66, 44.44, 11.58, 831.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:57:43.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:57:43.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:57:43.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:57:38, diff=5.137235s, valid=True
2026-05-29T16:57:43.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:57:43.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:57:43.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:58:12, diff=-28.859944s, valid=True
2026-05-29T16:57:43.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:57:43.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:57:43.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:57:36, diff=7.146652s, valid=True
2026-05-29T16:57:43.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:57:43.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:57:43.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:57:43.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:57:43.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:57:43.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:57:43.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:58:12, diff=-28.850363s, valid=True
2026-05-29T16:57:43.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:57:43.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:57:43.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:57:43.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999305.150283s, valid=True
2026-05-29T16:57:43.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:57:43.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:57:43.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:57:43.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:57:43.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:57:43.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:57:43.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:57:43.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:57:43.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:57:43.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:57:43.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:57:43.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:57:43.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:57:43.491 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:57:43.713 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:57:44.067 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:57:44.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:57:44.175 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:57:44.175 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:57:44.334 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:57:44.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:58:14.364 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:58:14.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:58:14.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:58:14.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:58:14.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:58:14.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:58:14.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-05-29T16:58:14.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:58:14.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-05-29T16:58:14.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:58:14.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:58:14.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:58:14.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T16:58:17.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-05-29T16:58:17.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:58:17.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:58:17.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:58:17.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:58:17.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:58:17.094 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:58:17.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:58:17.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:58:17.095 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:58:17.095 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:58:17.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:58:17.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:58:17.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:58:17.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:58:17.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:58:17.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:58:17.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:58:17.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:58:17.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:58:17.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:58:17.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:58:17.344 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:58:17.401 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:58:09
2026-05-29T16:58:17.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72372, datetime.datetime(2026, 5, 29, 16, 58, 9), datetime.datetime(2026, 5, 29, 16, 58, 8), 'salt', 13.8, 45.44, None, 18.1, 44.84, 11.58, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:58:17.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:58:17.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:58:17.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:58:08, diff=9.407738s, valid=True
2026-05-29T16:58:17.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:58:17.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:58:17.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:58:12, diff=5.41055s, valid=True
2026-05-29T16:58:17.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:58:17.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:58:17.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:58:06, diff=11.417271s, valid=True
2026-05-29T16:58:17.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:58:17.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:58:17.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:58:17.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:58:17.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:58:17.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:58:17.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:58:12, diff=5.420284s, valid=True
2026-05-29T16:58:17.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:58:17.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:58:17.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:58:17.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999339.420946s, valid=True
2026-05-29T16:58:17.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:58:17.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:58:17.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:58:17.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:58:17.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:58:17.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:58:17.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:58:17.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:58:17.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:58:17.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:58:17.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:58:17.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:58:17.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:58:17.733 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:58:18.006 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:58:18.347 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:58:18.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:58:18.446 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:58:18.446 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:58:18.613 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:58:18.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:58:48.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:58:48.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:58:48.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:58:49.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:58:49.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:58:49.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:58: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-05-29T16:58:49.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:58: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-05-29T16:58:49.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:58:49.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:58:49.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:58:49.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T16:58:51.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-05-29T16:58:51.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:58:51.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:58:51.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:58:51.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:58:51.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:58:51.619 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:58:51.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:58:51.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:58:51.620 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:58:51.621 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:58:51.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:58:51.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:58:51.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:58:51.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:58:51.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:58:51.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:58:51.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:58:51.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T16:58:51.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:58:51.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:58:51.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:58:51.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:58:51.948 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:58:39
2026-05-29T16:58:51.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72373, datetime.datetime(2026, 5, 29, 16, 58, 39), datetime.datetime(2026, 5, 29, 16, 58, 38), 'salt', 13.87, 46.14, None, 15.95, 27.93, 11.37, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:58:51.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:58:51.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:58:51.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:58:38, diff=13.968509s, valid=True
2026-05-29T16:58:51.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:58:51.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:58:51.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:59:12, diff=-20.023826s, valid=True
2026-05-29T16:58:51.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:58:51.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:58:51.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:58:36, diff=15.982952s, valid=True
2026-05-29T16:58:51.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:58:51.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:58:51.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:58:51.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:58:51.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:58:51.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T16:58:51.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:59:12, diff=-20.013935s, valid=True
2026-05-29T16:58:51.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:58:51.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:58:51.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:58:51.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999373.986856s, valid=True
2026-05-29T16:58:51.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:58:51.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:58:51.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:58:51.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:58:51.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:58:52.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:58:52.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:58:52.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:58:52.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:58:52.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:58:52.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:58:52.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:58:52.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:58:52.327 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:58:52.552 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:58:52.918 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:58:53.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:58:53.020 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:58:53.020 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:58:53.241 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:58:53.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:59:23.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:59:23.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:59:23.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:59:23.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:59:23.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:59:23.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:59:23.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-05-29T16:59:23.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:59:23.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-05-29T16:59:23.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:59:23.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:59:23.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:59:23.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-05-29T16:59:26.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T16:59:26.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T16:59:26.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T16:59:26.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T16:59:26.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T16:59:26.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T16:59:26.184 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T16:59:26.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T16:59:26.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T16:59:26.185 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T16:59:26.185 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T16:59:26.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T16:59:26.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T16:59:26.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T16:59:26.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T16:59:26.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:59:26.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:59:26.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T16:59:26.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T16:59:26.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T16:59:26.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T16:59:26.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T16:59:26.438 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T16:59:26.496 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:59:09
2026-05-29T16:59:26.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72374, datetime.datetime(2026, 5, 29, 16, 59, 9), datetime.datetime(2026, 5, 29, 16, 59, 9), 'salt', 13.74, 46.04, None, 15.49, 33.73, 11.39, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T16:59:26.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T16:59:26.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T16:59:26.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:59:09, diff=17.503348s, valid=True
2026-05-29T16:59:26.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T16:59:26.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:59:26.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:59:12, diff=14.506536s, valid=True
2026-05-29T16:59:26.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T16:59:26.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T16:59:26.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:59:07, diff=19.515014s, valid=True
2026-05-29T16:59:26.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T16:59:26.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:59:26.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T16:59:26.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T16:59:26.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T16:59:26.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T16:59:26.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:59:12, diff=14.519929s, valid=True
2026-05-29T16:59:26.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T16:59:26.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T16:59:26.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T16:59:26.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999408.520988s, valid=True
2026-05-29T16:59:26.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T16:59:26.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T16:59:26.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T16:59:26.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T16:59:26.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T16:59:26.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T16:59:26.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T16:59:26.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T16:59:26.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T16:59:26.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T16:59:26.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T16:59:26.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T16:59:26.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T16:59:26.850 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T16:59:27.146 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:59:27.505 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T16:59:27.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T16:59:27.613 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T16:59:27.613 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T16:59:27.837 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T16:59:27.837 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T16:59:57.867 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T16:59:57.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T16:59:57.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T16:59:58.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T16:59:58.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T16:59:58.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T16:59: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-05-29T16:59:58.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T16:59:58.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-05-29T16:59:58.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T16:59:58.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T16:59:58.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T16:59:58.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-05-29T17:00:00.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-05-29T17:00:00.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:00:00.502 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:00:00.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:00:00.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:00:00.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:00:00.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:00:00.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:00:00.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:00:00.524 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:00:00.524 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:00:00.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:00:00.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:00:00.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:00:00.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:00:00.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:00:00.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:00:00.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:00:00.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:00:00.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:00:00.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:00:00.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:00:00.782 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:00:00.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 16:59:39
2026-05-29T17:00:00.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72375, datetime.datetime(2026, 5, 29, 16, 59, 39), datetime.datetime(2026, 5, 29, 16, 59, 39), 'salt', 13.9, 46.4, None, 13.16, 33.54, 11.29, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:00:00.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:00:00.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:00:00.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:59:39, diff=21.847183s, valid=True
2026-05-29T17:00:00.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:00:00.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:00:00.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:00:12, diff=-11.14994s, valid=True
2026-05-29T17:00:00.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:00:00.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:00:00.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 16:59:38, diff=22.856847s, valid=True
2026-05-29T17:00:00.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:00:00.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:00:00.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:00:00.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:00:00.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:00:00.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:00:00.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:00:12, diff=-11.140086s, valid=True
2026-05-29T17:00:00.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:00:00.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:00:00.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:00:00.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999442.860572s, valid=True
2026-05-29T17:00:00.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:00:00.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:00:00.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:00:00.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:00:00.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:00:00.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:00:00.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:00:00.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:00:00.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:00:00.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:00:01.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:00:01.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:00:01.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:00:01.192 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:00:01.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:00:01.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:00:01.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:00:01.946 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:00:01.946 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:00:02.014 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:00:02.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:00:32.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:00:32.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:00:32.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:00:32.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:00:32.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:00:32.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:00:32.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-05-29T17:00:32.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:00:32.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-05-29T17:00:32.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:00:32.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:00:32.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:00:32.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-05-29T17:00:34.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-05-29T17:00:34.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:00:34.866 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:00:34.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:00:34.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:00:34.887 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:00:34.887 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:00:34.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:00:34.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:00:34.888 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:00:34.888 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:00:34.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:00:34.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:00:34.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:00:35.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:00:35.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:00:35.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:00:35.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:00:35.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:00:35.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:00:35.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:00:35.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:00:35.145 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:00:35.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:00:09
2026-05-29T17:00:35.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72376, datetime.datetime(2026, 5, 29, 17, 0, 9), datetime.datetime(2026, 5, 29, 17, 0, 9), 'salt', 13.77, 46.3, None, 16.69, 41.21, 11.31, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:00:35.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:00:35.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:00:35.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:00:09, diff=26.212487s, valid=True
2026-05-29T17:00:35.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:00:35.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:00:35.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:00:12, diff=23.215374s, valid=True
2026-05-29T17:00:35.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:00:35.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:00:35.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:00:07, diff=28.222304s, valid=True
2026-05-29T17:00:35.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:00:35.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:00:35.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:00:35.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:00:35.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:00:35.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:00:35.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:00:12, diff=23.225439s, valid=True
2026-05-29T17:00:35.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:00:35.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:00:35.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:00:35.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999477.226123s, valid=True
2026-05-29T17:00:35.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:00:35.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:00:35.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:00:35.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:00:35.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:00:35.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:00:35.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:00:35.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:00:35.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:00:35.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:00:35.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:00:35.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:00:35.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:00:35.625 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:00:35.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:00:36.188 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:00:36.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:00:36.288 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:00:36.288 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:00:36.455 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:00:36.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:01:06.485 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:01:06.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:01:06.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:01:06.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:01:06.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:01:07.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:01: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-05-29T17:01:07.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:01:07.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-05-29T17:01:07.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:01:07.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:01:07.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:01:07.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-05-29T17:01:09.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-05-29T17:01:09.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:01:09.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:01:09.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:01:09.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:01:09.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:01:09.847 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:01:09.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:01:09.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:01:09.847 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:01:09.847 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:01:09.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:01:09.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:01:09.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:01:10.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:01:10.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:01:10.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:01:10.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:01:10.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:01:10.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:01:10.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:01:10.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:01:10.117 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:01:10.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:01:10
2026-05-29T17:01:10.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72378, datetime.datetime(2026, 5, 29, 17, 1, 10), datetime.datetime(2026, 5, 29, 17, 1, 9), 'salt', 13.67, 45.64, None, 18.6, 36.05, 11.5, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:01:10.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:01:10.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:01:10.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:01:09, diff=1.184511s, valid=True
2026-05-29T17:01:10.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:01:10.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:01:10.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:01:12, diff=-1.811788s, valid=True
2026-05-29T17:01:10.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:01:10.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:01:10.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:01:08, diff=2.197388s, valid=True
2026-05-29T17:01:10.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:01:10.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:01:10.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:01:10.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:01:10.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:01:10.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:01:10.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:01:12, diff=-1.798618s, valid=True
2026-05-29T17:01:10.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:01:10.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:01:10.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:01:10.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999512.202258s, valid=True
2026-05-29T17:01:10.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:01:10.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:01:10.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:01:10.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:01:10.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:01:10.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:01:10.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:01:10.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:01:10.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:01:10.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:01:10.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:01:10.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:01:10.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:01:10.527 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:01:10.750 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:01:11.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:01:11.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:01:11.202 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:01:11.203 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:01:11.366 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:01:11.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:01:41.396 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:01:41.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:01:41.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:01:41.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:01:41.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:01:41.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:01:41.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-05-29T17:01:41.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:01:41.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-05-29T17:01:41.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:01:41.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:01:41.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:01:41.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-05-29T17:01:44.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-05-29T17:01:44.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:01:44.345 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:01:44.345 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:01:44.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:01:44.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:01:44.365 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:01:44.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:01:44.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:01:44.366 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:01:44.366 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:01:44.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:01:44.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:01:44.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:01:44.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:01:44.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:01:44.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:01:44.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:01:44.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:01:44.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:01:44.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:01:44.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:01:44.628 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:01:44.698 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:01:40
2026-05-29T17:01:44.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72379, datetime.datetime(2026, 5, 29, 17, 1, 40), datetime.datetime(2026, 5, 29, 17, 1, 40), 'salt', 13.7, 45.51, None, 20.22, 39.43, 11.55, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:01:44.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:01:44.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:01:44.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:01:40, diff=4.704742s, valid=True
2026-05-29T17:01:44.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:01:44.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:01:44.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:02:12, diff=-27.292346s, valid=True
2026-05-29T17:01:44.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:01:44.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:01:44.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:01:38, diff=6.714396s, valid=True
2026-05-29T17:01:44.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:01:44.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:01:44.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:01:44.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:01:44.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:01:44.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:01:44.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:02:12, diff=-27.282511s, valid=True
2026-05-29T17:01:44.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:01:44.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:01:44.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:01:44.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999546.718161s, valid=True
2026-05-29T17:01:44.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:01:44.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:01:44.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:01:44.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:01:44.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:01:44.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:01:44.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:01:44.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:01:44.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:01:44.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:01:44.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:01:45.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:01:45.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:01:45.116 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:01:45.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:01:45.684 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:01:45.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:01:45.788 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:01:45.788 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:01:45.952 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:01:45.952 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:02:15.966 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:02:15.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:02:15.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:02:16.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:02:16.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:02:16.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:02:16.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-05-29T17:02:16.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:02:16.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-05-29T17:02:16.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:02:16.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:02:16.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:02:16.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-05-29T17:02:19.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-05-29T17:02:19.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:02:19.233 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:02:19.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:02:19.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:02:19.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:02:19.253 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:02:19.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:02:19.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:02:19.254 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:02:19.254 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:02:19.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:02:19.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:02:19.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:02:19.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:02:19.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:02:19.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:02:19.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:02:19.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:02:19.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:02:19.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:02:19.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:02:19.511 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:02:19.571 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:02:10
2026-05-29T17:02:19.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72380, datetime.datetime(2026, 5, 29, 17, 2, 10), datetime.datetime(2026, 5, 29, 17, 2, 10), 'salt', 13.77, 45.57, None, 21.17, 35.11, 11.53, 831.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:02:19.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:02:19.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:02:19.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:02:10, diff=9.577276s, valid=True
2026-05-29T17:02:19.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:02:19.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:02:19.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:02:12, diff=7.580083s, valid=True
2026-05-29T17:02:19.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:02:19.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:02:19.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:02:08, diff=11.586921s, valid=True
2026-05-29T17:02:19.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:02:19.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:02:19.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:02:19.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:02:19.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:02:19.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:02:19.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:02:12, diff=7.589915s, valid=True
2026-05-29T17:02:19.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:02:19.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:02:19.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:02:19.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999581.590573s, valid=True
2026-05-29T17:02:19.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:02:19.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:02:19.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:02:19.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:02:19.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:02:19.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:02:19.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:02:19.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:02:19.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:02:19.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:02:19.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:02:19.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:02:19.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:02:19.913 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:02:20.143 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:02:20.490 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:02:20.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:02:20.589 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:02:20.589 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:02:21.299 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:02:21.299 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:02:51.311 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:02:51.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:02:51.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:02:51.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:02:51.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:02:52.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:02:52.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-05-29T17:02:52.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:02:52.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-05-29T17:02:52.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:02:52.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:02:52.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:02:52.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-05-29T17:02:54.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-05-29T17:02:54.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:02:54.526 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:02:54.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:02:54.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:02:54.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:02:54.547 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:02:54.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:02:54.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:02:54.547 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:02:54.547 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:02:54.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:02:54.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:02:54.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:02:54.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:02:54.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:02:54.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:02:54.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:02:54.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:02:54.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:02:54.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:02:54.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:02:54.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:02:54.865 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:02:41
2026-05-29T17:02:54.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72381, datetime.datetime(2026, 5, 29, 17, 2, 41), datetime.datetime(2026, 5, 29, 17, 2, 40), 'salt', 13.77, 45.24, None, 19.44, 35.3, 11.64, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:02:54.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:02:54.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:02:54.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:02:40, diff=14.871534s, valid=True
2026-05-29T17:02:54.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:02:54.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:02:54.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:03:12, diff=-17.125606s, valid=True
2026-05-29T17:02:54.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:02:54.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:02:54.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:02:38, diff=16.881124s, valid=True
2026-05-29T17:02:54.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:02:54.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:02:54.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:02:54.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:02:54.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:02:54.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:02:54.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:03:12, diff=-17.115847s, valid=True
2026-05-29T17:02:54.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:02:54.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:02:54.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:02:54.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999616.884821s, valid=True
2026-05-29T17:02:54.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:02:54.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:02:54.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:02:54.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:02:54.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:02:54.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:02:54.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:02:54.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:02:55.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:02:55.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:02:55.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:02:55.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:02:55.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:02:55.263 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:02:55.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:02:55.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:02:55.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:02:55.931 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:02:55.931 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:02:56.085 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:02:56.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:03:26.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:03:26.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:03:26.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:03:26.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:03:26.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:03:26.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:03:26.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-05-29T17:03:26.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:03:26.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-05-29T17:03:26.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:03:26.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:03:26.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:03:26.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-05-29T17:03:28.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T17:03:28.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:03:28.993 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:03:28.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:03:29.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:03:29.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:03:29.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:03:29.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:03:29.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:03:29.013 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:03:29.013 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:03:29.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:03:29.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:03:29.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:03:29.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:03:29.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:03:29.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:03:29.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:03:29.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:03:29.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:03:29.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:03:29.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:03:29.261 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:03:29.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:03:12
2026-05-29T17:03:29.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72382, datetime.datetime(2026, 5, 29, 17, 3, 12), datetime.datetime(2026, 5, 29, 17, 3, 10), 'salt', 13.84, 45.24, None, 19.9, 31.1, 11.65, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:03:29.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:03:29.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:03:29.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:03:10, diff=19.328453s, valid=True
2026-05-29T17:03:29.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:03:29.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:03:29.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:03:12, diff=17.331263s, valid=True
2026-05-29T17:03:29.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:03:29.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:03:29.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:03:09, diff=20.337915s, valid=True
2026-05-29T17:03:29.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:03:29.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:03:29.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:03:29.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:03:29.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:03:29.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:03:29.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:03:12, diff=17.340924s, valid=True
2026-05-29T17:03:29.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:03:29.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:03:29.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:03:29.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999651.341595s, valid=True
2026-05-29T17:03:29.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:03:29.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:03:29.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:03:29.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:03:29.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:03:29.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:03:29.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:03:29.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:03:29.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:03:29.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:03:29.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:03:29.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:03:29.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:03:29.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:03:29.880 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:03:30.242 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:03:30.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:03:30.345 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:03:30.345 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:03:30.596 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:03:30.596 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:04:00.626 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:04:00.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:04:00.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:04:00.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:04:00.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:04:01.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:04:01.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-05-29T17:04:01.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:04:01.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-05-29T17:04:01.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:04:01.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:04:01.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:04:01.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-05-29T17:04:03.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-05-29T17:04:03.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:04:03.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:04:03.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:04:03.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:04:03.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:04:03.528 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:04:03.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:04:03.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:04:03.529 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:04:03.529 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:04:03.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:04:03.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:04:03.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:04:03.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:04:03.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:04:03.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:04:03.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:04:03.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:04:03.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:04:03.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:04:03.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:04:03.783 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:04:03.842 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:03:42
2026-05-29T17:04:03.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72383, datetime.datetime(2026, 5, 29, 17, 3, 42), datetime.datetime(2026, 5, 29, 17, 3, 42), 'salt', 13.84, 45.08, None, 19.87, 29.44, 11.7, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:04:03.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:04:03.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:04:03.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:03:42, diff=21.849318s, valid=True
2026-05-29T17:04:03.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:04:03.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:04:03.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:04:12, diff=-8.147487s, valid=True
2026-05-29T17:04:03.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:04:03.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:04:03.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:03:39, diff=24.860099s, valid=True
2026-05-29T17:04:03.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:04:03.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:04:03.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:04:03.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:04:03.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:04:03.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:04:03.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:04:12, diff=-8.136278s, valid=True
2026-05-29T17:04:03.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:04:03.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:04:03.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:04:03.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999685.864481s, valid=True
2026-05-29T17:04:03.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:04:03.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:04:03.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:04:03.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:04:03.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:04:03.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:04:03.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:04:03.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:04:03.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:04:03.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:04:04.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:04:04.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:04:04.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:04:04.183 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:04:04.399 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:04:04.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:04:04.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:04:04.856 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:04:04.856 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:04:05.014 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:04:05.015 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:04:35.045 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:04:35.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:04:35.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:04:35.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:04:35.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:04:35.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:04:35.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-05-29T17:04:35.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:04:35.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-05-29T17:04:35.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:04:35.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:04:35.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:04:35.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T17:04:38.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-05-29T17:04:38.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:04:38.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:04:38.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:04:38.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:04:38.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:04:38.075 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:04:38.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:04:38.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:04:38.075 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:04:38.075 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:04:38.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:04:38.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:04:38.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:04:38.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:04:38.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:04:38.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:04:38.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:04:38.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:04:38.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:04:38.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:04:38.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:04:38.339 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:04:38.427 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:04:12
2026-05-29T17:04:38.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72384, datetime.datetime(2026, 5, 29, 17, 4, 12), datetime.datetime(2026, 5, 29, 17, 4, 12), 'salt', 13.77, 45.01, None, 20.96, 41.04, 11.71, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:04:38.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:04:38.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:04:38.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:04:12, diff=26.433813s, valid=True
2026-05-29T17:04:38.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:04:38.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:04:38.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:04:12, diff=26.43669s, valid=True
2026-05-29T17:04:38.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:04:38.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:04:38.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:04:11, diff=27.443351s, valid=True
2026-05-29T17:04:38.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:04:38.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:04:38.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:04:38.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:04:38.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:04:38.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:04:38.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:04:12, diff=26.446428s, valid=True
2026-05-29T17:04:38.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:04:38.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:04:38.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:04:38.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999720.447106s, valid=True
2026-05-29T17:04:38.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:04:38.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:04:38.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:04:38.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:04:38.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:04:38.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:04:38.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:04:38.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:04:38.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:04:38.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:04:38.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:04:38.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:04:38.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:04:38.764 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:04:38.981 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:04:39.393 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:04:39.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:04:39.493 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:04:39.493 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:04:39.658 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:04:39.659 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:05:09.689 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:05:09.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:05:09.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:05:10.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:05:10.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:05:10.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:05:10.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-05-29T17:05:10.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:05:10.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-05-29T17:05:10.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:05:10.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:05:10.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:05:10.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-05-29T17:05:12.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-05-29T17:05:12.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:05:12.733 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:05:12.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:05:12.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:05:12.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:05:12.756 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:05:12.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:05:12.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:05:12.756 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:05:12.756 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:05:12.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:05:12.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:05:12.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:05:12.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:05:12.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:05:12.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:05:12.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:05:13.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:05:13.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:05:13.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:05:13.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:05:13.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:05:13.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:04:43
2026-05-29T17:05:13.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72385, datetime.datetime(2026, 5, 29, 17, 4, 43), datetime.datetime(2026, 5, 29, 17, 4, 42), 'salt', 13.74, 44.45, None, 22.19, 37.29, 11.89, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:05:13.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:05:13.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:05:13.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:04:42, diff=31.108201s, valid=True
2026-05-29T17:05:13.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:05:13.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:05:13.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:05:12, diff=1.111079s, valid=True
2026-05-29T17:05:13.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:05:13.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:05:13.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:04:43, diff=30.117658s, valid=True
2026-05-29T17:05:13.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:05:13.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:05:13.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:05:13.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:05:13.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:05:13.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:05:13.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:05:12, diff=1.120693s, valid=True
2026-05-29T17:05:13.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:05:13.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:05:13.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:05:13.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999755.12134s, valid=True
2026-05-29T17:05:13.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:05:13.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:05:13.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:05:13.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:05:13.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:05:13.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:05:13.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:05:13.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:05:13.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:05:13.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:05:13.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:05:13.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:05:13.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:05:13.436 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:05:13.653 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:05:14.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:05:14.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:05:14.105 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:05:14.105 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:05:14.269 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:05:14.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:05:44.299 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:05:44.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:05:44.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:05:44.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:05:44.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:05:44.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:05:44.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-05-29T17:05:44.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:05:44.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-05-29T17:05:44.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:05:44.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:05:44.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:05:44.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T17:05:47.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-05-29T17:05:47.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:05:47.334 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:05:47.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:05:47.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:05:47.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:05:47.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:05:47.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:05:47.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:05:47.354 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:05:47.355 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:05:47.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:05:47.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:05:47.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:05:47.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:05:47.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:05:47.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:05:47.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:05:47.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:05:47.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:05:47.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:05:47.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:05:47.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:05:47.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:05:43
2026-05-29T17:05:47.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72387, datetime.datetime(2026, 5, 29, 17, 5, 43), datetime.datetime(2026, 5, 29, 17, 5, 43), 'salt', 13.67, 44.68, None, 20.71, 41.77, 11.8, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:05:47.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:05:47.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:05:47.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:05:43, diff=4.698373s, valid=True
2026-05-29T17:05:47.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:05:47.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:05:47.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:06:12, diff=-24.298789s, valid=True
2026-05-29T17:05:47.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:05:47.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:05:47.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:05:40, diff=7.707927s, valid=True
2026-05-29T17:05:47.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:05:47.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:05:47.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:05:47.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:05:47.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:05:47.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:05:47.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:06:12, diff=-24.289009s, valid=True
2026-05-29T17:05:47.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:05:47.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:05:47.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:05:47.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999789.711661s, valid=True
2026-05-29T17:05:47.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:05:47.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:05:47.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:05:47.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:05:47.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:05:47.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:05:47.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:05:47.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:05:47.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:05:47.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:05:47.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:05:47.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:05:47.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:05:48.029 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:05:48.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:05:48.669 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:05:48.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:05:48.770 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:05:48.770 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:05:49.022 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:05:49.022 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:06:19.052 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:06:19.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:06:19.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:06:19.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:06:19.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:06:19.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:06:19.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-05-29T17:06:19.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:06:19.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T17:06:19.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:06:19.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:06:19.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:06:19.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T17:06:22.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-05-29T17:06:22.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:06:22.088 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:06:22.088 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:06:22.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:06:22.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:06:22.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:06:22.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:06:22.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:06:22.111 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:06:22.111 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:06:22.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:06:22.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:06:22.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:06:22.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:06:22.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:06:22.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:06:22.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:06:22.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:06:22.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:06:22.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:06:22.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:06:22.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:06:22.438 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:06:13
2026-05-29T17:06:22.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72388, datetime.datetime(2026, 5, 29, 17, 6, 13), datetime.datetime(2026, 5, 29, 17, 6, 13), 'salt', 13.77, 44.81, None, 16.62, 37.57, 11.77, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:06:22.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:06:22.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:06:22.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:06:13, diff=9.444336s, valid=True
2026-05-29T17:06:22.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:06:22.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:06:22.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:06:12, diff=10.447229s, valid=True
2026-05-29T17:06:22.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:06:22.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:06:22.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:06:10, diff=12.454011s, valid=True
2026-05-29T17:06:22.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:06:22.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:06:22.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:06:22.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:06:22.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:06:22.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:06:22.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:06:12, diff=10.457085s, valid=True
2026-05-29T17:06:22.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:06:22.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:06:22.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:06:22.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999824.457759s, valid=True
2026-05-29T17:06:22.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:06:22.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:06:22.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:06:22.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:06:22.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:06:22.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:06:22.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:06:22.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:06:22.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:06:22.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:06:22.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:06:22.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:06:22.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:06:22.783 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:06:23.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:06:23.350 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:06:23.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:06: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-05-29T17:06: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-05-29T17:06:23.656 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:06:23.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:06:53.686 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:06:53.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:06:53.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:06:54.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:06:54.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:06:54.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:06: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-05-29T17:06:54.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:06: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-05-29T17:06:54.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:06:54.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:06:54.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:06:54.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-05-29T17:06:56.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-05-29T17:06:56.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:06:56.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:06:56.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:06:56.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:06:56.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:06:56.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:06:56.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:06:56.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:06:56.765 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:06:56.765 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:06:56.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:06:56.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:06:56.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:06:56.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:06:56.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:06:56.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:06:56.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:06:57.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:06:57.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:06:57.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:06:57.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:06:57.015 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:06:57.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:06:44
2026-05-29T17:06:57.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72389, datetime.datetime(2026, 5, 29, 17, 6, 44), datetime.datetime(2026, 5, 29, 17, 6, 43), 'salt', 13.71, 44.85, None, 18.49, 36.1, 11.76, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:06:57.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:06:57.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:06:57.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:06:43, diff=14.080093s, valid=True
2026-05-29T17:06:57.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:06:57.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:06:57.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:07:12, diff=-14.916991s, valid=True
2026-05-29T17:06:57.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:06:57.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:06:57.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:06:40, diff=17.089797s, valid=True
2026-05-29T17:06:57.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:06:57.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:06:57.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:06:57.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:06:57.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:06:57.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:06:57.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:07:12, diff=-14.907176s, valid=True
2026-05-29T17:06:57.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:06:57.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:06:57.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:06:57.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999859.093482s, valid=True
2026-05-29T17:06:57.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:06:57.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:06:57.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:06:57.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:06:57.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:06:57.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:06:57.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:06:57.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:06:57.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:06:57.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:06:57.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:06:57.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:06:57.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:06:57.408 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:06:57.694 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:06:58.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:06:58.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:06:58.147 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:06:58.147 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:06:58.385 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:06:58.386 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:07:28.416 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:07:28.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:07:28.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:07:28.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:07:28.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:07:29.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:07:29.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-05-29T17:07:29.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:07:29.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-05-29T17:07:29.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:07:29.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:07:29.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:07:29.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-05-29T17:07:31.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-05-29T17:07:31.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:07:31.716 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:07:31.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:07:31.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:07:31.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:07:31.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:07:31.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:07:31.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:07:31.737 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:07:31.737 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:07:31.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:07:31.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:07:31.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:07:31.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:07:31.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:07:31.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:07:31.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:07:31.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:07:31.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:07:31.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:07:31.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:07:31.990 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:07:32.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:07:14
2026-05-29T17:07:32.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72390, datetime.datetime(2026, 5, 29, 17, 7, 14), datetime.datetime(2026, 5, 29, 17, 7, 13), 'salt', 13.67, 44.65, None, 17.18, 47.68, 11.81, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:07:32.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:07:32.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:07:32.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:07:13, diff=19.055161s, valid=True
2026-05-29T17:07:32.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:07:32.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:07:32.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:07:12, diff=20.05807s, valid=True
2026-05-29T17:07:32.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:07:32.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:07:32.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:07:11, diff=21.064958s, valid=True
2026-05-29T17:07:32.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:07:32.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:07:32.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:07:32.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:07:32.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:07:32.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:07:32.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:07:12, diff=20.068083s, valid=True
2026-05-29T17:07:32.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:07:32.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:07:32.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:07:32.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999894.068756s, valid=True
2026-05-29T17:07:32.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:07:32.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:07:32.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:07:32.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:07:32.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:07:32.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:07:32.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:07:32.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:07:32.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:07:32.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:07:32.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:07:32.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:07:32.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:07:32.410 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:07:32.639 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:07:33.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:07:33.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:07:33.102 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:07:33.102 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:07:33.272 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:07:33.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:08:03.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:08:03.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:08:03.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:08:03.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:08:03.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:08:03.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:08:03.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:08:03.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:08:03.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-05-29T17:08:03.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:08:03.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:08:03.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:08:03.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-05-29T17:08:06.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-05-29T17:08:06.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:08:06.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:08:06.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:08:06.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:08:06.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:08:06.103 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:08:06.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:08:06.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:08:06.103 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:08:06.104 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:08:06.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:08:06.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:08:06.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:08:06.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:08:06.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:08:06.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:08:06.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:08:06.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:08:06.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:08:06.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:08:06.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:08:06.371 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:08:06.433 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:07:44
2026-05-29T17:08:06.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72391, datetime.datetime(2026, 5, 29, 17, 7, 44), datetime.datetime(2026, 5, 29, 17, 7, 44), 'salt', 13.64, 44.48, None, 20.15, 42.9, 11.86, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:08:06.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:08:06.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:08:06.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:07:44, diff=22.43916s, valid=True
2026-05-29T17:08:06.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:08:06.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:08:06.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:08:12, diff=-5.557991s, valid=True
2026-05-29T17:08:06.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:08:06.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:08:06.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:07:41, diff=25.44859s, valid=True
2026-05-29T17:08:06.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:08:06.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:08:06.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:08:06.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:08:06.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:08:06.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:08:06.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:08:12, diff=-5.548357s, valid=True
2026-05-29T17:08:06.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:08:06.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:08:06.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:08:06.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999928.452325s, valid=True
2026-05-29T17:08:06.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:08:06.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:08:06.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:08:06.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:08:06.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:08:06.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:08:06.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:08:06.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:08:06.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:08:06.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:08:06.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:08:06.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:08:06.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:08:06.841 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:08:07.060 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:08:07.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:08:07.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:08:07.521 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:08:07.521 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:08:07.687 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:08:07.688 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:08:37.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:08:37.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:08:37.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:08:37.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:08:38.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:08:38.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:08:38.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:08:38.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:08:38.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-05-29T17:08:38.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:08:38.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:08:38.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:08:38.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-05-29T17:08:40.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-05-29T17:08:40.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:08:40.851 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:08:40.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:08:40.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:08:40.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:08:40.872 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:08:40.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:08:40.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:08:40.872 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:08:40.872 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:08:40.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:08:40.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:08:40.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:08:41.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:08:41.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:08:41.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:08:41.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:08:41.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:08:41.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:08:41.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:08:41.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:08:41.136 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:08:41.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:08:14
2026-05-29T17:08:41.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72392, datetime.datetime(2026, 5, 29, 17, 8, 14), datetime.datetime(2026, 5, 29, 17, 8, 14), 'salt', 13.64, 44.15, None, 18.63, 39.26, 11.97, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:08:41.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:08:41.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:08:41.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:08:14, diff=27.202106s, valid=True
2026-05-29T17:08:41.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:08:41.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:08:41.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:08:12, diff=29.204976s, valid=True
2026-05-29T17:08:41.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:08:41.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:08:41.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:08:12, diff=29.211875s, valid=True
2026-05-29T17:08:41.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:08:41.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:08:41.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:08:41.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:08:41.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:08:41.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:08:41.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:08:12, diff=29.214965s, valid=True
2026-05-29T17:08:41.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:08:41.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:08:41.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:08:41.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999963.215635s, valid=True
2026-05-29T17:08:41.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:08:41.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:08:41.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:08:41.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:08:41.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:08:41.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:08:41.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:08:41.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:08:41.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:08:41.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:08:41.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:08:41.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:08:41.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:08:41.555 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:08:41.780 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:08:42.135 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:08:42.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:08:42.240 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:08:42.240 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:08:42.405 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:08:42.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:09:12.414 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:09:12.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:09:12.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:09:12.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:09:12.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:09:12.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:09:12.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-05-29T17:09:13.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:09:13.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-05-29T17:09:13.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:09:13.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:09:13.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:09:13.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-05-29T17:09:15.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-05-29T17:09:15.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:09:15.358 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:09:15.358 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:09:15.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:09:15.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:09:15.379 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:09:15.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:09:15.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:09:15.380 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:09:15.380 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:09:15.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:09:15.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:09:15.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:09:15.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:09:15.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:09:15.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:09:15.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:09:15.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:09:15.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:09:15.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:09:15.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:09:15.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:09:15.691 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:09:15
2026-05-29T17:09:15.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72394, datetime.datetime(2026, 5, 29, 17, 9, 15), datetime.datetime(2026, 5, 29, 17, 9, 14), 'salt', 13.64, 44.58, None, 19.2, 38.18, 11.83, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:09:15.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:09:15.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:09:15.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:09:14, diff=1.697625s, valid=True
2026-05-29T17:09:15.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:09:15.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:09:15.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:09:12, diff=3.700461s, valid=True
2026-05-29T17:09:15.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:09:15.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:09:15.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:09:12, diff=3.707297s, valid=True
2026-05-29T17:09:15.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:09:15.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:09:15.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:09:15.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:09:15.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:09:15.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:09:15.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:09:12, diff=3.710347s, valid=True
2026-05-29T17:09:15.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:09:15.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:09:15.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:09:15.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=999997.711025s, valid=True
2026-05-29T17:09:15.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:09:15.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:09:15.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:09:15.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:09:15.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:09:15.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:09:15.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:09:15.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:09:15.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:09:15.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:09:15.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:09:16.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:09:16.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:09:16.098 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:09:16.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:09:16.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:09:16.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:09:16.764 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:09:16.764 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:09:16.931 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:09:16.931 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:09:46.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:09:46.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:09:46.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:09:47.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:09:47.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:09:47.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:09:47.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-05-29T17:09:47.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:09:47.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-05-29T17:09:47.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:09:47.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:09:47.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:09:47.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-05-29T17:09:49.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-05-29T17:09:49.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:09:49.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:09:49.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:09:49.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:09:49.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:09:49.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:09:49.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:09:49.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:09:49.817 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:09:49.817 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:09:49.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:09:49.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:09:49.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:09:50.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:09:50.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:09:50.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:09:50.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:09:50.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:09:50.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:09:50.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:09:50.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:09:50.089 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:09:50.149 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:09:45
2026-05-29T17:09:50.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72395, datetime.datetime(2026, 5, 29, 17, 9, 45), datetime.datetime(2026, 5, 29, 17, 9, 45), 'salt', 13.64, 44.75, None, 18.31, 43.06, 11.78, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:09:50.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:09:50.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:09:50.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:09:45, diff=5.155989s, valid=True
2026-05-29T17:09:50.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:09:50.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:09:50.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:10:12, diff=-21.841051s, valid=True
2026-05-29T17:09:50.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:09:50.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:09:50.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:09:42, diff=8.165784s, valid=True
2026-05-29T17:09:50.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:09:50.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:09:50.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:09:50.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:09:50.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:09:50.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:09:50.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:10:12, diff=-21.8311s, valid=True
2026-05-29T17:09:50.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:09:50.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:09:50.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:09:50.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000032.169594s, valid=True
2026-05-29T17:09:50.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:09:50.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:09:50.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:09:50.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:09:50.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:09:50.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:09:50.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:09:50.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:09:50.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:09:50.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:09:50.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:09:50.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:09:50.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:09:50.486 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:09:50.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:09:51.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:09:51.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:09:51.155 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:09: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-05-29T17:09:51.404 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:09:51.404 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:10:21.434 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:10:21.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:10:21.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:10:21.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:10:21.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:10:21.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:10:21.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-05-29T17:10:21.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:10:21.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-05-29T17:10:21.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:10:21.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:10:21.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:10:21.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-05-29T17:10:24.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-05-29T17:10:24.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:10:24.406 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:10:24.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:10:24.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:10:24.427 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:10:24.427 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:10:24.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:10:24.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:10:24.427 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:10:24.427 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:10:24.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:10:24.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:10:24.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:10:24.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:10:24.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:10:24.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:10:24.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:10:24.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:10:24.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:10:24.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:10:24.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:10:24.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:10:24.735 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:10:15
2026-05-29T17:10:24.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72396, datetime.datetime(2026, 5, 29, 17, 10, 15), datetime.datetime(2026, 5, 29, 17, 10, 15), 'salt', 13.64, 44.78, None, 18.56, 39.8, 11.77, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:10:24.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:10:24.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:10:24.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:10:15, diff=9.741879s, valid=True
2026-05-29T17:10:24.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:10:24.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:10:24.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:10:12, diff=12.744688s, valid=True
2026-05-29T17:10:24.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:10:24.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:10:24.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:10:12, diff=12.751187s, valid=True
2026-05-29T17:10:24.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:10:24.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:10:24.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:10:24.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:10:24.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:10:24.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:10:24.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:10:12, diff=12.754157s, valid=True
2026-05-29T17:10:24.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:10:24.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:10:24.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:10:24.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000066.754811s, valid=True
2026-05-29T17:10:24.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:10:24.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:10:24.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:10:24.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:10:24.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:10:24.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:10:24.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:10:24.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:10:24.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:10:24.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:10:24.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:10:24.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:10:25.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:10:25.069 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:10:25.285 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:10:25.635 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:10:25.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:10:25.736 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:10:25.736 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:10:25.903 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:10:25.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:10:55.933 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:10:55.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:10:55.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:10:56.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:10:56.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:10:56.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:10:56.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-05-29T17:10:56.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:10:56.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-05-29T17:10:56.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:10:56.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:10:56.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:10:56.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-05-29T17:10:59.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-05-29T17:10:59.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:10:59.070 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:10:59.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:10:59.078 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:10:59.090 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:10:59.090 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:10:59.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:10:59.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:10:59.091 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:10:59.091 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:10:59.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:10:59.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:10:59.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:10:59.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:10:59.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:10:59.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:10:59.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:10:59.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:10:59.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:10:59.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:10:59.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:10:59.348 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:10:59.415 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:10:45
2026-05-29T17:10:59.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72397, datetime.datetime(2026, 5, 29, 17, 10, 45), datetime.datetime(2026, 5, 29, 17, 10, 45), 'salt', 13.61, 44.75, None, 17.71, 41.28, 11.78, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:10:59.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:10:59.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:10:59.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:10:45, diff=14.421322s, valid=True
2026-05-29T17:10:59.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:10:59.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:10:59.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:11:12, diff=-12.575855s, valid=True
2026-05-29T17:10:59.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:10:59.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:10:59.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:10:42, diff=17.430767s, valid=True
2026-05-29T17:10:59.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:10:59.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:10:59.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:10:59.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:10:59.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:10:59.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:10:59.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:11:12, diff=-12.566196s, valid=True
2026-05-29T17:10:59.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:10:59.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:10:59.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:10:59.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000101.434457s, valid=True
2026-05-29T17:10:59.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:10:59.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:10:59.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:10:59.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:10:59.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:10:59.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:10:59.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:10:59.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:10:59.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:10:59.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:10:59.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:10:59.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:10:59.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:10:59.772 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:11:00.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:11:00.483 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:11:00.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:11:00.583 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:11:00.583 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:11:00.736 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:11:00.736 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:11:30.736 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:11:30.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:11:30.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:11:31.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:11:31.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:11:31.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:11:31.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-05-29T17:11:31.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:11:31.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-05-29T17:11:31.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:11:31.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:11:31.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:11: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-05-29T17:11:34.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-05-29T17:11:34.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:11:34.353 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:11:34.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:11:34.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:11:34.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:11:34.374 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:11:34.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:11:34.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:11:34.374 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:11:34.374 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:11:34.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:11:34.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:11:34.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:11:34.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:11:34.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:11:34.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:11:34.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:11:34.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:11:34.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:11:34.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:11:34.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:11:34.624 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:11:34.681 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:11:17
2026-05-29T17:11:34.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72398, datetime.datetime(2026, 5, 29, 17, 11, 17), datetime.datetime(2026, 5, 29, 17, 11, 15), 'salt', 13.64, 45.14, None, 17.26, 20.2, 11.66, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:11:34.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:11:34.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:11:34.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:11:15, diff=19.687804s, valid=True
2026-05-29T17:11:34.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:11:34.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:11:34.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:11:12, diff=22.690604s, valid=True
2026-05-29T17:11:34.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:11:34.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:11:34.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:11:13, diff=21.697413s, valid=True
2026-05-29T17:11:34.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:11:34.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:11:34.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:11:34.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:11:34.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:11:34.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:11:34.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:11:12, diff=22.700483s, valid=True
2026-05-29T17:11:34.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:11:34.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:11:34.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:11:34.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000136.70115s, valid=True
2026-05-29T17:11:34.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:11:34.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:11:34.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:11:34.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:11:34.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:11:34.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:11:34.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:11:34.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:11:34.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:11:34.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:11:34.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:11:34.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:11:34.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:11:35.017 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:11:35.233 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:11:35.584 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:11:35.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:11:35.685 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:11:35.685 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:11:35.849 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:11:35.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:12:05.880 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:12:05.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:12:05.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:12:06.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:12:06.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:12:06.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:12:06.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-05-29T17:12:06.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:12:06.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T17:12:06.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:12:06.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:12:06.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:12:06.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-05-29T17:12:08.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T17:12:08.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:12:08.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:12:08.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:12:08.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:12:08.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:12:08.569 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:12:08.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:12:08.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:12:08.569 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:12:08.569 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:12:08.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:12:08.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:12:08.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:12:08.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:12:08.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:12:08.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:12:08.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:12:08.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:12:08.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:12:08.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:12:08.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:12:08.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:12:08.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:11:47
2026-05-29T17:12:08.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72399, datetime.datetime(2026, 5, 29, 17, 11, 47), datetime.datetime(2026, 5, 29, 17, 11, 47), 'salt', 13.54, 45.24, None, 18.31, 32.46, 11.62, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:12:08.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:12:08.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:12:08.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:11:47, diff=21.892191s, valid=True
2026-05-29T17:12:08.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:12:08.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:12:08.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:12:12, diff=-3.104896s, valid=True
2026-05-29T17:12:08.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:12:08.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:12:08.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:11:43, diff=25.902046s, valid=True
2026-05-29T17:12:08.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:12:08.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:12:08.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:12:08.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:12:08.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:12:08.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:12:08.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:12:12, diff=-3.094852s, valid=True
2026-05-29T17:12:08.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:12:08.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:12:08.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:12:08.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000170.905826s, valid=True
2026-05-29T17:12:08.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:12:08.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:12:08.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:12:08.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:12:08.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:12:08.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:12:08.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:12:08.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:12:08.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:12:09.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:12:09.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:12:09.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:12:09.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:12:09.221 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:12:09.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:12:09.862 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:12:09.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:12:09.969 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:12:09.970 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:12:10.135 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:12:10.135 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:12:40.161 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:12:40.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:12:40.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:12:40.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:12:40.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:12:40.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:12: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-05-29T17:12:40.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:12:40.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-05-29T17:12:40.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:12:40.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:12:40.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:12:40.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-05-29T17:12:43.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-05-29T17:12:43.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:12:43.216 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:12:43.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:12:43.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:12:43.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:12:43.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:12:43.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:12:43.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:12:43.237 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:12:43.237 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:12:43.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:12:43.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:12:43.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:12:43.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:12:43.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:12:43.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:12:43.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:12:43.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:12:43.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:12:43.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:12:43.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:12:43.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:12:43.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:12:17
2026-05-29T17:12:43.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72400, datetime.datetime(2026, 5, 29, 17, 12, 17), datetime.datetime(2026, 5, 29, 17, 12, 17), 'salt', 13.64, 45.11, None, 18.49, 37.71, 11.67, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:12:43.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:12:43.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:12:43.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:12:17, diff=26.556426s, valid=True
2026-05-29T17:12:43.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:12:43.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:12:43.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:12:12, diff=31.559275s, valid=True
2026-05-29T17:12:43.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:12:43.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:12:43.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:12:13, diff=30.565822s, valid=True
2026-05-29T17:12:43.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:12:43.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:12:43.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:12:43.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:12:43.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:12:43.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:12:43.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:12:12, diff=31.568879s, valid=True
2026-05-29T17:12:43.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:12:43.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:12:43.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:12:43.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000205.569535s, valid=True
2026-05-29T17:12:43.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:12:43.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:12:43.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:12:43.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:12:43.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:12:43.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:12:43.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:12:43.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:12:43.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:12:43.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:12:43.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:12:43.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:12:43.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:12:43.885 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:12:44.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:12:44.454 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:12:44.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:12:44.556 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:12:44.556 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:12:44.801 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:12:44.802 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:13:14.811 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:13:14.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:13:14.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:13:15.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:13:15.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:13:15.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:13:15.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:13:15.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:13:15.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-05-29T17:13:15.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:13:15.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:13:15.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:13:15.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-05-29T17:13:17.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-05-29T17:13:17.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:13:17.629 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:13:17.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:13:17.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:13:17.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:13:17.649 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:13:17.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:13:17.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:13:17.649 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:13:17.649 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:13:17.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:13:17.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:13:17.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:13:17.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:13:17.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:13:17.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:13:17.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:13:17.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:13:17.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:13:17.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:13:17.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:13:17.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:13:17.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:12:48
2026-05-29T17:13:17.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72401, datetime.datetime(2026, 5, 29, 17, 12, 48), datetime.datetime(2026, 5, 29, 17, 12, 47), 'salt', 13.51, 44.98, None, 15.1, 39.33, 11.7, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:13:17.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:13:17.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:13:17.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:12:47, diff=30.986637s, valid=True
2026-05-29T17:13:17.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:13:17.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:13:17.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:13:12, diff=5.989517s, valid=True
2026-05-29T17:13:17.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:13:17.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:13:17.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:12:44, diff=33.997409s, valid=True
2026-05-29T17:13:17.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:13:17.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:13:17.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:13:17.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:13:17.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:13:17.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:13:18.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:13:12, diff=6.000563s, valid=True
2026-05-29T17:13:18.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:13:18.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:13:18.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:13:18.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000240.001252s, valid=True
2026-05-29T17:13:18.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:13:18.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:13:18.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:13:18.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:13:18.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:13:18.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:13:18.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:13:18.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:13:18.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:13:18.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:13:18.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:13:18.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:13:18.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:13:18.342 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:13:18.651 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:13:19.016 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:13:19.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:13:19.117 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:13:19.117 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:13:19.287 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:13:19.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:13:49.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:13:49.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:13:49.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:13:49.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:13:49.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:13:49.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:13: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-05-29T17:13:49.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:13:49.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-05-29T17:13:49.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:13:49.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:13:49.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:13:49.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-05-29T17:13: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-05-29T17:13:52.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:13:52.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:13:52.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:13:52.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:13:52.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:13:52.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:13:52.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:13:52.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:13:52.389 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:13:52.390 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:13:52.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:13:52.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:13:52.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:13:52.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:13:52.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:13:52.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T17:13:52.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:13:52.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T17:13:52.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:13:52.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:13:52.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:13:52.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:13:52.737 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:13:49
2026-05-29T17:13:52.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72403, datetime.datetime(2026, 5, 29, 17, 13, 49), datetime.datetime(2026, 5, 29, 17, 13, 48), 'salt', 13.57, 45.21, None, 15.03, 25.71, 11.63, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:13:52.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:13:52.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:13:52.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:13:48, diff=4.749927s, valid=True
2026-05-29T17:13:52.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:13:52.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T17:13:52.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:14:12, diff=-19.24447s, valid=True
2026-05-29T17:13:52.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:13:52.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:13:52.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:13:47, diff=5.768803s, valid=True
2026-05-29T17:13:52.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:13:52.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:13:52.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:13:52.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:13:52.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:13:52.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T17:13:52.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:14:12, diff=-19.225362s, valid=True
2026-05-29T17:13:52.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:13:52.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:13:52.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:13:52.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000274.775779s, valid=True
2026-05-29T17:13:52.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:13:52.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:13:52.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:13:52.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:13:52.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:13:52.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:13:52.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:13:52.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:13:52.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:13:52.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:13:52.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:13:53.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:13:53.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:13:53.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:13:53.345 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:13:53.699 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:13:53.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:13:53.806 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:13:53.806 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:13:53.962 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:13:53.962 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:14:23.966 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:14:23.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:14:23.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:14:24.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:14:24.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:14:24.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:14:24.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-05-29T17:14:24.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:14:24.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T17:14:24.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:14:24.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:14:24.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:14:24.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-05-29T17:14:26.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-05-29T17:14:26.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:14:26.634 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:14:26.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:14:26.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:14:26.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:14:26.653 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:14:26.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:14:26.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:14:26.653 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:14:26.654 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:14:26.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:14:26.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:14:26.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:14:26.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:14:26.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:14:26.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T17:14:26.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:14:26.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T17:14:26.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:14:26.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:14:26.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:14:26.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:14:26.971 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:14:19
2026-05-29T17:14:26.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72404, datetime.datetime(2026, 5, 29, 17, 14, 19), datetime.datetime(2026, 5, 29, 17, 14, 19), 'salt', 13.54, 45.57, None, 17.54, 43.76, 11.52, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:14:26.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:14:26.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:14:26.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:14:19, diff=7.977399s, valid=True
2026-05-29T17:14:26.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:14:26.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T17:14:26.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:14:12, diff=14.980256s, valid=True
2026-05-29T17:14:26.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:14:26.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:14:26.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:14:19, diff=7.986898s, valid=True
2026-05-29T17:14:26.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:14:26.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:14:26.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:14:26.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:14:26.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:14:26.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T17:14:26.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:14:12, diff=14.990462s, valid=True
2026-05-29T17:14:26.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:14:26.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:14:26.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:14:26.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000308.991146s, valid=True
2026-05-29T17:14:26.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:14:26.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:14:26.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:14:26.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:14:26.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:14:27.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:14:27.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:14:27.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:14:27.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:14:27.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:14:27.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:14:27.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:14:27.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:14:27.386 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:14:27.608 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:14:27.966 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:14:28.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:14:28.073 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:14:28.073 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:14:28.321 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:14:28.322 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:14:58.352 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:14:58.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:14:58.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:14:58.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:14:58.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:14:58.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:14: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-05-29T17:14:58.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:14: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-05-29T17:14:58.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:14:58.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:14:58.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:14: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-05-29T17:15:01.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-05-29T17:15:01.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:15:01.139 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:15:01.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:15:01.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:15:01.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:15:01.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:15:01.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:15:01.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:15:01.162 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:15:01.162 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:15:01.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:15:01.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:15:01.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:15:01.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:15:01.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:15:01.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:15:01.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:15:01.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:15:01.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:15:01.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:15:01.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:15:01.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:15:01.512 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:14:49
2026-05-29T17:15:01.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72405, datetime.datetime(2026, 5, 29, 17, 14, 49), datetime.datetime(2026, 5, 29, 17, 14, 49), 'salt', 13.51, 45.34, None, 15.28, 40.32, 11.59, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:15:01.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:15:01.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:15:01.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:14:49, diff=12.51952s, valid=True
2026-05-29T17:15:01.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:15:01.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:15:01.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:15:12, diff=-10.47756s, valid=True
2026-05-29T17:15:01.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:15:01.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:15:01.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:14:44, diff=17.530184s, valid=True
2026-05-29T17:15:01.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:15:01.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:15:01.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:15:01.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:15:01.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:15:01.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:15:01.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:15:12, diff=-10.466433s, valid=True
2026-05-29T17:15:01.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:15:01.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:15:01.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:15:01.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000343.534249s, valid=True
2026-05-29T17:15:01.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:15:01.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:15:01.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:15:01.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:15:01.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:15:01.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:15:01.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:15:01.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:15:01.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:15:01.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:15:01.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:15:01.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:15:01.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:15:01.865 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:15:02.092 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:15:02.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:15:02.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:15:02.558 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:15:02.558 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:15:02.719 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:15:02.719 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:15:32.736 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:15:32.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:15:32.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:15:33.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:15:33.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:15:33.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:15:33.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-05-29T17:15:33.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:15:33.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T17:15:33.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:15:33.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:15:33.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:15:33.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-05-29T17:15:35.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-05-29T17:15:35.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:15:35.750 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:15:35.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:15:35.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:15:35.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:15:35.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:15:35.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:15:35.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:15:35.771 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:15:35.771 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:15:35.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:15:35.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:15:35.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:15:35.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:15:35.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:15:35.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:15:35.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:15:36.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:15:36.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:15:36.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:15:36.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:15:36.031 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:15:36.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:15:20
2026-05-29T17:15:36.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72406, datetime.datetime(2026, 5, 29, 17, 15, 20), datetime.datetime(2026, 5, 29, 17, 15, 19), 'salt', 13.57, 45.61, None, 17.01, 29.81, 11.51, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:15:36.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:15:36.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:15:36.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:15:19, diff=17.098723s, valid=True
2026-05-29T17:15:36.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:15:36.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:15:36.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:15:12, diff=24.101598s, valid=True
2026-05-29T17:15:36.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:15:36.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:15:36.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:15:14, diff=22.108208s, valid=True
2026-05-29T17:15:36.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:15:36.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:15:36.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:15:36.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:15:36.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:15:36.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:15:36.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:15:12, diff=24.111259s, valid=True
2026-05-29T17:15:36.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:15:36.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:15:36.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:15:36.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000378.111929s, valid=True
2026-05-29T17:15:36.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:15:36.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:15:36.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:15:36.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:15:36.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:15:36.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:15:36.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:15:36.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:15:36.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:15:36.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:15:36.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:15:36.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:15:36.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:15:36.518 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:15:36.738 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:15:37.089 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:15:37.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:15:37.195 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:15:37.196 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:15:37.359 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:15:37.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:16:07.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:16:07.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:16:07.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:16:07.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:16:07.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:16:07.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:16:07.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-05-29T17:16:07.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:16:07.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T17:16:07.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:16:07.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:16:07.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:16:07.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T17:16:10.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-05-29T17:16:10.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:16:10.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:16:10.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:16:10.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:16:10.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:16:10.996 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:16:10.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:16:10.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:16:10.996 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:16:10.996 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:16:11.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:16:11.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:16:11.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:16:11.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:16:11.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:16:11.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:16:11.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:16:11.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:16:11.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:16:11.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:16:11.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:16:11.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:16:11.343 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:15:50
2026-05-29T17:16:11.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72407, datetime.datetime(2026, 5, 29, 17, 15, 50), datetime.datetime(2026, 5, 29, 17, 15, 49), 'salt', 13.57, 45.74, None, 17.43, 36.1, 11.46, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:16:11.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:16:11.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:16:11.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:15:49, diff=22.349989s, valid=True
2026-05-29T17:16:11.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:16:11.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:16:11.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:16:12, diff=-0.647028s, valid=True
2026-05-29T17:16:11.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:16:11.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:16:11.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:15:45, diff=26.360073s, valid=True
2026-05-29T17:16:11.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:16:11.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:16:11.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:16:11.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:16:11.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:16:11.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:16:11.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:16:12, diff=-0.636849s, valid=True
2026-05-29T17:16:11.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:16:11.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:16:11.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:16:11.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000413.363818s, valid=True
2026-05-29T17:16:11.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:16:11.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:16:11.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:16:11.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:16:11.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:16:11.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:16:11.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:16:11.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:16:11.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:16:11.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:16:11.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:16:11.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:16:11.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:16:11.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:16:11.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:16:12.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:16:12.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:16:12.369 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:16:12.370 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:16:12.522 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:16:12.522 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:16:42.538 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:16:42.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:16:42.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:16:42.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:16:42.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:16:43.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:16:43.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-05-29T17:16:43.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:16:43.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-05-29T17:16:43.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:16:43.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:16:43.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:16:43.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-05-29T17:16:45.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-05-29T17:16:45.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:16:45.408 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:16:45.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:16:45.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:16:45.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:16:45.429 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:16:45.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:16:45.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:16:45.429 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:16:45.430 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:16:45.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:16:45.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:16:45.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:16:45.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:16:45.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:16:45.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:16:45.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:16:45.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:16:45.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:16:45.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:16:45.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:16:45.691 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:16:45.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:16:20
2026-05-29T17:16:45.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72408, datetime.datetime(2026, 5, 29, 17, 16, 20), datetime.datetime(2026, 5, 29, 17, 16, 20), 'salt', 13.51, 45.77, None, 17.96, 35.86, 11.45, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:16:45.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:16:45.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:16:45.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:16:20, diff=25.755762s, valid=True
2026-05-29T17:16:45.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:16:45.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:16:45.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:16:12, diff=33.758532s, valid=True
2026-05-29T17:16:45.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:16:45.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:16:45.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:16:15, diff=30.764975s, valid=True
2026-05-29T17:16:45.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:16:45.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:16:45.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:16:45.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:16:45.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:16:45.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:16:45.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:16:12, diff=33.767951s, valid=True
2026-05-29T17:16:45.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:16:45.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:16:45.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:16:45.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000447.768588s, valid=True
2026-05-29T17:16:45.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:16:45.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:16:45.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:16:45.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:16:45.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:16:45.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:16:45.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:16:45.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:16:45.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:16:45.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:16:45.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:16:46.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:16:46.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:16:46.096 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:16:46.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:16:46.664 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:16:46.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:16:46.764 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:16:46.764 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:16:47.023 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:16:47.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:17:17.032 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:17:17.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:17:17.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:17:17.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:17:17.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:17:17.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:17:17.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-05-29T17:17:17.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:17:17.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-05-29T17:17:17.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:17:17.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:17:17.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:17:17.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-05-29T17:17:19.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-05-29T17:17:19.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:17:19.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:17:19.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:17:20.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:17:20.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:17:20.016 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:17:20.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:17:20.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:17:20.016 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:17:20.016 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:17:20.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:17:20.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:17:20.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:17:20.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:17:20.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:17:20.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:17:20.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:17:20.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:17:20.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:17:20.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:17:20.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:17:20.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:17:20.338 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:16:50
2026-05-29T17:17:20.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72409, datetime.datetime(2026, 5, 29, 17, 16, 50), datetime.datetime(2026, 5, 29, 17, 16, 50), 'salt', 13.51, 46.14, None, 18.63, 33.17, 11.34, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:17:20.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:17:20.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:17:20.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:16:50, diff=30.344469s, valid=True
2026-05-29T17:17:20.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:17:20.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:17:20.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:17:12, diff=8.347349s, valid=True
2026-05-29T17:17:20.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:17:20.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:17:20.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:16:46, diff=34.354105s, valid=True
2026-05-29T17:17:20.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:17:20.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:17:20.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:17:20.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:17:20.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:17:20.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:17:20.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:17:12, diff=8.357201s, valid=True
2026-05-29T17:17:20.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:17:20.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:17:20.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:17:20.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000482.357885s, valid=True
2026-05-29T17:17:20.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:17:20.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:17:20.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:17:20.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:17:20.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:17:20.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:17:20.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:17:20.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:17:20.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:17:20.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:17:20.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:17:20.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:17:20.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:17:20.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:17:20.914 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:17:21.326 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:17:21.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:17:21.427 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:17:21.427 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:17:21.609 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:17:21.609 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:17:51.639 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:17:51.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:17:51.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:17:51.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:17:51.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:17:52.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:17:52.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-05-29T17:17:52.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:17:52.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-05-29T17:17:52.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:17:52.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:17:52.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:17:52.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-05-29T17:17:55.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-05-29T17:17:55.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:17:55.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:17:55.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:17:55.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:17:55.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:17:55.726 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:17:55.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:17:55.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:17:55.727 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:17:55.727 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:17:55.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:17:55.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:17:55.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:17:55.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:17:55.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:17:55.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:17:55.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:17:55.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:17:55.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:17:55.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:17:55.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:17:55.993 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:17:56.051 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:17:51
2026-05-29T17:17:56.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72411, datetime.datetime(2026, 5, 29, 17, 17, 51), datetime.datetime(2026, 5, 29, 17, 17, 50), 'salt', 13.47, 46.14, None, 19.51, 38.18, 11.33, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:17:56.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:17:56.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:17:56.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:17:50, diff=6.058051s, valid=True
2026-05-29T17:17:56.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:17:56.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:17:56.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:18:12, diff=-15.939092s, valid=True
2026-05-29T17:17:56.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:17:56.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:17:56.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:17:49, diff=7.067722s, valid=True
2026-05-29T17:17:56.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:17:56.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:17:56.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:17:56.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:17:56.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:17:56.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:17:56.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:18:12, diff=-15.92922s, valid=True
2026-05-29T17:17:56.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:17:56.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:17:56.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:17:56.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000518.071434s, valid=True
2026-05-29T17:17:56.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:17:56.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:17:56.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:17:56.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:17:56.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:17:56.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:17:56.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:17:56.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:17:56.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:17:56.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:17:56.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:17:56.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:17:56.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:17:56.387 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:17:56.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:17:56.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:17:57.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:17:57.051 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:17:57.051 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:17:57.207 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:17:57.207 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:18:27.237 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:18:27.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:18:27.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:18:27.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:18:27.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:18:27.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:18:27.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:18:27.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:18:27.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-05-29T17:18:27.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:18:27.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:18:27.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:18:27.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-05-29T17:18:30.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-05-29T17:18:30.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:18:30.075 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:18:30.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:18:30.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:18:30.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:18:30.096 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:18:30.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:18:30.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:18:30.097 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:18:30.097 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:18:30.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:18:30.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:18:30.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:18:30.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:18:30.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:18:30.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:18:30.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:18:30.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:18:30.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:18:30.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:18:30.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:18:30.350 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:18:30.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:18:21
2026-05-29T17:18:30.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72412, datetime.datetime(2026, 5, 29, 17, 18, 21), datetime.datetime(2026, 5, 29, 17, 18, 21), 'salt', 13.37, 46.37, None, 20.04, 36.1, 11.25, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:18:30.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:18:30.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:18:30.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:18:21, diff=9.41489s, valid=True
2026-05-29T17:18:30.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:18:30.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:18:30.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:18:12, diff=18.41777s, valid=True
2026-05-29T17:18:30.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:18:30.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:18:30.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:18:20, diff=10.424534s, valid=True
2026-05-29T17:18:30.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:18:30.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:18:30.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:18:30.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:18:30.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:18:30.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:18:30.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:18:12, diff=18.427587s, valid=True
2026-05-29T17:18:30.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:18:30.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:18:30.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:18:30.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000552.428255s, valid=True
2026-05-29T17:18:30.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:18:30.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:18:30.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:18:30.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:18:30.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:18:30.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:18:30.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:18:30.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:18:30.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:18:30.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:18:30.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:18:30.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:18:30.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:18:30.744 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:18:30.958 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:18:31.383 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:18:31.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:18:31.486 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:18:31.486 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:18:31.709 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:18:31.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:19:01.738 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:19:01.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:19:01.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:19:01.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:19:02.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:19:02.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:19:02.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-05-29T17:19:02.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:19:02.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-05-29T17:19:02.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:19:02.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:19:02.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:19:02.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-05-29T17:19:04.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-05-29T17:19:04.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:19:04.506 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:19:04.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:19:04.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:19:04.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:19:04.527 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:19:04.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:19:04.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:19:04.527 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:19:04.527 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:19:04.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:19:04.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:19:04.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:19:04.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:19:04.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:19:04.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:19:04.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:19:04.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:19:04.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:19:04.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:19:04.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:19:04.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:19:04.872 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:18:51
2026-05-29T17:19:04.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72413, datetime.datetime(2026, 5, 29, 17, 18, 51), datetime.datetime(2026, 5, 29, 17, 18, 51), 'salt', 13.44, 46.3, None, 19.83, 36.54, 11.28, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:19:04.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:19:04.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:19:04.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:18:51, diff=13.880185s, valid=True
2026-05-29T17:19:04.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:19:04.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:19:04.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:19:12, diff=-7.116717s, valid=True
2026-05-29T17:19:04.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:19:04.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:19:04.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:18:46, diff=18.890471s, valid=True
2026-05-29T17:19:04.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:19:04.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:19:04.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:19:04.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:19:04.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:19:04.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:19:04.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:19:12, diff=-7.106176s, valid=True
2026-05-29T17:19:04.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:19:04.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:19:04.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:19:04.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000586.894571s, valid=True
2026-05-29T17:19:04.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:19:04.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:19:04.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:19:04.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:19:04.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:19:04.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:19:04.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:19:04.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:19:04.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:19:05.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:19:05.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:19:05.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:19:05.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:19:05.235 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:19:05.458 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:19:05.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:19:05.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:19:05.923 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:19:05.923 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:19:06.090 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:19:06.090 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:19:36.121 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:19:36.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:19:36.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:19:36.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:19:36.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:19:36.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:19:36.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:19:36.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:19:36.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T17:19:36.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:19:36.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:19:36.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:19:36.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-05-29T17:19:38.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-05-29T17:19:38.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:19:38.954 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:19:38.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:19:38.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:19:38.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:19:38.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:19:38.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:19:38.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:19:38.975 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:19:38.975 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:19:38.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:19:39.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:19:39.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:19:39.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:19:39.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:19:39.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:19:39.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:19:39.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:19:39.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:19:39.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:19:39.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:19:39.239 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:19:39.300 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:19:21
2026-05-29T17:19:39.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72414, datetime.datetime(2026, 5, 29, 17, 19, 21), datetime.datetime(2026, 5, 29, 17, 19, 21), 'salt', 13.41, 46.24, None, 20.75, 33.92, 11.3, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:19:39.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:19:39.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:19:39.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:19:21, diff=18.306368s, valid=True
2026-05-29T17:19:39.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:19:39.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:19:39.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:19:12, diff=27.309209s, valid=True
2026-05-29T17:19:39.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:19:39.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:19:39.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:19:17, diff=22.315813s, valid=True
2026-05-29T17:19:39.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:19:39.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:19:39.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:19:39.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:19:39.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:19:39.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:19:39.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:19:12, diff=27.318822s, valid=True
2026-05-29T17:19:39.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:19:39.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:19:39.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:19:39.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000621.319475s, valid=True
2026-05-29T17:19:39.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:19:39.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:19:39.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:19:39.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:19:39.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:19:39.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:19:39.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:19:39.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:19:39.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:19:39.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:19:39.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:19:39.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:19:39.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:19:39.655 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:19:39.962 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:19:40.329 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:19:40.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:19:40.439 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:19:40.440 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:19:40.607 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:19:40.607 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:20:10.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:20:10.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:20:10.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:20:10.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:20:10.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:20:11.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:20:11.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-05-29T17:20:11.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:20:11.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-05-29T17:20:11.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:20:11.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:20:11.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:20:11.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-05-29T17:20:13.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-05-29T17:20:13.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:20:13.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:20:13.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:20:13.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:20:13.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:20:13.502 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:20:13.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:20:13.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:20:13.502 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:20:13.502 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:20:13.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:20:13.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:20:13.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:20:13.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:20:13.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:20:13.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:20:13.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:20:13.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:20:13.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:20:13.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:20:13.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:20:13.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:20:13.816 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:19:52
2026-05-29T17:20:13.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72415, datetime.datetime(2026, 5, 29, 17, 19, 52), datetime.datetime(2026, 5, 29, 17, 19, 51), 'salt', 13.34, 46.3, None, 18.35, 38.14, 11.27, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:20:13.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:20:13.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:20:13.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:19:51, diff=22.822764s, valid=True
2026-05-29T17:20:13.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:20:13.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:20:13.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:20:12, diff=1.825655s, valid=True
2026-05-29T17:20:13.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:20:13.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:20:13.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:19:47, diff=26.832449s, valid=True
2026-05-29T17:20:13.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:20:13.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:20:13.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:20:13.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:20:13.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:20:13.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:20:13.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:20:12, diff=1.835534s, valid=True
2026-05-29T17:20:13.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:20:13.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:20:13.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:20:13.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000655.836212s, valid=True
2026-05-29T17:20:13.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:20:13.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:20:13.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:20:13.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:20:13.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:20:13.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:20:13.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:20:13.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:20:13.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:20:13.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:20:14.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:20:14.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:20:14.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:20:14.153 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:20:14.368 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:20:14.714 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:20:14.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:20:14.816 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:20:14.816 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:20:15.067 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:20:15.067 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:20:45.083 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:20:45.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:20:45.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:20:45.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:20:45.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:20:45.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:20: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-05-29T17:20:45.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:20:45.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-05-29T17:20:45.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:20:45.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:20:45.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:20:45.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T17:20:48.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-05-29T17:20:48.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:20:48.100 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:20:48.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:20:48.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:20:48.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:20:48.119 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:20:48.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:20:48.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:20:48.120 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:20:48.120 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:20:48.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:20:48.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:20:48.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:20:48.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:20:48.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:20:48.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:20:48.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:20:48.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:20:48.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:20:48.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:20:48.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:20:48.382 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:20:48.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:20:22
2026-05-29T17:20:48.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72416, datetime.datetime(2026, 5, 29, 17, 20, 22), datetime.datetime(2026, 5, 29, 17, 20, 21), 'salt', 13.34, 46.57, None, 17.75, 36.66, 11.19, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:20:48.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:20:48.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:20:48.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:20:21, diff=27.464018s, valid=True
2026-05-29T17:20:48.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:20:48.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:20:48.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:20:12, diff=36.466893s, valid=True
2026-05-29T17:20:48.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:20:48.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:20:48.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:20:17, diff=31.473675s, valid=True
2026-05-29T17:20:48.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:20:48.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:20:48.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:20:48.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:20:48.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:20:48.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:20:48.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:20:12, diff=36.476729s, valid=True
2026-05-29T17:20:48.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:20:48.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:20:48.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:20:48.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000690.477394s, valid=True
2026-05-29T17:20:48.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:20:48.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:20:48.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:20:48.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:20:48.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:20:48.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:20:48.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:20:48.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:20:48.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:20:48.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:20:48.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:20:48.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:20:48.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:20:48.861 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:20:49.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:20:49.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:20:49.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:20:49.523 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:20:49.523 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:20:49.695 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:20:49.695 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:21:19.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:21:19.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:21:19.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:21:19.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:21:19.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:21:20.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:21:20.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-05-29T17:21:20.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:21:20.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-05-29T17:21:20.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:21:20.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:21:20.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:21:20.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-05-29T17:21:22.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-05-29T17:21:22.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:21:22.497 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:21:22.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:21:22.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:21:22.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:21:22.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:21:22.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:21:22.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:21:22.518 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:21:22.518 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:21:22.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:21:22.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:21:22.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:21:22.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:21:22.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:21:22.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:21:22.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:21:22.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:21:22.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:21:22.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:21:22.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:21:22.771 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:21:22.831 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:21:22
2026-05-29T17:21:22.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72418, datetime.datetime(2026, 5, 29, 17, 21, 22), datetime.datetime(2026, 5, 29, 17, 21, 22), 'salt', 13.28, 46.77, None, 19.13, 35.6, 11.13, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:21:22.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:21:22.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:21:22.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:21:22, diff=0.837139s, valid=True
2026-05-29T17:21:22.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:21:22.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:21:22.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:21:12, diff=10.839973s, valid=True
2026-05-29T17:21:22.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:21:22.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:21:22.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:21:19, diff=3.84648s, valid=True
2026-05-29T17:21:22.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:21:22.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:21:22.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:21:22.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:21:22.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:21:22.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:21:22.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:21:12, diff=10.849504s, valid=True
2026-05-29T17:21:22.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:21:22.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:21:22.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:21:22.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000724.850162s, valid=True
2026-05-29T17:21:22.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:21:22.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:21:22.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:21:22.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:21:22.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:21:22.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:21:22.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:21:22.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:21:22.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:21:22.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:21:23.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:21:23.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:21:23.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:21:23.163 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:21:23.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:21:23.723 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:21:23.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:21:23.822 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:21:23.823 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:21:24.027 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:21:24.027 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:21:54.056 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:21:54.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:21:54.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:21:54.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:21:54.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:21:54.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:21:54.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:21:54.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:21:54.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-05-29T17:21:54.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:21:54.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:21:54.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:21:54.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-05-29T17:21:56.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-05-29T17:21:56.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:21:56.882 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:21:56.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:21:56.891 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:21:56.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:21:56.904 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:21:56.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:21:56.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:21:56.904 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:21:56.904 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:21:56.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:21:56.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:21:56.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:21:57.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:21:57.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:21:57.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:21:57.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:21:57.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:21:57.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:21:57.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:21:57.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:21:57.214 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:21:57.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:21:52
2026-05-29T17:21:57.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72419, datetime.datetime(2026, 5, 29, 17, 21, 52), datetime.datetime(2026, 5, 29, 17, 21, 52), 'salt', 13.21, 46.57, None, 18.56, 37.79, 11.18, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:21:57.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:21:57.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:21:57.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:21:52, diff=5.30138s, valid=True
2026-05-29T17:21:57.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:21:57.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:21:57.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:22:12, diff=-14.695659s, valid=True
2026-05-29T17:21:57.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:21:57.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:21:57.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:21:50, diff=7.311191s, valid=True
2026-05-29T17:21:57.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:21:57.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:21:57.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:21:57.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:21:57.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:21:57.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:21:57.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:22:12, diff=-14.685674s, valid=True
2026-05-29T17:21:57.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:21:57.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:21:57.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:21:57.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000759.315007s, valid=True
2026-05-29T17:21:57.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:21:57.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:21:57.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:21:57.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:21:57.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:21:57.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:21:57.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:21:57.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:21:57.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:21:57.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:21:57.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:21:57.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:21:57.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:21:57.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:21:57.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:21:58.323 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:21:58.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:21:58.432 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:21:58.432 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:21:58.605 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:21:58.605 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:22:28.633 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:22:28.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:22:28.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:22:28.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:22:28.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:22:29.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:22:29.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-05-29T17:22:29.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:22:29.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-05-29T17:22:29.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:22:29.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:22:29.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:22:29.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-05-29T17:22:31.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-05-29T17:22:31.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:22:31.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:22:31.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:22:31.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:22:31.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:22:31.452 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:22:31.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:22:31.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:22:31.453 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:22:31.453 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:22:31.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:22:31.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:22:31.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:22:31.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:22:31.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:22:31.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:22:31.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:22:31.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:22:31.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:22:31.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:22:31.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:22:31.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:22:31.807 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:22:23
2026-05-29T17:22:31.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72420, datetime.datetime(2026, 5, 29, 17, 22, 23), datetime.datetime(2026, 5, 29, 17, 22, 22), 'salt', 13.14, 46.7, None, 19.44, 33.82, 11.14, 831.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:22:31.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:22:31.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:22:31.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:22:22, diff=9.813625s, valid=True
2026-05-29T17:22:31.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:22:31.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:22:31.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:22:12, diff=19.816429s, valid=True
2026-05-29T17:22:31.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:22:31.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:22:31.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:22:22, diff=9.823046s, valid=True
2026-05-29T17:22:31.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:22:31.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:22:31.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:22:31.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:22:31.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:22:31.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:22:31.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:22:12, diff=19.826067s, valid=True
2026-05-29T17:22:31.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:22:31.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:22:31.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:22:31.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000793.826752s, valid=True
2026-05-29T17:22:31.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:22:31.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:22:31.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:22:31.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:22:31.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:22:31.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:22:31.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:22:31.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:22:31.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:22:31.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:22:32.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:22:32.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:22:32.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:22:32.157 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:22:32.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:22:32.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:22:32.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:22:32.836 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:22:32.836 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:22:33.008 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:22:33.008 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:23:03.037 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:23:03.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:23:03.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:23:03.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:23:03.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:23:03.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:23:03.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-05-29T17:23:03.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:23:03.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-05-29T17:23:03.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:23:03.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:23:03.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:23:03.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-05-29T17:23:06.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-05-29T17:23:06.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:23:06.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:23:06.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:23:06.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:23:06.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:23:06.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:23:06.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:23:06.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:23:06.159 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:23:06.159 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:23:06.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:23:06.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:23:06.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:23:06.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:23:06.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:23:06.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:23:06.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:23:06.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:23:06.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:23:06.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:23:06.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:23:06.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:23:06.473 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:22:53
2026-05-29T17:23:06.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72421, datetime.datetime(2026, 5, 29, 17, 22, 53), datetime.datetime(2026, 5, 29, 17, 22, 53), 'salt', 13.11, 47.0, None, 19.02, 35.56, 11.05, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:23:06.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:23:06.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:23:06.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:22:53, diff=13.479371s, valid=True
2026-05-29T17:23:06.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:23:06.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:23:06.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:23:12, diff=-5.517775s, valid=True
2026-05-29T17:23:06.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:23:06.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:23:06.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:22:48, diff=18.48884s, valid=True
2026-05-29T17:23:06.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:23:06.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:23:06.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:23:06.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:23:06.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:23:06.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:23:06.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:23:12, diff=-5.508124s, valid=True
2026-05-29T17:23:06.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:23:06.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:23:06.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:23:06.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000828.492529s, valid=True
2026-05-29T17:23:06.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:23:06.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:23:06.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:23:06.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:23:06.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:23:06.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:23:06.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:23:06.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:23:06.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:23:06.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:23:06.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:23:06.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:23:06.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:23:06.837 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:23:07.056 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:23:07.421 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:23:07.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:23:07.522 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:23:07.522 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:23:07.691 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:23:07.691 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:23:37.721 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:23:37.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:23:37.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:23:37.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:23:37.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:23:38.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:23:38.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-05-29T17:23:38.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:23:38.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-05-29T17:23:38.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:23:38.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:23:38.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:23:38.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-05-29T17:23:40.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-05-29T17:23:40.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:23:40.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:23:40.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:23:40.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:23:40.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:23:40.522 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:23:40.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:23:40.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:23:40.522 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:23:40.522 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:23:40.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:23:40.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:23:40.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:23:40.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:23:40.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:23:40.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:23:40.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:23:40.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:23:40.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:23:40.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:23:40.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:23:40.787 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:23:40.846 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:23:23
2026-05-29T17:23:40.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72422, datetime.datetime(2026, 5, 29, 17, 23, 23), datetime.datetime(2026, 5, 29, 17, 23, 23), 'salt', 13.08, 47.03, None, 20.25, 33.96, 11.04, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:23:40.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:23:40.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:23:40.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:23:23, diff=17.853064s, valid=True
2026-05-29T17:23:40.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:23:40.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:23:40.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:23:12, diff=28.855958s, valid=True
2026-05-29T17:23:40.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:23:40.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:23:40.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:23:19, diff=21.86356s, valid=True
2026-05-29T17:23:40.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:23:40.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:23:40.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:23:40.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:23:40.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:23:40.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:23:40.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:23:12, diff=28.866649s, valid=True
2026-05-29T17:23:40.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:23:40.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:23:40.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:23:40.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000862.867312s, valid=True
2026-05-29T17:23:40.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:23:40.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:23:40.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:23:40.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:23:40.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:23:40.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:23:40.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:23:40.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:23:40.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:23:41.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:23:41.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:23:41.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:23:41.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:23:41.194 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:23:41.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:23:41.838 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:23:41.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:23:41.939 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:23:41.939 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:23:42.109 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:23:42.109 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:24:12.137 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:24:12.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:24:12.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:24:12.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:24:12.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:24:12.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:24:12.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-05-29T17:24:12.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:24:12.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-05-29T17:24:12.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:24:12.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:24:12.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:24:12.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-05-29T17:24:15.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-05-29T17:24:15.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:24:15.152 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:24:15.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:24:15.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:24:15.173 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:24:15.174 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:24:15.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:24:15.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:24:15.174 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:24:15.174 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:24:15.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:24:15.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:24:15.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:24:15.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:24:15.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:24:15.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:24:15.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:24:15.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:24:15.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:24:15.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:24:15.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:24:15.461 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:24:15.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:23:53
2026-05-29T17:24:15.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72423, datetime.datetime(2026, 5, 29, 17, 23, 53), datetime.datetime(2026, 5, 29, 17, 23, 53), 'salt', 13.04, 47.1, None, 19.76, 35.53, 11.01, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:24:15.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:24:15.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:24:15.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:23:53, diff=22.536169s, valid=True
2026-05-29T17:24:15.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:24:15.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:24:15.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:24:12, diff=3.539013s, valid=True
2026-05-29T17:24:15.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:24:15.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:24:15.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:23:49, diff=26.545647s, valid=True
2026-05-29T17:24:15.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:24:15.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:24:15.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:24:15.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:24:15.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:24:15.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:24:15.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:24:12, diff=3.548691s, valid=True
2026-05-29T17:24:15.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:24:15.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:24:15.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:24:15.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000897.549341s, valid=True
2026-05-29T17:24:15.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:24:15.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:24:15.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:24:15.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:24:15.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:24:15.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:24:15.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:24:15.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:24:15.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:24:15.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:24:15.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:24:15.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:24:15.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:24:15.882 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:24:16.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:24:16.456 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:24:16.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:24:16.565 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:24:16.565 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:24:16.739 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:24:16.739 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:24:46.767 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:24:46.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:24:46.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:24:47.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:24:47.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:24:47.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:24:47.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-05-29T17:24:47.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:24:47.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-05-29T17:24:47.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:24:47.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:24:47.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:24:47.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-05-29T17:24:49.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-05-29T17:24:49.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:24:49.590 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:24:49.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:24:49.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:24:49.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:24:49.612 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:24:49.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:24:49.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:24:49.613 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:24:49.613 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:24:49.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:24:49.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:24:49.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:24:49.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:24:49.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:24:49.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:24:49.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:24:49.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:24:49.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:24:49.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:24:49.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:24:49.882 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:24:49.944 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:24:24
2026-05-29T17:24:49.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72424, datetime.datetime(2026, 5, 29, 17, 24, 24), datetime.datetime(2026, 5, 29, 17, 24, 23), 'salt', 13.04, 47.23, None, 20.08, 34.08, 10.97, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:24:49.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:24:49.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:24:49.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:24:23, diff=26.951363s, valid=True
2026-05-29T17:24:49.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:24:49.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:24:49.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:24:12, diff=37.954601s, valid=True
2026-05-29T17:24:49.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:24:49.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:24:49.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:24:19, diff=30.961522s, valid=True
2026-05-29T17:24:49.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:24:49.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:24:49.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:24:49.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:24:49.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:24:49.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:24:49.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:24:12, diff=37.964914s, valid=True
2026-05-29T17:24:49.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:24:49.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:24:49.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:24:49.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000931.965641s, valid=True
2026-05-29T17:24:49.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:24:49.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:24:49.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:24:49.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:24:49.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:24:50.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:24:50.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:24:50.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:24:50.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:24:50.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:24:50.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:24:50.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:24:50.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:24:50.293 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:24:50.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:24:50.958 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:24:51.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:24: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-05-29T17:24: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-05-29T17:24:51.230 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:24:51.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:25:21.260 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:25:21.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:25:21.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:25:21.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:25:21.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:25:21.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:25:21.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-05-29T17:25:21.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:25:21.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-05-29T17:25:21.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:25:21.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:25:21.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:25:21.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-05-29T17:25:24.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-05-29T17:25:24.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:25:24.070 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:25:24.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:25:24.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:25:24.090 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:25:24.091 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:25:24.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:25:24.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:25:24.091 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:25:24.091 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:25:24.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:25:24.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:25:24.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:25:24.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:25:24.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:25:24.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:25:24.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:25:24.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:25:24.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:25:24.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:25:24.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:25:24.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:25:24.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:25:24
2026-05-29T17:25:24.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72426, datetime.datetime(2026, 5, 29, 17, 25, 24), datetime.datetime(2026, 5, 29, 17, 25, 24), 'salt', 12.98, 47.3, None, 20.71, 37.53, 10.95, 831.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:25:24.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:25:24.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:25:24.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:25:24, diff=0.411757s, valid=True
2026-05-29T17:25:24.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:25:24.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:25:24.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:25:12, diff=12.41464s, valid=True
2026-05-29T17:25:24.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:25:24.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:25:24.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:25:20, diff=4.421357s, valid=True
2026-05-29T17:25:24.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:25:24.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:25:24.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:25:24.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:25:24.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:25:24.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:25:24.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:25:12, diff=12.424415s, valid=True
2026-05-29T17:25:24.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:25:24.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:25:24.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:25:24.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1000966.425079s, valid=True
2026-05-29T17:25:24.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:25:24.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:25:24.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:25:24.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:25:24.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:25:24.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:25:24.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:25:24.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:25:24.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:25:24.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:25:24.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:25:24.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:25:24.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:25:24.746 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:25:24.966 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:25:25.317 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:25:25.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:25:25.419 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:25:25.419 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:25:25.686 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:25:25.686 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:25:55.703 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:25:55.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:25:55.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:25:55.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:25:55.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:25:56.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:25:56.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-05-29T17:25:56.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:25:56.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-05-29T17:25:56.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:25:56.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:25:56.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:25: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-05-29T17:25:58.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T17:25:58.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:25:58.493 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:25:58.493 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:25:58.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:25:58.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:25:58.515 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:25:58.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:25:58.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:25:58.515 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:25:58.515 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:25:58.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:25:58.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:25:58.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:25:58.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:25:58.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:25:58.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:25:58.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:25:58.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:25:58.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:25:58.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:25:58.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:25:58.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:25:58.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:25:54
2026-05-29T17:25:58.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72427, datetime.datetime(2026, 5, 29, 17, 25, 54), datetime.datetime(2026, 5, 29, 17, 25, 54), 'salt', 12.88, 47.53, None, 20.15, 39.36, 10.87, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:25:58.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:25:58.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:25:58.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:25:54, diff=4.836324s, valid=True
2026-05-29T17:25:58.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:25:58.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:25:58.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:26:12, diff=-13.160783s, valid=True
2026-05-29T17:25:58.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:25:58.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:25:58.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:25:51, diff=7.845886s, valid=True
2026-05-29T17:25:58.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:25:58.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:25:58.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:25:58.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:25:58.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:25:58.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:25:58.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:26:12, diff=-13.151041s, valid=True
2026-05-29T17:25:58.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:25:58.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:25:58.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:25:58.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001000.849615s, valid=True
2026-05-29T17:25:58.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:25:58.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:25:58.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:25:58.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:25:58.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:25:58.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:25:58.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:25:58.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:25:58.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:25:58.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:25:59.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:25:59.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:25:59.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:25:59.174 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:25:59.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:25:59.817 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:25:59.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:25:59.927 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:25:59.927 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:26:00.116 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:26:00.116 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:26:30.147 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:26:30.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:26:30.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:26:30.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:26:30.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:26:30.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:26:30.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-05-29T17:26:30.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:26:30.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T17:26:30.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:26:30.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:26:30.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:26:30.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-05-29T17:26:33.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T17:26:33.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:26:33.141 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:26:33.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:26:33.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:26:33.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:26:33.163 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:26:33.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:26:33.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:26:33.164 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:26:33.164 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:26:33.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:26:33.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:26:33.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:26:33.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:26:33.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:26:33.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:26:33.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:26:33.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:26:33.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:26:33.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:26:33.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:26:33.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:26:33.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:26:24
2026-05-29T17:26:33.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72428, datetime.datetime(2026, 5, 29, 17, 26, 24), datetime.datetime(2026, 5, 29, 17, 26, 24), 'salt', 12.88, 47.57, None, 20.36, 39.73, 10.86, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:26:33.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:26:33.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:26:33.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:26:24, diff=9.487924s, valid=True
2026-05-29T17:26:33.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:26:33.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:26:33.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:26:12, diff=21.49083s, valid=True
2026-05-29T17:26:33.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:26:33.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:26:33.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:26:23, diff=10.497595s, valid=True
2026-05-29T17:26:33.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:26:33.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:26:33.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:26:33.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:26:33.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:26:33.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:26:33.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:26:12, diff=21.500695s, valid=True
2026-05-29T17:26:33.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:26:33.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:26:33.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:26:33.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001035.50135s, valid=True
2026-05-29T17:26:33.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:26:33.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:26:33.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:26:33.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:26:33.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:26:33.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:26:33.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:26:33.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:26:33.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:26:33.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:26:33.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:26:33.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:26:33.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:26:33.829 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:26:34.047 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:26:34.406 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:26:34.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:26:34.510 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:26:34.510 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:26:34.763 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:26:34.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:27:04.793 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:27:04.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:27:04.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:27:05.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:27:05.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:27:05.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:27:05.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-05-29T17:27:05.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:27:05.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-05-29T17:27:05.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:27:05.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:27:05.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:27:05.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-05-29T17:27:07.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-05-29T17:27:07.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:27:07.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:27:07.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:27:07.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:27:07.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:27:07.788 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:27:07.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:27:07.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:27:07.788 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:27:07.788 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:27:07.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:27:07.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:27:07.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:27:07.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:27:07.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:27:08.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:27:08.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:27:08.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:27:08.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:27:08.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:27:08.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:27:08.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:27:08.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:26:55
2026-05-29T17:27:08.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72429, datetime.datetime(2026, 5, 29, 17, 26, 55), datetime.datetime(2026, 5, 29, 17, 26, 54), 'salt', 12.78, 47.53, None, 20.54, 39.24, 10.86, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:27:08.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:27:08.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:27:08.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:26:54, diff=14.108731s, valid=True
2026-05-29T17:27:08.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:27:08.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:27:08.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:27:12, diff=-3.888411s, valid=True
2026-05-29T17:27:08.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:27:08.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:27:08.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:26:54, diff=14.118365s, valid=True
2026-05-29T17:27:08.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:27:08.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:27:08.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:27:08.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:27:08.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:27:08.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:27:08.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:27:12, diff=-3.878567s, valid=True
2026-05-29T17:27:08.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:27:08.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:27:08.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:27:08.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001070.122115s, valid=True
2026-05-29T17:27:08.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:27:08.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:27:08.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:27:08.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:27:08.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:27:08.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:27:08.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:27:08.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:27:08.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:27:08.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:27:08.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:27:08.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:27:08.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:27:08.539 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:27:08.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:27:09.105 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:27:09.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:27:09.206 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:27:09.206 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:27:09.376 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:27:09.376 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:27:39.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:27:39.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:27:39.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:27:39.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:27:39.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:27:39.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:27:39.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-05-29T17:27:39.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:27:39.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-05-29T17:27:39.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:27:39.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:27:39.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:27:39.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-05-29T17:27:42.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-05-29T17:27:42.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:27:42.218 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:27:42.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:27:42.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:27:42.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:27:42.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:27:42.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:27:42.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:27:42.239 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:27:42.239 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:27:42.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:27:42.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:27:42.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:27:42.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:27:42.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:27:42.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:27:42.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:27:42.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:27:42.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:27:42.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:27:42.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:27:42.493 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:27:42.551 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:27:25
2026-05-29T17:27:42.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72430, datetime.datetime(2026, 5, 29, 17, 27, 25), datetime.datetime(2026, 5, 29, 17, 27, 24), 'salt', 12.78, 48.0, None, 20.11, 39.47, 10.73, 831.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:27:42.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:27:42.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:27:42.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:27:24, diff=18.558128s, valid=True
2026-05-29T17:27:42.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:27:42.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:27:42.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:27:12, diff=30.561053s, valid=True
2026-05-29T17:27:42.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:27:42.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:27:42.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:27:20, diff=22.567879s, valid=True
2026-05-29T17:27:42.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:27:42.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:27:42.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:27:42.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:27:42.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:27:42.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:27:42.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:27:12, diff=30.571s, valid=True
2026-05-29T17:27:42.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:27:42.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:27:42.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:27:42.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001104.571677s, valid=True
2026-05-29T17:27:42.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:27:42.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:27:42.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:27:42.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:27:42.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:27:42.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:27:42.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:27:42.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:27:42.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:27:42.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:27:42.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:27:42.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:27:42.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:27:42.893 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:27:43.117 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:27:43.472 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:27:43.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:27:43.582 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:27:43.582 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:27:43.754 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:27:43.754 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:28:13.784 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:28:13.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:28:13.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:28:14.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:28:14.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:28:14.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:28:14.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-05-29T17:28:14.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:28:14.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-05-29T17:28:14.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:28:14.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:28:14.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:28:14.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-05-29T17:28:16.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-05-29T17:28:16.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:28:16.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:28:16.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:28:16.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:28:16.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:28:16.872 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:28:16.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:28:16.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:28:16.873 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:28:16.873 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:28:16.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:28:16.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:28:16.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:28:17.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:28:17.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:28:17.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:28:17.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:28:17.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:28:17.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:28:17.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:28:17.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:28:17.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:28:17.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:27:55
2026-05-29T17:28:17.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72431, datetime.datetime(2026, 5, 29, 17, 27, 55), datetime.datetime(2026, 5, 29, 17, 27, 55), 'salt', 12.71, 48.2, None, 18.7, 41.12, 10.66, 831.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:28:17.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:28:17.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:28:17.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:27:55, diff=22.20034s, valid=True
2026-05-29T17:28:17.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:28:17.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:28:17.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:28:12, diff=5.203235s, valid=True
2026-05-29T17:28:17.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:28:17.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:28:17.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:27:51, diff=26.210076s, valid=True
2026-05-29T17:28:17.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:28:17.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:28:17.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:28:17.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:28:17.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:28:17.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:28:17.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:28:12, diff=5.213163s, valid=True
2026-05-29T17:28:17.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:28:17.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:28:17.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:28:17.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001139.213845s, valid=True
2026-05-29T17:28:17.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:28:17.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:28:17.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:28:17.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:28:17.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:28:17.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:28:17.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:28:17.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:28:17.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:28:17.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:28:17.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:28:17.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:28:17.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:28:17.605 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:28:17.823 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:28:18.179 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:28:18.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:28:18.280 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:28:18.280 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:28:18.452 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:28:18.452 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:28:48.469 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:28:48.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:28:48.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:28:48.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:28:48.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:28:48.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:28: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-05-29T17:28:48.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:28:48.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-05-29T17:28:48.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:28:48.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:28:48.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:28:48.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-05-29T17:28:51.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-05-29T17:28:51.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:28:51.372 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:28:51.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:28:51.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:28:51.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:28:51.393 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:28:51.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:28:51.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:28:51.394 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:28:51.394 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:28:51.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:28:51.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:28:51.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:28:51.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:28:51.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:28:51.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:28:51.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:28:51.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:28:51.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:28:51.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:28:51.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:28:51.651 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:28:51.710 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:28:25
2026-05-29T17:28:51.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72432, datetime.datetime(2026, 5, 29, 17, 28, 25), datetime.datetime(2026, 5, 29, 17, 28, 25), 'salt', 12.65, 48.26, None, 17.86, 40.32, 10.64, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:28:51.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:28:51.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:28:51.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:28:25, diff=26.716613s, valid=True
2026-05-29T17:28:51.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:28:51.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:28:51.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:28:12, diff=39.719506s, valid=True
2026-05-29T17:28:51.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:28:51.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:28:51.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:28:21, diff=30.726254s, valid=True
2026-05-29T17:28:51.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:28:51.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:28:51.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:28:51.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:28:51.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:28:51.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:28:51.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:28:12, diff=39.729305s, valid=True
2026-05-29T17:28:51.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:28:51.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:28:51.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:28:51.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001173.72997s, valid=True
2026-05-29T17:28:51.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:28:51.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:28:51.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:28:51.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:28:51.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:28:51.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:28:51.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:28:51.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:28:51.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:28:51.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:28:51.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:28:51.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:28:52.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:28:52.044 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:28:52.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:28:52.607 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:28:52.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:28:52.707 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:28:52.707 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:28:52.876 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:28:52.876 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:29:22.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:29:22.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:29:22.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:29:23.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:29:23.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:29:23.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:29:23.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-05-29T17:29:23.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:29:23.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-05-29T17:29:23.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:29:23.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:29:23.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:29:23.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-05-29T17:29:25.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-05-29T17:29:25.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:29:25.722 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:29:25.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:29:25.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:29:25.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:29:25.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:29:25.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:29:25.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:29:25.744 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:29:25.744 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:29:25.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:29:25.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:29:25.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:29:25.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:29:25.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:29:25.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:29:25.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:29:26.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:29:26.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:29:26.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:29:26.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:29:26.008 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:29:26.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:29:26
2026-05-29T17:29:26.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72434, datetime.datetime(2026, 5, 29, 17, 29, 26), datetime.datetime(2026, 5, 29, 17, 29, 25), 'salt', 12.61, 49.26, None, 12.77, 51.83, 10.34, 831.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:29:26.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:29:26.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:29:26.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:29:25, diff=1.077168s, valid=True
2026-05-29T17:29:26.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:29:26.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:29:26.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:29:12, diff=14.079954s, valid=True
2026-05-29T17:29:26.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:29:26.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:29:26.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:29:21, diff=5.08647s, valid=True
2026-05-29T17:29:26.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:29:26.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:29:26.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:29:26.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:29:26.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:29:26.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:29:26.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:29:12, diff=14.089482s, valid=True
2026-05-29T17:29:26.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:29:26.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:29:26.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:29:26.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001208.090137s, valid=True
2026-05-29T17:29:26.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:29:26.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:29:26.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:29:26.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:29:26.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:29:26.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:29:26.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:29:26.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:29:26.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:29:26.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:29:26.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:29:26.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:29:26.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:29:26.427 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:29:26.644 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:29:27.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:29:27.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:29:27.126 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:29:27.126 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:29:27.282 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:29:27.282 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:29:57.312 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:29:57.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:29:57.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:29:57.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:29:57.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:29:57.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:29:57.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-05-29T17:29:57.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:29:57.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-05-29T17:29:57.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:29:57.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:29:57.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:29:57.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-05-29T17:30:00.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-05-29T17:30:00.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:30:00.362 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:30:00.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:30:00.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:30:00.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:30:00.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:30:00.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:30:00.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:30:00.384 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:30:00.384 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:30:00.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:30:00.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:30:00.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:30:00.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:30:00.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:30:00.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:30:00.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:30:00.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:30:00.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:30:00.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:30:00.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:30:00.639 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:30:00.698 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:29:56
2026-05-29T17:30:00.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72435, datetime.datetime(2026, 5, 29, 17, 29, 56), datetime.datetime(2026, 5, 29, 17, 29, 56), 'salt', 12.35, 59.2, None, 8.65, 78.17, 7.73, 831.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:30:00.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:30:00.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:30:00.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:29:56, diff=4.704939s, valid=True
2026-05-29T17:30:00.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:30:00.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:30:00.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:30:12, diff=-11.292235s, valid=True
2026-05-29T17:30:00.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:30:00.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:30:00.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:29:52, diff=8.718083s, valid=True
2026-05-29T17:30:00.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:30:00.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:30:00.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:30:00.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:30:00.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:30:00.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:30:00.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:30:12, diff=-11.278877s, valid=True
2026-05-29T17:30:00.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:30:00.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:30:00.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:30:00.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001242.721806s, valid=True
2026-05-29T17:30:00.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:30:00.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:30:00.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:30:00.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:30:00.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:30:00.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:30:00.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:30:00.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:30:00.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:30:00.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:30:00.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:30:00.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:30:00.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:30:01.040 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:30:01.299 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:30:01.769 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:30:01.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:30:01.869 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:30:01.869 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:30:02.043 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:30:02.043 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:30:32.073 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:30:32.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:30:32.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:30:32.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:30:32.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:30:32.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:30:32.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-05-29T17:30:32.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:30:32.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-05-29T17:30:32.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:30:32.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:30:32.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:30:32.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T17:30:34.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-05-29T17:30:34.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:30:34.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:30:34.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:30:34.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:30:34.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:30:34.952 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:30:34.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:30:34.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:30:34.953 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:30:34.953 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:30:34.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:30:35.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:30:35.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:30:35.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:30:35.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:30:35.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:30:35.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:30:35.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:30:35.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:30:35.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:30:35.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:30:35.203 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:30:35.262 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:30:26
2026-05-29T17:30:35.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72436, datetime.datetime(2026, 5, 29, 17, 30, 26), datetime.datetime(2026, 5, 29, 17, 30, 25), 'salt', 11.72, 64.31, None, 6.5, 71.49, 6.5, 831.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:30:35.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:30:35.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:30:35.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:30:25, diff=10.268153s, valid=True
2026-05-29T17:30:35.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:30:35.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:30:35.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:30:12, diff=23.271012s, valid=True
2026-05-29T17:30:35.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:30:35.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:30:35.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:30:24, diff=11.277792s, valid=True
2026-05-29T17:30:35.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:30:35.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:30:35.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:30:35.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:30:35.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:30:35.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:30:35.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:30:12, diff=23.280821s, valid=True
2026-05-29T17:30:35.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:30:35.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:30:35.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:30:35.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001277.281474s, valid=True
2026-05-29T17:30:35.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:30:35.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:30:35.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:30:35.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:30:35.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:30:35.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:30:35.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:30:35.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:30:35.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:30:35.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:30:35.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:30:35.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:30:35.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:30:35.594 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:30:35.807 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:30:36.152 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:30:36.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:30:36.252 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:30:36.252 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:30:36.422 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:30:36.422 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:31:06.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:31:06.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:31:06.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:31:07.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:31:07.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:31:07.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:31:07.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-05-29T17:31:07.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:31:07.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-05-29T17:31:07.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:31:07.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:31:07.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:31:07.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-05-29T17:31:09.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-05-29T17:31:09.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:31:09.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:31:09.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:31:09.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:31:09.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:31:09.662 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:31:09.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:31:09.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:31:09.662 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:31:09.662 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:31:09.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:31:09.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:31:09.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:31:09.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:31:09.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:31:09.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:31:09.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:31:09.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:31:09.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:31:09.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:31:09.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:31:09.921 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:31:09.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:30:56
2026-05-29T17:31:09.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72437, datetime.datetime(2026, 5, 29, 17, 30, 56), datetime.datetime(2026, 5, 29, 17, 30, 56), 'salt', 11.39, 65.76, None, 8.19, 63.25, 6.17, 831.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:31:09.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:31:09.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:31:09.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:30:56, diff=13.986877s, valid=True
2026-05-29T17:31:09.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:31:09.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:31:09.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:31:12, diff=-2.010012s, valid=True
2026-05-29T17:31:09.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:31:09.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:31:09.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:30:55, diff=14.997013s, valid=True
2026-05-29T17:31:09.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:31:09.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:31:09.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:31:09.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:31:09.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:31:09.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:31:10.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:31:12, diff=-1.999823s, valid=True
2026-05-29T17:31:10.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:31:10.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:31:10.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:31:10.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001312.000869s, valid=True
2026-05-29T17:31:10.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:31:10.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:31:10.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:31:10.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:31:10.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:31:10.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:31:10.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:31:10.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:31:10.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:31:10.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:31:10.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:31:10.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:31:10.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:31:10.343 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:31:10.558 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:31:10.984 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:31:11.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:31:11.086 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:31:11.086 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:31:11.243 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:31:11.243 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:31:41.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:31:41.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:31:41.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:31:41.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:31:41.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:31:41.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:31: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-05-29T17:31:41.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:31:41.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-05-29T17:31:41.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:31:41.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:31:41.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:31:41.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-05-29T17:31:44.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-05-29T17:31:44.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:31:44.323 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:31:44.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:31:44.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:31:44.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:31:44.347 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:31:44.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:31:44.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:31:44.347 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:31:44.347 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:31:44.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:31:44.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:31:44.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:31:44.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:31:44.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:31:44.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:31:44.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:31:44.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:31:44.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:31:44.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:31:44.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:31:44.603 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:31:44.662 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:31:27
2026-05-29T17:31:44.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72438, datetime.datetime(2026, 5, 29, 17, 31, 27), datetime.datetime(2026, 5, 29, 17, 31, 26), 'salt', 11.16, 67.85, None, 11.19, 75.97, 5.71, 831.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:31:44.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:31:44.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:31:44.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:31:26, diff=18.668283s, valid=True
2026-05-29T17:31:44.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:31:44.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:31:44.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:31:12, diff=32.671196s, valid=True
2026-05-29T17:31:44.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:31:44.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:31:44.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:31:22, diff=22.677958s, valid=True
2026-05-29T17:31:44.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:31:44.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:31:44.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:31:44.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:31:44.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:31:44.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:31:44.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:31:12, diff=32.681046s, valid=True
2026-05-29T17:31:44.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:31:44.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:31:44.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:31:44.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001346.681736s, valid=True
2026-05-29T17:31:44.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:31:44.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:31:44.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:31:44.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:31:44.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:31:44.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:31:44.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:31:44.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:31:44.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:31:44.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:31:44.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:31:44.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:31:44.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:31:45.002 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:31:45.221 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:31:45.578 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:31:45.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:31:45.681 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:31:45.681 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:31:45.884 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:31:45.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:32:15.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:32:15.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:32:15.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:32:16.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:32:16.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:32:16.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:32:16.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-05-29T17:32:16.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:32:16.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-05-29T17:32:16.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:32:16.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:32:16.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:32:16.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-05-29T17:32:18.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-05-29T17:32:18.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:32:18.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:32:18.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:32:18.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:32:18.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:32:18.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:32:18.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:32:18.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:32:18.966 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:32:18.966 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:32:18.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:32:19.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:32:19.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:32:19.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:32:19.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:32:19.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:32:19.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:32:19.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:32:19.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:32:19.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:32:19.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:32:19.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:32:19.289 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:31:58
2026-05-29T17:32:19.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72439, datetime.datetime(2026, 5, 29, 17, 31, 58), datetime.datetime(2026, 5, 29, 17, 31, 57), 'salt', 11.06, 69.08, None, 11.86, 77.47, 5.45, 831.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:32:19.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:32:19.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:32:19.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:31:57, diff=22.295432s, valid=True
2026-05-29T17:32:19.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:32:19.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:32:19.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:32:12, diff=7.298279s, valid=True
2026-05-29T17:32:19.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:32:19.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:32:19.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:31:53, diff=26.305074s, valid=True
2026-05-29T17:32:19.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:32:19.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:32:19.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:32:19.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:32:19.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:32:19.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:32:19.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:32:12, diff=7.308096s, valid=True
2026-05-29T17:32:19.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:32:19.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:32:19.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:32:19.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001381.308784s, valid=True
2026-05-29T17:32:19.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:32:19.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:32:19.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:32:19.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:32:19.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:32:19.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:32:19.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:32:19.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:32:19.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:32:19.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:32:19.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:32:19.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:32:19.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:32:19.624 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:32:19.916 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:32:20.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:32:20.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:32:20.380 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:32:20.380 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:32:20.553 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:32:20.553 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:32:50.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:32:50.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:32:50.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:32:50.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:32:50.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:32:51.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:32:51.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-05-29T17:32:51.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:32:51.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-05-29T17:32:51.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:32:51.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:32:51.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:32:51.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T17:32:53.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-05-29T17:32:53.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:32:53.419 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:32:53.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:32:53.427 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:32:53.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:32:53.439 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:32:53.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:32:53.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:32:53.440 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:32:53.440 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:32:53.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:32:53.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:32:53.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:32:53.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:32:53.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:32:53.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:32:53.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:32:53.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:32:53.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:32:53.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:32:53.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:32:53.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:32:53.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:32:28
2026-05-29T17:32:53.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72440, datetime.datetime(2026, 5, 29, 17, 32, 28), datetime.datetime(2026, 5, 29, 17, 32, 28), 'salt', 10.89, 71.67, None, 10.8, 68.37, 4.9, 831.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:32:53.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:32:53.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:32:53.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:32:28, diff=25.764827s, valid=True
2026-05-29T17:32:53.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:32:53.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:32:53.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:32:12, diff=41.767702s, valid=True
2026-05-29T17:32:53.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:32:53.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:32:53.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:32:23, diff=30.774437s, valid=True
2026-05-29T17:32:53.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:32:53.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:32:53.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:32:53.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:32:53.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:32:53.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:32:53.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:32:12, diff=41.777498s, valid=True
2026-05-29T17:32:53.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:32:53.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:32:53.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:32:53.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001415.778171s, valid=True
2026-05-29T17:32:53.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:32:53.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:32:53.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:32:53.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:32:53.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:32:53.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:32:53.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:32:53.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:32:53.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:32:53.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:32:53.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:32:54.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:32:54.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:32:54.094 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:32:54.308 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:32:54.655 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:32:54.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:32:54.759 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:32:54.759 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:32:54.976 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:32:54.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:33:25.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:33:25.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:33:25.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:33:25.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:33:25.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:33:25.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:33:25.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:33:25.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:33:25.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-05-29T17:33:25.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:33:25.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:33:25.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:33:25.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-05-29T17:33:28.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-05-29T17:33:28.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:33:28.726 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:33:28.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:33:28.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:33:28.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:33:28.746 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:33:28.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:33:28.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:33:28.746 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:33:28.746 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:33:28.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:33:28.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:33:28.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:33:28.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:33:28.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:33:28.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:33:28.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:33:28.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:33:28.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:33:28.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:33:28.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:33:28.998 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:33:29.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:33:28
2026-05-29T17:33:29.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72442, datetime.datetime(2026, 5, 29, 17, 33, 28), datetime.datetime(2026, 5, 29, 17, 33, 28), 'salt', 10.56, 73.72, None, 13.45, 97.78, 4.48, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:33:29.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:33:29.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:33:29.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:33:28, diff=1.063482s, valid=True
2026-05-29T17:33:29.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:33:29.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:33:29.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:33:12, diff=17.066331s, valid=True
2026-05-29T17:33:29.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:33:29.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:33:29.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:33:23, diff=6.073191s, valid=True
2026-05-29T17:33:29.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:33:29.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:33:29.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:33:29.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:33:29.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:33:29.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:33:29.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:33:12, diff=17.076269s, valid=True
2026-05-29T17:33:29.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:33:29.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:33:29.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:33:29.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001451.077067s, valid=True
2026-05-29T17:33:29.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:33:29.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:33:29.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:33:29.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:33:29.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:33:29.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:33:29.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:33:29.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:33:29.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:33:29.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:33:29.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:33:29.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:33:29.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:33:29.467 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:33:29.680 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:33:30.050 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:33:30.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:33:30.163 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:33:30.163 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:33:30.377 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:33:30.377 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:34:00.407 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:34:00.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:34:00.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:34:00.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:34:00.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:34:00.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:34:00.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-05-29T17:34:00.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:34:00.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-05-29T17:34:00.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:34:00.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:34:00.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:34:00.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-05-29T17:34:03.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-05-29T17:34:03.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:34:03.220 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:34:03.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:34:03.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:34:03.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:34:03.241 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:34:03.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:34:03.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:34:03.241 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:34:03.241 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:34:03.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:34:03.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:34:03.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:34:03.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:34:03.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:34:03.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:34:03.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:34:03.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:34:03.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:34:03.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:34:03.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:34:03.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:34:03.572 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:33:59
2026-05-29T17:34:03.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72443, datetime.datetime(2026, 5, 29, 17, 33, 59), datetime.datetime(2026, 5, 29, 17, 33, 58), 'salt', 10.56, 74.12, None, 14.19, 95.55, 4.41, 831.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:34:03.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:34:03.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:34:03.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:33:58, diff=5.578545s, valid=True
2026-05-29T17:34:03.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:34:03.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:34:03.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:34:12, diff=-8.418599s, valid=True
2026-05-29T17:34:03.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:34:03.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:34:03.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:33:54, diff=9.588077s, valid=True
2026-05-29T17:34:03.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:34:03.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:34:03.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:34:03.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:34:03.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:34:03.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:34:03.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:34:12, diff=-8.408878s, valid=True
2026-05-29T17:34:03.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:34:03.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:34:03.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:34:03.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001485.591795s, valid=True
2026-05-29T17:34:03.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:34:03.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:34:03.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:34:03.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:34:03.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:34:03.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:34:03.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:34:03.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:34:03.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:34:03.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:34:03.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:34:03.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:34:03.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:34:03.908 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:34:04.138 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:34:04.488 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:34:04.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:34:04.588 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:34:04.589 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:34:04.872 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:34:04.872 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:34:34.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:34:34.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:34:34.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:34:35.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:34:35.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:34:35.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:34:35.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:34:35.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:34: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-05-29T17:34:35.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:34:35.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:34:35.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:34:35.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-05-29T17:34:37.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-05-29T17:34:37.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:34:37.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:34:37.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:34:37.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:34:37.754 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:34:37.754 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:34:37.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:34:37.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:34:37.754 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:34:37.754 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:34:37.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:34:37.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:34:37.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:34:37.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:34:37.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:34:37.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:34:37.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:34:38.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:34:38.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:34:38.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:34:38.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:34:38.017 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:34:38.077 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:34:29
2026-05-29T17:34:38.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72444, datetime.datetime(2026, 5, 29, 17, 34, 29), datetime.datetime(2026, 5, 29, 17, 34, 29), 'salt', 10.33, 74.28, None, 8.65, 65.08, 4.37, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:34:38.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:34:38.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:34:38.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:34:29, diff=9.083562s, valid=True
2026-05-29T17:34:38.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:34:38.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:34:38.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:34:12, diff=26.086469s, valid=True
2026-05-29T17:34:38.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:34:38.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:34:38.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:34:25, diff=13.09313s, valid=True
2026-05-29T17:34:38.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:34:38.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:34:38.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:34:38.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:34:38.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:34:38.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:34:38.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:34:12, diff=26.096223s, valid=True
2026-05-29T17:34:38.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:34:38.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:34:38.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:34:38.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001520.096895s, valid=True
2026-05-29T17:34:38.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:34:38.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:34:38.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:34:38.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:34:38.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:34:38.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:34:38.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:34:38.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:34:38.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:34:38.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:34:38.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:34:38.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:34:38.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:34:38.591 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:34:38.804 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:34:39.151 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:34:39.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:34:39.251 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:34:39.251 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:34:39.500 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:34:39.500 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:35:09.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:35:09.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:35:09.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:35:09.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:35:09.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:35:09.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:35:09.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-05-29T17:35:09.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:35:09.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-05-29T17:35:09.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:35:09.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:35:09.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:35:09.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-05-29T17:35: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-05-29T17:35:12.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:35:12.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:35:12.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:35:12.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:35:12.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:35:12.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:35:12.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:35:12.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:35:12.391 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:35:12.391 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:35:12.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:35:12.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:35:12.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:35:12.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:35:12.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:35:12.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:35:12.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:35:12.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:35:12.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:35:12.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:35:12.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:35:12.647 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:35:12.705 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:34:59
2026-05-29T17:35:12.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72445, datetime.datetime(2026, 5, 29, 17, 34, 59), datetime.datetime(2026, 5, 29, 17, 34, 59), 'salt', 10.33, 74.25, None, 11.29, 54.74, 4.37, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:35:12.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:35:12.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:35:12.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:34:59, diff=13.711806s, valid=True
2026-05-29T17:35:12.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:35:12.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:35:12.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:35:12, diff=0.714657s, valid=True
2026-05-29T17:35:12.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:35:12.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:35:12.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:34:56, diff=16.721211s, valid=True
2026-05-29T17:35:12.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:35:12.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:35:12.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:35:12.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:35:12.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:35:12.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:35:12.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:35:12, diff=0.724279s, valid=True
2026-05-29T17:35:12.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:35:12.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:35:12.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:35:12.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001554.724938s, valid=True
2026-05-29T17:35:12.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:35:12.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:35:12.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:35:12.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:35:12.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:35:12.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:35:12.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:35:12.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:35:12.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:35:12.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:35:12.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:35:12.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:35:12.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:35:13.040 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:35:13.254 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:35:13.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:35:13.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:35:13.701 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:35:13.701 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:35:13.864 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:35:13.864 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:35:43.870 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:35:43.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:35:43.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:35:44.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:35:44.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:35:44.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:35:44.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-05-29T17:35:44.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:35:44.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-05-29T17:35:44.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:35:44.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:35:44.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:35:44.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T17:35:46.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-05-29T17:35:46.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:35:46.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:35:46.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:35:46.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:35:46.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:35:46.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:35:46.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:35:46.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:35:46.846 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:35:46.846 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:35:46.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:35:46.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:35:46.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:35:47.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:35:47.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:35:47.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:35:47.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:35:47.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:35:47.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:35:47.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:35:47.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:35:47.099 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:35:47.163 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:35:29
2026-05-29T17:35:47.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72446, datetime.datetime(2026, 5, 29, 17, 35, 29), datetime.datetime(2026, 5, 29, 17, 35, 29), 'salt', 10.33, 72.23, None, 10.55, 80.02, 4.77, 831.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:35:47.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:35:47.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:35:47.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:35:29, diff=18.169402s, valid=True
2026-05-29T17:35:47.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:35:47.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:35:47.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:35:12, diff=35.172208s, valid=True
2026-05-29T17:35:47.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:35:47.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:35:47.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:35:28, diff=19.178813s, valid=True
2026-05-29T17:35:47.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:35:47.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:35:47.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:35:47.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:35:47.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:35:47.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:35:47.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:35:12, diff=35.181836s, valid=True
2026-05-29T17:35:47.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:35:47.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:35:47.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:35:47.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001589.182482s, valid=True
2026-05-29T17:35:47.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:35:47.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:35:47.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:35:47.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:35:47.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:35:47.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:35:47.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:35:47.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:35:47.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:35:47.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:35:47.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:35:47.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:35:47.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:35:47.496 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:35:47.714 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:35:48.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:35:48.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:35:48.162 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:35:48.162 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:35:48.368 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:35:48.368 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:36:18.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:36:18.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:36:18.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:36:18.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:36:18.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:36:18.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:36:18.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-05-29T17:36:18.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:36: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-05-29T17:36:18.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:36:18.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:36:18.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:36:18.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-05-29T17:36:21.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-05-29T17:36:21.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:36:21.401 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:36:21.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:36:21.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:36:21.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:36:21.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:36:21.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:36:21.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:36:21.422 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:36:21.422 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:36:21.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:36:21.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:36:21.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:36:21.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:36:21.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:36:21.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:36:21.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:36:21.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:36:21.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:36:21.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:36:21.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:36:21.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:36:21.731 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:36:00
2026-05-29T17:36:21.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72447, datetime.datetime(2026, 5, 29, 17, 36), datetime.datetime(2026, 5, 29, 17, 35, 59), 'salt', 10.49, 71.93, None, 12.14, 91.54, 4.83, 831.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:36:21.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:36:21.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:36:21.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:35:59, diff=22.737487s, valid=True
2026-05-29T17:36:21.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:36:21.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:36:21.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:36:12, diff=9.740388s, valid=True
2026-05-29T17:36:21.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:36:21.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:36:21.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:35:59, diff=22.747177s, valid=True
2026-05-29T17:36:21.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:36:21.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:36:21.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:36:21.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:36:21.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:36:21.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:36:21.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:36:12, diff=9.750257s, valid=True
2026-05-29T17:36:21.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:36:21.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:36:21.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:36:21.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001623.75092s, valid=True
2026-05-29T17:36:21.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:36:21.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:36:21.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:36:21.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:36:21.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:36:21.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:36:21.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:36:21.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:36:21.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:36:21.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:36:21.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:36:21.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:36:22.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:36:22.067 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:36:22.284 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:36:22.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:36:22.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:36:22.793 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:36:22.793 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:36:22.945 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:36:22.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:36:52.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:36:52.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:36:52.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:36:53.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:36:53.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:36:53.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:36:53.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-05-29T17:36:53.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:36:53.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-05-29T17:36:53.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:36:53.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:36:53.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:36:53.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-05-29T17:36:55.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-05-29T17:36:55.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:36:55.604 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:36:55.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:36:55.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:36:55.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:36:55.624 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:36:55.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:36:55.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:36:55.624 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:36:55.624 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:36:55.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:36:55.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:36:55.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:36:55.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:36:55.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:36:55.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:36:55.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:36:55.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:36:55.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:36:55.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:36:55.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:36:55.875 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:36:55.940 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:36:30
2026-05-29T17:36:55.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72448, datetime.datetime(2026, 5, 29, 17, 36, 30), datetime.datetime(2026, 5, 29, 17, 36, 29), 'salt', 10.59, 70.87, None, 14.26, 76.34, 5.05, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:36:55.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:36:55.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:36:55.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:36:29, diff=26.94612s, valid=True
2026-05-29T17:36:55.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:36:55.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:36:55.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:36:12, diff=43.948983s, valid=True
2026-05-29T17:36:55.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:36:55.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:36:55.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:36:25, diff=30.955606s, valid=True
2026-05-29T17:36:55.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:36:55.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:36:55.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:36:55.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:36:55.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:36:55.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:36:55.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:36:12, diff=43.958736s, valid=True
2026-05-29T17:36:55.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:36:55.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:36:55.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:36:55.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001657.959398s, valid=True
2026-05-29T17:36:55.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:36:55.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:36:55.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:36:55.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:36:55.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:36:56.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:36:56.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:36:56.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:36:56.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:36:56.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:36:56.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:36:56.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:36:56.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:36:56.275 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:36:56.483 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:36:56.824 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:36:56.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:36:56.923 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:36:56.924 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:36:57.154 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:36:57.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:37:27.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:37:27.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:37:27.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:37:27.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:37:27.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:37:27.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:37:27.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-05-29T17:37:27.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:37:27.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-05-29T17:37:27.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:37:27.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:37:27.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:37:27.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-05-29T17:37:30.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-05-29T17:37:30.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:37:30.303 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:37:30.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:37:30.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:37:30.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:37:30.323 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:37:30.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:37:30.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:37:30.323 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:37:30.323 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:37:30.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:37:30.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:37:30.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:37:30.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:37:30.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:37:30.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:37:30.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:37:30.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:37:30.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:37:30.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:37:30.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:37:30.577 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:37:30.639 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:37:30
2026-05-29T17:37:30.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72450, datetime.datetime(2026, 5, 29, 17, 37, 30), datetime.datetime(2026, 5, 29, 17, 37, 30), 'salt', 10.83, 67.19, None, 13.3, 52.8, 5.83, 832.02, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:37:30.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:37:30.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:37:30.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:37:30, diff=0.645932s, valid=True
2026-05-29T17:37:30.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:37:30.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:37:30.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:37:12, diff=18.6488s, valid=True
2026-05-29T17:37:30.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:37:30.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:37:30.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:37:26, diff=4.655469s, valid=True
2026-05-29T17:37:30.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:37:30.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:37:30.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:37:30.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:37:30.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:37:30.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:37:30.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:37:12, diff=18.658528s, valid=True
2026-05-29T17:37:30.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:37:30.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:37:30.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:37:30.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001692.659204s, valid=True
2026-05-29T17:37:30.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:37:30.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:37:30.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:37:30.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:37:30.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:37:30.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:37:30.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:37:30.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:37:30.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:37:30.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:37:30.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:37:30.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:37:30.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:37:30.982 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:37:31.269 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:37:31.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:37:31.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:37:31.725 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:37:31.725 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:37:31.882 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:37:31.882 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:38:01.912 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:38:01.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:38:01.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:38:02.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:38:02.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:38:02.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:38:02.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:38:02.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:38:02.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-05-29T17:38:02.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:38:02.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:38:02.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:38:02.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-05-29T17:38:04.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-05-29T17:38:04.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:38:04.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:38:04.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:38:04.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:38:04.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:38:04.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:38:04.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:38:04.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:38:04.769 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:38:04.770 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:38:04.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:38:04.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:38:04.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:38:04.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:38:04.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:38:04.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:38:04.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:38:05.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:38:05.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:38:05.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:38:05.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:38:05.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:38:05.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:38:00
2026-05-29T17:38:05.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72451, datetime.datetime(2026, 5, 29, 17, 38), datetime.datetime(2026, 5, 29, 17, 38), 'salt', 10.93, 66.86, None, 11.72, 64.66, 5.91, 831.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:38:05.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:38:05.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:38:05.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:38:00, diff=5.106929s, valid=True
2026-05-29T17:38:05.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:38:05.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:38:05.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:38:12, diff=-6.890197s, valid=True
2026-05-29T17:38:05.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:38:05.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:38:05.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:37:56, diff=9.116426s, valid=True
2026-05-29T17:38:05.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:38:05.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:38:05.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:38:05.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:38:05.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:38:05.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:38:05.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:38:12, diff=-6.880492s, valid=True
2026-05-29T17:38:05.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:38:05.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:38:05.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:38:05.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001727.120178s, valid=True
2026-05-29T17:38:05.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:38:05.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:38:05.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:38:05.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:38:05.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:38:05.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:38:05.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:38:05.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:38:05.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:38:05.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:38:05.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:38:05.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:38:05.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:38:05.434 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:38:05.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:38:05.976 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:38:06.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:38: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-05-29T17:38: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-05-29T17:38:06.247 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:38:06.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:38:36.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:38:36.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:38:36.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:38:36.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:38:36.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:38:36.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:38:36.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:38:36.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:38:36.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-05-29T17:38:36.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:38:36.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:38:36.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:38:36.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-05-29T17:38:39.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-05-29T17:38:39.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:38:39.169 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:38:39.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:38:39.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:38:39.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:38:39.188 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:38:39.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:38:39.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:38:39.188 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:38:39.188 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:38:39.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:38:39.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:38:39.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:38:39.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:38:39.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:38:39.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:38:39.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:38:39.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:38:39.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:38:39.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:38:39.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:38:39.446 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:38:39.505 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:38:31
2026-05-29T17:38:39.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72452, datetime.datetime(2026, 5, 29, 17, 38, 31), datetime.datetime(2026, 5, 29, 17, 38, 30), 'salt', 10.96, 69.05, None, 9.42, 66.52, 5.45, 832.02, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:38:39.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:38:39.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:38:39.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:38:30, diff=9.511215s, valid=True
2026-05-29T17:38:39.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:38:39.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:38:39.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:38:12, diff=27.514082s, valid=True
2026-05-29T17:38:39.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:38:39.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:38:39.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:38:26, diff=13.520844s, valid=True
2026-05-29T17:38:39.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:38:39.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:38:39.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:38:39.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:38:39.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:38:39.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:38:39.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:38:12, diff=27.523865s, valid=True
2026-05-29T17:38:39.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:38:39.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:38:39.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:38:39.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001761.524512s, valid=True
2026-05-29T17:38:39.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:38:39.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:38:39.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:38:39.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:38:39.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:38:39.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:38:39.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:38:39.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:38:39.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:38:39.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:38:39.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:38:39.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:38:39.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:38:39.840 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:38:40.158 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:38:40.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:38:40.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:38:40.616 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:38:40.616 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:38:40.788 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:38:40.788 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:39:10.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:39:10.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:39:10.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:39:11.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:39:11.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:39:11.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:39:11.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-05-29T17:39:11.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:39:11.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-05-29T17:39:11.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:39:11.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:39:11.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:39:11.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-05-29T17:39:13.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-05-29T17:39:13.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:39:13.606 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:39:13.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:39:13.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:39:13.632 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:39:13.632 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:39:13.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:39:13.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:39:13.632 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:39:13.632 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:39:13.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:39:13.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:39:13.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:39:13.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:39:13.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:39:13.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:39:13.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:39:13.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:39:13.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:39:13.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:39:13.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:39:13.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:39:13.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:39:01
2026-05-29T17:39:13.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72453, datetime.datetime(2026, 5, 29, 17, 39, 1), datetime.datetime(2026, 5, 29, 17, 39), 'salt', 10.73, 70.14, None, 10.8, 53.01, 5.21, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:39:13.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:39:13.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:39:13.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:00, diff=13.957286s, valid=True
2026-05-29T17:39:13.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:39:13.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:39:13.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=1.960151s, valid=True
2026-05-29T17:39:13.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:39:13.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:39:13.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:38:57, diff=16.967109s, valid=True
2026-05-29T17:39:13.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:39:13.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:39:13.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:39:13.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:39:13.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:39:13.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:39:13.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=1.970292s, valid=True
2026-05-29T17:39:13.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:39:13.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:39:13.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:39:13.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001795.970987s, valid=True
2026-05-29T17:39:13.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:39:13.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:39:13.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:39:13.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:39:13.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:39:14.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:39:14.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:39:14.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:39:14.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:39:14.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:39:14.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:39:14.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:39:14.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:39:14.291 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:39:14.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:39:14.844 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:39:14.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:39:14.945 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:39:14.945 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:39:15.120 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:39:15.120 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:39:45.143 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:39:45.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:39:45.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:39:45.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:39:45.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:39:45.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:39:45.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-05-29T17:39:45.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:39:45.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-05-29T17:39:45.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:39:45.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:39:45.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:39:45.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T17:39:47.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-05-29T17:39:47.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:39:47.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:39:47.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:39:47.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:39:47.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:39:47.948 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:39:47.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:39:47.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:39:47.949 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:39:47.949 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:39:47.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:39:48.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:39:48.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:39:48.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:39:48.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:39:48.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:39:48.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:39:48.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T17:39:48.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:39:48.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:39:48.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:39:48.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:39:48.272 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:39:31
2026-05-29T17:39:48.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72454, datetime.datetime(2026, 5, 29, 17, 39, 31), datetime.datetime(2026, 5, 29, 17, 39, 31), 'salt', 10.66, 70.01, None, 14.82, 54.84, 5.23, 831.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:39:48.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:39:48.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:39:48.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:31, diff=17.27884s, valid=True
2026-05-29T17:39:48.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:39:48.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:39:48.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=36.281671s, valid=True
2026-05-29T17:39:48.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:39:48.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:39:48.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:29, diff=19.288325s, valid=True
2026-05-29T17:39:48.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:39:48.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:39:48.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:39:48.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:39:48.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:39:48.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T17:39:48.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=36.291373s, valid=True
2026-05-29T17:39:48.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:39:48.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:39:48.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:39:48.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001830.292033s, valid=True
2026-05-29T17:39:48.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:39:48.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:39:48.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:39:48.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:39:48.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:39:48.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:39:48.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:39:48.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:39:48.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:39:48.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:39:48.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:39:48.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:39:48.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:39:48.693 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:39:48.906 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:39:49.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:39:49.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:39:49.361 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:39:49.361 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:39:49.530 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:39:49.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:40:19.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:40:19.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:40:19.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:40:19.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:40:19.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:40:20.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:40:20.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:40:20.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:40:20.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-05-29T17:40:20.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:40:20.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:40:20.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:40:20.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-05-29T17:40:22.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-05-29T17:40:22.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:40:22.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:40:22.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:40:22.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:40:22.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:40:22.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:40:22.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:40:22.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:40:22.410 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:40:22.410 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:40:22.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:40:22.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:40:22.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:40:22.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:40:22.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:40:22.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:40:22.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:40:22.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T17:40:22.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:40:22.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:40:22.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:40:22.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:40:22.723 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:40:01
2026-05-29T17:40:22.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72455, datetime.datetime(2026, 5, 29, 17, 40, 1), datetime.datetime(2026, 5, 29, 17, 40, 1), 'salt', 10.63, 69.45, None, 16.97, 49.66, 5.35, 831.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:40:22.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:40:22.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:40:22.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:40:01, diff=21.729507s, valid=True
2026-05-29T17:40:22.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:40:22.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:40:22.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=70.732353s, valid=True
2026-05-29T17:40:22.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:40:22.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:40:22.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:40:00, diff=22.738985s, valid=True
2026-05-29T17:40:22.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:40:22.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:40:22.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:40:22.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:40:22.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:40:22.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T17:40:22.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=70.742013s, valid=True
2026-05-29T17:40:22.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:40:22.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:40:22.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:40:22.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001864.742674s, valid=True
2026-05-29T17:40:22.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:40:22.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:40:22.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:40:22.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:40:22.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:40:22.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:40:22.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:40:22.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:40:22.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:40:22.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:40:22.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:40:22.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:40:23.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:40:23.069 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:40:23.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:40:23.637 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:40:23.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:40:23.735 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:40:23.735 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:40:23.936 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:40:23.936 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:40:53.966 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:40:53.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:40:53.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:40:54.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:40:54.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:40:54.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:40:54.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-05-29T17:40:54.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:40:54.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-05-29T17:40:54.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:40:54.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:40:54.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:40:54.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-05-29T17:40:57.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-05-29T17:40:57.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:40:57.060 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:40:57.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:40:57.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:40:57.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:40:57.081 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:40:57.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:40:57.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:40:57.081 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:40:57.081 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:40:57.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:40:57.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:40:57.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:40:57.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:40:57.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:40:57.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T17:40:57.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:40:57.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T17:40:57.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:40:57.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:40:57.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:40:57.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:40:57.396 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:40:31
2026-05-29T17:40:57.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72456, datetime.datetime(2026, 5, 29, 17, 40, 31), datetime.datetime(2026, 5, 29, 17, 40, 31), 'salt', 10.79, 65.14, None, 13.87, 63.77, 6.27, 832.02, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:40:57.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:40:57.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:40:57.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:40:31, diff=26.402161s, valid=True
2026-05-29T17:40:57.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:40:57.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T17:40:57.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=105.404965s, valid=True
2026-05-29T17:40:57.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:40:57.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:40:57.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:40:27, diff=30.411615s, valid=True
2026-05-29T17:40:57.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:40:57.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:40:57.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:40:57.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:40:57.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:40:57.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T17:40:57.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=105.414653s, valid=True
2026-05-29T17:40:57.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:40:57.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:40:57.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:40:57.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001899.415304s, valid=True
2026-05-29T17:40:57.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:40:57.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:40:57.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:40:57.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:40:57.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:40:57.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:40:57.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:40:57.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:40:57.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:40:57.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:40:57.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:40:57.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:40:57.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:40:57.800 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:40:58.007 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:40:58.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:40:58.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:40:58.450 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:40:58.450 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:40:58.703 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:40:58.703 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:41:28.733 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:41:28.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:41:28.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:41:28.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:41:28.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:41:29.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:41:29.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-05-29T17:41:29.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:41:29.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-05-29T17:41:29.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:41:29.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:41:29.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:41:29.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-05-29T17:41:31.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-05-29T17:41:31.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:41:31.526 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:41:31.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:41:31.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:41:31.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:41:31.562 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:41:31.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:41:31.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:41:31.562 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:41:31.563 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:41:31.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:41:31.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:41:31.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:41:31.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:41:31.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:41:31.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T17:41:31.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:41:31.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T17:41:31.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:41:31.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:41:31.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:41:31.820 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:41:31.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:41:02
2026-05-29T17:41:31.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72457, datetime.datetime(2026, 5, 29, 17, 41, 2), datetime.datetime(2026, 5, 29, 17, 41, 1), 'salt', 10.89, 65.17, None, 12.92, 48.53, 6.27, 831.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:41:31.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:41:31.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:41:31.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:41:01, diff=30.889414s, valid=True
2026-05-29T17:41:31.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:41:31.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T17:41:31.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=139.8923s, valid=True
2026-05-29T17:41:31.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:41:31.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:41:31.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:40:57, diff=34.899031s, valid=True
2026-05-29T17:41:31.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:41:31.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:41:31.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:41:31.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:41:31.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:41:31.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T17:41:31.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=139.902146s, valid=True
2026-05-29T17:41:31.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:41:31.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:41:31.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:41:31.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001933.902816s, valid=True
2026-05-29T17:41:31.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:41:31.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:41:31.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:41:31.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:41:31.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:41:31.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:41:31.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:41:31.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:41:31.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:41:32.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:41:32.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:41:32.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:41:32.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:41:32.223 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:41:32.429 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:41:32.775 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:41:32.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:41:32.873 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:41:32.873 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:41:33.043 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:41:33.043 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:42:03.074 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:42:03.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:42:03.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:42:03.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:42:03.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:42:03.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:42:03.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-05-29T17:42:03.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:42:03.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-05-29T17:42:03.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:42:03.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:42:03.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:42:03.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T17:42: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-05-29T17:42:06.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:42:06.016 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:42:06.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:42:06.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:42:06.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:42:06.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:42:06.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:42:06.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:42:06.046 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:42:06.046 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:42:06.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:42:06.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:42:06.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:42:06.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:42:06.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:42:06.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:42:06.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:42:06.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:42:06.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:42:06.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:42:06.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:42:06.375 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:42:06.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:42:02
2026-05-29T17:42:06.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72459, datetime.datetime(2026, 5, 29, 17, 42, 2), datetime.datetime(2026, 5, 29, 17, 42, 2), 'salt', 10.96, 65.67, None, 16.59, 49.3, 6.17, 831.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:42:06.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:42:06.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:42:06.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:42:02, diff=4.473428s, valid=True
2026-05-29T17:42:06.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:42:06.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:42:06.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=174.476264s, valid=True
2026-05-29T17:42:06.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:42:06.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:42:06.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:41:58, diff=8.48286s, valid=True
2026-05-29T17:42:06.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:42:06.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:42:06.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:42:06.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:42:06.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:42:06.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:42:06.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=174.485913s, valid=True
2026-05-29T17:42:06.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:42:06.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:42:06.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:42:06.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1001968.486567s, valid=True
2026-05-29T17:42:06.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:42:06.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:42:06.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:42:06.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:42:06.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:42:06.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:42:06.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:42:06.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:42:06.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:42:06.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:42:06.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:42:06.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:42:06.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:42:06.806 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:42:07.019 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:42:07.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:42:07.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:42:07.465 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:42:07.465 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:42:07.650 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:42:07.650 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:42:37.680 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:42:37.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:42:37.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:42:37.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:42:37.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:42:38.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:42:38.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-05-29T17:42:38.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:42:38.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-05-29T17:42:38.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:42:38.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:42:38.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:42:38.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-05-29T17:42:40.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-05-29T17:42:40.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:42:40.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:42:40.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:42:40.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:42:40.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:42:40.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:42:40.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:42:40.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:42:40.844 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:42:40.844 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:42:40.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:42:40.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:42:40.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:42:41.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:42:41.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:42:41.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:42:41.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:42:41.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T17:42:41.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:42:41.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:42:41.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:42:41.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:42:41.170 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:42:32
2026-05-29T17:42:41.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72460, datetime.datetime(2026, 5, 29, 17, 42, 32), datetime.datetime(2026, 5, 29, 17, 42, 31), 'salt', 10.96, 63.35, None, 12.56, 52.02, 6.68, 831.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:42:41.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:42:41.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:42:41.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:42:31, diff=10.176662s, valid=True
2026-05-29T17:42:41.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:42:41.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:42:41.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=209.179482s, valid=True
2026-05-29T17:42:41.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:42:41.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:42:41.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:42:28, diff=13.186037s, valid=True
2026-05-29T17:42:41.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:42:41.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:42:41.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:42:41.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:42:41.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:42:41.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T17:42:41.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=209.189096s, valid=True
2026-05-29T17:42:41.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:42:41.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:42:41.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:42:41.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002003.18978s, valid=True
2026-05-29T17:42:41.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:42:41.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:42:41.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:42:41.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:42:41.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:42:41.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:42:41.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:42:41.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:42:41.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:42:41.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:42:41.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:42:41.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:42:41.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:42:41.513 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:42:41.729 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:42:42.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:42:42.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:42:42.185 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:42:42.185 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:42:42.740 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:42:42.740 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:43:12.770 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:43:12.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:43:12.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:43:13.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:43:13.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:43:13.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:43:13.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-05-29T17:43:13.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:43:13.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-05-29T17:43:13.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:43:13.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:43:13.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:43:13.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T17:43:15.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-05-29T17:43:15.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:43:15.822 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:43:15.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:43:15.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:43:15.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:43:15.843 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:43:15.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:43:15.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:43:15.844 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:43:15.844 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:43:15.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:43:15.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:43:15.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:43:16.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:43:16.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:43:16.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:43:16.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:43:16.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:43:16.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:43:16.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:43:16.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:43:16.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:43:16.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:43:03
2026-05-29T17:43:16.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72461, datetime.datetime(2026, 5, 29, 17, 43, 3), datetime.datetime(2026, 5, 29, 17, 43, 2), 'salt', 11.09, 63.78, None, 13.45, 47.83, 6.59, 831.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:43:16.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:43:16.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:43:16.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:43:02, diff=14.178017s, valid=True
2026-05-29T17:43:16.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:43:16.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:43:16.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=244.180861s, valid=True
2026-05-29T17:43:16.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:43:16.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:43:16.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:42:58, diff=18.187435s, valid=True
2026-05-29T17:43:16.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:43:16.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:43:16.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:43:16.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:43:16.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:43:16.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:43:16.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=244.190478s, valid=True
2026-05-29T17:43:16.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:43:16.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:43:16.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:43:16.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002038.19115s, valid=True
2026-05-29T17:43:16.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:43:16.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:43:16.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:43:16.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:43:16.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:43:16.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:43:16.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:43:16.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:43:16.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:43:16.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:43:16.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:43:16.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:43:16.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:43:16.504 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:43:16.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:43:17.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:43:17.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:43:17.149 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:43:17.149 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:43:17.337 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:43:17.338 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:43:47.358 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:43:47.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:43:47.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:43:47.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:43:47.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:43:47.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:43:47.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:43:47.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:43:47.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T17:43:47.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:43:47.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:43:47.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:43:47.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-05-29T17:43:50.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-05-29T17:43:50.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:43:50.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:43:50.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:43:50.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:43:50.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:43:50.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:43:50.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:43:50.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:43:50.157 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:43:50.157 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:43:50.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:43:50.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:43:50.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:43:50.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:43:50.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:43:50.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:43:50.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:43:50.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:43:50.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:43:50.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:43:50.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:43:50.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:43:50.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:43:33
2026-05-29T17:43:50.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72462, datetime.datetime(2026, 5, 29, 17, 43, 33), datetime.datetime(2026, 5, 29, 17, 43, 32), 'salt', 11.09, 65.07, None, 13.66, 40.28, 6.3, 831.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:43:50.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:43:50.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:43:50.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:43:32, diff=18.482646s, valid=True
2026-05-29T17:43:50.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:43:50.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:43:50.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=278.48547s, valid=True
2026-05-29T17:43:50.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:43:50.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:43:50.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:43:29, diff=21.492241s, valid=True
2026-05-29T17:43:50.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:43:50.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:43:50.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:43:50.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:43:50.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:43:50.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:43:50.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=278.495273s, valid=True
2026-05-29T17:43:50.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:43:50.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:43:50.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:43:50.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002072.495935s, valid=True
2026-05-29T17:43:50.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:43:50.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:43:50.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:43:50.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:43:50.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:43:50.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:43:50.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:43:50.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:43:50.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:43:50.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:43:50.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:43:50.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:43:50.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:43:50.821 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:43:51.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:43:51.474 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:43:51.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:43:51.579 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:43:51.579 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:43:51.843 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:43:51.844 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:44:21.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:44:21.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:44:21.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:44:22.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:44:22.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:44:22.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:44:22.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-05-29T17:44:22.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:44:22.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-05-29T17:44:22.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:44:22.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:44:22.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:44:22.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-05-29T17:44:24.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-05-29T17:44:24.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:44:24.792 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:44:24.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:44:24.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:44:24.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:44:24.818 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:44:24.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:44:24.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:44:24.819 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:44:24.820 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:44:24.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:44:24.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:44:24.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:44:25.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:44:25.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:44:25.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:44:25.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:44:25.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:44:25.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:44:25.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:44:25.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:44:25.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:44:25.203 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:44:03
2026-05-29T17:44:25.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72463, datetime.datetime(2026, 5, 29, 17, 44, 3), datetime.datetime(2026, 5, 29, 17, 44, 2), 'salt', 10.99, 65.54, None, 12.7, 55.33, 6.19, 831.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:44:25.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:44:25.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:44:25.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:44:02, diff=23.209109s, valid=True
2026-05-29T17:44:25.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:44:25.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:44:25.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=313.211928s, valid=True
2026-05-29T17:44:25.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:44:25.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:44:25.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:44:01, diff=24.218572s, valid=True
2026-05-29T17:44:25.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:44:25.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:44:25.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:44:25.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:44:25.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:44:25.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:44:25.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:39:12, diff=313.221643s, valid=True
2026-05-29T17:44:25.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:44:25.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:44:25.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:44:25.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002107.222312s, valid=True
2026-05-29T17:44:25.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:44:25.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:44:25.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:44:25.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:44:25.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:44:25.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:44:25.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:44:25.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:44:25.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:44:25.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:44:25.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:44:25.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:44:25.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:44:25.546 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:44:25.761 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:44:26.098 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:44:26.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:44:26.193 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:44:26.193 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:44:26.347 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:44:26.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:44:56.376 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:44:56.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:44:56.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:44:56.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:44:56.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:44:56.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:44:56.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-05-29T17:44:56.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:44:56.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-05-29T17:44:56.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:44:56.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:44:56.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:44:56.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-05-29T17:44:59.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-05-29T17:44:59.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:44:59.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:44:59.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:44:59.309 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:44:59.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:44:59.321 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:44:59.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:44:59.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:44:59.322 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:44:59.322 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:44:59.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:44:59.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:44:59.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:44:59.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:44:59.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:44:59.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:44:59.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:44:59.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:44:59.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:44:59.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:44:59.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:44:59.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:44:59.644 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:44:33
2026-05-29T17:44:59.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72464, datetime.datetime(2026, 5, 29, 17, 44, 33), datetime.datetime(2026, 5, 29, 17, 44, 33), 'salt', 10.83, 67.29, None, 14.43, 53.88, 5.81, 831.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:44:59.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:44:59.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:44:59.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:44:33, diff=26.651029s, valid=True
2026-05-29T17:44:59.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:44:59.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:44:59.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:45:12, diff=-12.346153s, valid=True
2026-05-29T17:44:59.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:44:59.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:44:59.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:44:33, diff=26.660456s, valid=True
2026-05-29T17:44:59.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:44:59.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:44:59.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:44:59.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:44:59.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:44:59.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:44:59.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:45:12, diff=-12.336526s, valid=True
2026-05-29T17:44:59.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:44:59.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:44:59.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:44:59.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002141.664135s, valid=True
2026-05-29T17:44:59.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:44:59.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:44:59.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:44:59.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:44:59.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:44:59.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:44:59.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:44:59.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:44:59.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:44:59.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:44:59.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:44:59.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:44:59.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:45:00.037 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:45:00.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:45:00.674 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:45:00.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:45:00.777 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:45:00.777 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:45:00.948 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:45:00.949 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:45:30.966 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:45:30.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:45:30.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:45:31.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:45:31.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:45:31.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:45:31.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-05-29T17:45:31.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:45:31.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-05-29T17:45:31.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:45:31.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:45:31.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:45:31.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T17:45:33.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-05-29T17:45:33.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:45:33.797 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:45:33.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:45:33.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:45:33.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:45:33.819 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:45:33.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:45:33.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:45:33.820 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:45:33.820 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:45:33.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:45:33.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:45:33.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:45:34.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:45:34.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:45:34.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:45:34.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:45:34.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:45:34.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:45:34.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:45:34.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:45:34.124 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:45:34.186 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:45:34
2026-05-29T17:45:34.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72466, datetime.datetime(2026, 5, 29, 17, 45, 34), datetime.datetime(2026, 5, 29, 17, 45, 33), 'salt', 10.66, 68.89, None, 14.15, 45.11, 5.46, 831.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:45:34.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:45:34.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:45:34.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:45:33, diff=1.192299s, valid=True
2026-05-29T17:45:34.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:45:34.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:45:34.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:46:12, diff=-37.80474s, valid=True
2026-05-29T17:45:34.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:45:34.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:45:34.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:45:29, diff=5.202185s, valid=True
2026-05-29T17:45:34.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:45:34.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:45:34.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:45:34.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:45:34.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:45:34.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:45:34.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:46:12, diff=-37.794665s, valid=True
2026-05-29T17:45:34.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:45:34.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:45:34.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:45:34.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002176.206025s, valid=True
2026-05-29T17:45:34.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:45:34.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:45:34.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:45:34.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:45:34.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:45:34.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:45:34.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:45:34.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:45:34.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:45:34.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:45:34.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:45:34.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:45:34.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:45:34.567 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:45:34.802 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:45:35.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:45:35.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:45:35.267 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:45:35.267 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:45:35.511 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:45:35.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:46:05.534 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:46:05.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:46:05.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:46:05.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:46:05.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:46:06.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:46:06.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:46:06.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:46:06.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-05-29T17:46:06.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:46:06.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:46:06.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:46:06.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-05-29T17:46:08.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-05-29T17:46:08.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:46:08.449 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:46:08.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:46:08.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:46:08.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:46:08.469 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:46:08.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:46:08.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:46:08.469 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:46:08.469 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:46:08.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:46:08.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:46:08.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:46:08.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:46:08.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:46:08.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:46:08.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:46:08.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:46:08.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:46:08.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:46:08.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:46:08.718 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:46:08.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:46:04
2026-05-29T17:46:08.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72467, datetime.datetime(2026, 5, 29, 17, 46, 4), datetime.datetime(2026, 5, 29, 17, 46, 4), 'salt', 10.63, 69.85, None, 15.74, 55.57, 5.26, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:46:08.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:46:08.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:46:08.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:46:04, diff=4.783524s, valid=True
2026-05-29T17:46:08.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:46:08.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:46:08.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:46:12, diff=-3.213572s, valid=True
2026-05-29T17:46:08.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:46:08.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:46:08.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:46:00, diff=8.79319s, valid=True
2026-05-29T17:46:08.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:46:08.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:46:08.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:46:08.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:46:08.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:46:08.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:46:08.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:46:12, diff=-3.203694s, valid=True
2026-05-29T17:46:08.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:46:08.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:46:08.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:46:08.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002210.796987s, valid=True
2026-05-29T17:46:08.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:46:08.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:46:08.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:46:08.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:46:08.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:46:08.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:46:08.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:46:08.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:46:08.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:46:08.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:46:08.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:46:09.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:46:09.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:46:09.110 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:46:09.385 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:46:09.721 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:46:09.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:46:09.820 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:46:09.820 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:46:09.993 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:46:09.993 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:46:40.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:46:40.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:46:40.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:46:40.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:46:40.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:46:40.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:46:40.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-05-29T17:46:40.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:46:40.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-05-29T17:46:40.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:46:40.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:46:40.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:46:40.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T17:46:42.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-05-29T17:46:42.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:46:42.806 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:46:42.806 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:46:42.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:46:42.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:46:42.828 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:46:42.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:46:42.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:46:42.828 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:46:42.828 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:46:42.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:46:42.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:46:42.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:46:42.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:46:42.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:46:43.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:46:43.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:46:43.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:46:43.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:46:43.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:46:43.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:46:43.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:46:43.142 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:46:34
2026-05-29T17:46:43.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72468, datetime.datetime(2026, 5, 29, 17, 46, 34), datetime.datetime(2026, 5, 29, 17, 46, 34), 'salt', 10.53, 70.94, None, 13.27, 48.02, 5.04, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:46:43.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:46:43.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:46:43.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:46:34, diff=9.150575s, valid=True
2026-05-29T17:46:43.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:46:43.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:46:43.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:47:12, diff=-28.846487s, valid=True
2026-05-29T17:46:43.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:46:43.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:46:43.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:46:30, diff=13.160308s, valid=True
2026-05-29T17:46:43.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:46:43.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:46:43.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:46:43.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:46:43.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:46:43.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:46:43.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:47:12, diff=-28.836599s, valid=True
2026-05-29T17:46:43.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:46:43.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:46:43.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:46:43.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002245.164077s, valid=True
2026-05-29T17:46:43.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:46:43.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:46:43.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:46:43.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:46:43.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:46:43.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:46:43.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:46:43.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:46:43.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:46:43.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:46:43.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:46:43.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:46:43.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:46:43.501 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:46:43.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:46:44.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:46:44.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:46:44.149 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:46:44.149 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:46:44.341 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:46:44.341 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:47:14.358 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:47:14.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:47:14.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:47:14.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:47:14.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:47:14.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:47:14.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-05-29T17:47:14.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:47:14.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-05-29T17:47:14.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:47:14.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:47:14.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:47:14.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-05-29T17:47:17.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-05-29T17:47:17.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:47:17.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:47:17.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:47:17.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:47:17.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:47:17.461 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:47:17.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:47:17.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:47:17.462 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:47:17.462 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:47:17.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:47:17.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:47:17.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:47:17.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:47:17.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:47:17.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:47:17.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:47:17.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:47:17.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:47:17.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:47:17.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:47:17.771 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:47:17.837 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:47:04
2026-05-29T17:47:17.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72469, datetime.datetime(2026, 5, 29, 17, 47, 4), datetime.datetime(2026, 5, 29, 17, 47, 4), 'salt', 10.4, 71.54, None, 13.59, 46.59, 4.91, 831.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:47:17.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:47:17.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:47:17.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:47:04, diff=13.84359s, valid=True
2026-05-29T17:47:17.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:47:17.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:47:17.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:47:12, diff=5.846479s, valid=True
2026-05-29T17:47:17.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:47:17.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:47:17.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:47:00, diff=17.853185s, valid=True
2026-05-29T17:47:17.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:47:17.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:47:17.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:47:17.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:47:17.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:47:17.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:47:17.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:47:12, diff=5.856225s, valid=True
2026-05-29T17:47:17.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:47:17.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:47:17.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:47:17.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002279.856895s, valid=True
2026-05-29T17:47:17.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:47:17.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:47:17.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:47:17.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:47:17.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:47:17.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:47:17.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:47:17.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:47:17.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:47:17.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:47:18.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:47:18.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:47:18.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:47:18.259 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:47:18.463 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:47:18.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:47:18.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:47:18.920 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:47:18.920 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:47:19.095 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:47:19.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:47:49.121 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:47:49.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:47:49.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:47:49.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:47:49.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:47:49.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:47:49.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-05-29T17:47:49.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:47:49.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-05-29T17:47:49.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:47:49.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:47:49.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:47:49.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-05-29T17:47:51.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-05-29T17:47:51.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:47:51.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:47:51.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:47:51.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:47:51.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:47:51.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:47:51.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:47:51.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:47:51.921 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:47:51.921 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:47:51.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:47:52.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:47:52.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:47:52.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:47:52.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:47:52.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:47:52.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:47:52.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:47:52.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:47:52.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:47:52.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:47:52.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:47:52.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:47:35
2026-05-29T17:47:52.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72470, datetime.datetime(2026, 5, 29, 17, 47, 35), datetime.datetime(2026, 5, 29, 17, 47, 34), 'salt', 10.27, 72.6, None, 13.09, 60.02, 4.7, 831.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:47:52.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:47:52.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:47:52.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:47:34, diff=18.259628s, valid=True
2026-05-29T17:47:52.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:47:52.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:47:52.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:48:12, diff=-19.737553s, valid=True
2026-05-29T17:47:52.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:47:52.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:47:52.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:47:31, diff=21.269111s, valid=True
2026-05-29T17:47:52.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:47:52.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:47:52.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:47:52.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:47:52.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:47:52.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:47:52.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:48:12, diff=-19.727882s, valid=True
2026-05-29T17:47:52.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:47:52.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:47:52.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:47:52.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002314.27278s, valid=True
2026-05-29T17:47:52.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:47:52.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:47:52.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:47:52.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:47:52.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:47:52.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:47:52.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:47:52.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:47:52.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:47:52.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:47:52.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:47:52.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:47:52.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:47:52.603 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:47:52.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:47:53.167 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:47:53.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:47:53.271 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:47:53.271 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:47:53.459 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:47:53.460 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:48:23.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:48:23.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:48:23.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:48:23.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:48:23.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:48:23.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:48:23.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:48:23.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:48:23.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-05-29T17:48:23.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:48:23.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:48:23.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:48:23.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-05-29T17:48: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-05-29T17:48:26.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:48:26.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:48:26.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:48:26.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:48:26.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:48:26.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:48:26.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:48:26.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:48:26.316 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:48:26.316 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:48:26.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:48:26.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:48:26.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:48:26.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:48:26.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:48:26.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:48:26.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:48:26.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:48:26.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:48:26.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:48:26.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:48:26.570 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:48:26.627 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:48:05
2026-05-29T17:48:26.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72471, datetime.datetime(2026, 5, 29, 17, 48, 5), datetime.datetime(2026, 5, 29, 17, 48, 4), 'salt', 10.27, 73.03, None, 12.39, 42.74, 4.61, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:48:26.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:48:26.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:48:26.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:48:04, diff=22.633996s, valid=True
2026-05-29T17:48:26.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:48:26.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:48:26.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:48:12, diff=14.636925s, valid=True
2026-05-29T17:48:26.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:48:26.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:48:26.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:48:02, diff=24.643627s, valid=True
2026-05-29T17:48:26.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:48:26.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:48:26.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:48:26.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:48:26.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:48:26.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:48:26.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:48:12, diff=14.646693s, valid=True
2026-05-29T17:48:26.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:48:26.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:48:26.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:48:26.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002348.647347s, valid=True
2026-05-29T17:48:26.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:48:26.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:48:26.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:48:26.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:48:26.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:48:26.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:48:26.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:48:26.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:48:26.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:48:26.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:48:26.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:48:26.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:48:26.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:48:27.023 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:48:27.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:48:27.585 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:48:27.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:48:27.683 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:48:27.683 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:48:27.872 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:48:27.872 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:48:57.885 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:48:57.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:48:57.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:48:58.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:48:58.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:48:58.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:48:58.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-05-29T17:48:58.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:48:58.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-05-29T17:48:58.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:48:58.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:48:58.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:48:58.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-05-29T17:49:01.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-05-29T17:49:01.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:49:01.727 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:49:01.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:49:01.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:49:01.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:49:01.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:49:01.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:49:01.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:49:01.749 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:49:01.749 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:49:01.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:49:01.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:49:01.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:49:01.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:49:01.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:49:01.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:49:01.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:49:01.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:49:01.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:49:01.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:49:01.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:49:01.999 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:49:02.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:48:35
2026-05-29T17:49:02.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72472, datetime.datetime(2026, 5, 29, 17, 48, 35), datetime.datetime(2026, 5, 29, 17, 48, 35), 'salt', 10.1, 73.59, None, 14.15, 47.52, 4.49, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:49:02.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:49:02.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:49:02.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:48:35, diff=27.063872s, valid=True
2026-05-29T17:49:02.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:49:02.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:49:02.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:49:12, diff=-9.933278s, valid=True
2026-05-29T17:49:02.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:49:02.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:49:02.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:48:33, diff=29.073384s, valid=True
2026-05-29T17:49:02.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:49:02.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:49:02.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:49:02.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:49:02.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:49:02.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:49:02.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:49:12, diff=-9.923562s, valid=True
2026-05-29T17:49:02.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:49:02.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:49:02.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:49:02.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002384.077126s, valid=True
2026-05-29T17:49:02.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:49:02.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:49:02.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:49:02.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:49:02.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:49:02.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:49:02.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:49:02.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:49:02.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:49:02.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:49:02.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:49:02.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:49:02.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:49:02.394 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:49:02.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:49:02.946 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:49:03.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:49:03.044 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:49:03.044 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:49:04.946 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:49:04.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:49:34.975 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:49:34.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:49:34.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:49:35.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:49:35.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:49:35.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:49:35.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-05-29T17:49:35.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:49:35.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-05-29T17:49:35.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:49:35.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:49:35.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:49:35.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-05-29T17:49:38.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-05-29T17:49:38.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:49:38.762 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:49:38.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:49:38.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:49:38.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:49:38.782 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:49:38.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:49:38.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:49:38.782 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:49:38.782 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:49:38.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:49:38.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:49:38.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:49:39.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:49:39.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:49:39.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:49:39.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:49:39.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:49:39.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:49:39.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:49:39.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:49:39.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:49:39.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:49:35
2026-05-29T17:49:39.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72474, datetime.datetime(2026, 5, 29, 17, 49, 35), datetime.datetime(2026, 5, 29, 17, 49, 35), 'salt', 10.07, 71.34, None, 16.51, 41.4, 4.94, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:49:39.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:49:39.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:49:39.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:49:35, diff=4.172192s, valid=True
2026-05-29T17:49:39.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:49:39.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:49:39.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:50:12, diff=-32.824957s, valid=True
2026-05-29T17:49:39.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:49:39.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:49:39.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:49:31, diff=8.181669s, valid=True
2026-05-29T17:49:39.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:49:39.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:49:39.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:49:39.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:49:39.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:49:39.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:49:39.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:50:12, diff=-32.815257s, valid=True
2026-05-29T17:49:39.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:49:39.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:49:39.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:49:39.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002421.185398s, valid=True
2026-05-29T17:49:39.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:49:39.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:49:39.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:49:39.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:49:39.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:49:39.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:49:39.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:49:39.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:49:39.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:49:39.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:49:39.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:49:39.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:49:39.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:49:39.501 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:49:39.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:49:40.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:49:40.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:49:40.183 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:49:40.183 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:49:40.377 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:49:40.377 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:50:10.398 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:50:10.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:50:10.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:50:10.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:50:10.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:50:10.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:50: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-05-29T17:50:10.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:50:10.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-05-29T17:50:10.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:50:10.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:50:10.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:50:10.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-05-29T17:50:14.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-05-29T17:50:14.615 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:50:14.615 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:50:14.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:50:14.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:50:14.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:50:14.637 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:50:14.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:50:14.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:50:14.638 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:50:14.638 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:50:14.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:50:14.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:50:14.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:50:14.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:50:14.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:50:14.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:50:14.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:50:14.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:50:14.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:50:14.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:50:14.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:50:14.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:50:15.009 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:50:06
2026-05-29T17:50:15.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72475, datetime.datetime(2026, 5, 29, 17, 50, 6), datetime.datetime(2026, 5, 29, 17, 50, 5), 'salt', 10.27, 70.38, None, 15.88, 43.19, 5.14, 831.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:50:15.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:50:15.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:50:15.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:50:05, diff=10.015706s, valid=True
2026-05-29T17:50:15.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:50:15.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:50:15.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:50:12, diff=3.018524s, valid=True
2026-05-29T17:50:15.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:50:15.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:50:15.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:50:02, diff=13.025283s, valid=True
2026-05-29T17:50:15.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:50:15.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:50:15.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:50:15.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:50:15.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:50:15.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:50:15.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:50:12, diff=3.028301s, valid=True
2026-05-29T17:50:15.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:50:15.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:50:15.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:50:15.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002457.028969s, valid=True
2026-05-29T17:50:15.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:50:15.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:50:15.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:50:15.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:50:15.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:50:15.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:50:15.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:50:15.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:50:15.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:50:15.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:50:15.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:50:15.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:50:15.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:50:15.349 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:50:15.565 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:50:15.917 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:50:16.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:50:16.018 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:50:16.018 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:50:16.102 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:50:16.102 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:50:46.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:50:46.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:50:46.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:50:46.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:50:46.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:50:46.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:50:46.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-05-29T17:50:46.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:50:46.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-05-29T17:50:46.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:50:46.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:50:46.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:50:46.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-05-29T17:50:48.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-05-29T17:50:48.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:50:48.980 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:50:48.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:50:48.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:50:48.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:50:48.998 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:50:48.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:50:48.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:50:48.999 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:50:48.999 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:50:49.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:50:49.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:50:49.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:50:49.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:50:49.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:50:49.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:50:49.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:50:49.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:50:49.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:50:49.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:50:49.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:50:49.254 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:50:49.313 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:50:36
2026-05-29T17:50:49.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72476, datetime.datetime(2026, 5, 29, 17, 50, 36), datetime.datetime(2026, 5, 29, 17, 50, 35), 'salt', 10.47, 69.12, None, 14.43, 57.44, 5.41, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:50:49.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:50:49.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:50:49.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:50:35, diff=14.319953s, valid=True
2026-05-29T17:50:49.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:50:49.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:50:49.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:51:12, diff=-22.677218s, valid=True
2026-05-29T17:50:49.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:50:49.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:50:49.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:50:32, diff=17.329402s, valid=True
2026-05-29T17:50:49.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:50:49.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:50:49.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:50:49.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:50:49.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:50:49.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:50:49.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:51:12, diff=-22.667574s, valid=True
2026-05-29T17:50:49.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:50:49.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:50:49.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:50:49.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002491.333095s, valid=True
2026-05-29T17:50:49.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:50:49.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:50:49.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:50:49.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:50:49.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:50:49.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:50:49.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:50:49.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:50:49.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:50:49.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:50:49.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:50:49.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:50:49.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:50:49.654 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:50:49.875 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:50:50.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:50:50.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:50:50.348 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:50:50.348 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:50:50.547 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:50:50.547 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:51:20.577 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:51:20.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:51:20.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:51:21.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:51:21.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:51:21.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:51:21.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:51:21.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:51:21.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-05-29T17:51:21.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:51:21.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:51:21.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:51:21.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-05-29T17:51:23.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-05-29T17:51:23.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:51:23.605 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:51:23.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:51:23.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:51:23.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:51:23.625 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:51:23.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:51:23.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:51:23.625 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:51:23.626 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:51:23.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:51:23.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:51:23.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:51:23.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:51:23.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:51:23.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:51:23.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:51:23.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:51:23.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:51:23.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:51:23.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:51:23.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:51:23.960 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:51:06
2026-05-29T17:51:23.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72477, datetime.datetime(2026, 5, 29, 17, 51, 6), datetime.datetime(2026, 5, 29, 17, 51, 6), 'salt', 10.5, 69.15, None, 14.82, 52.5, 5.4, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:51:23.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:51:23.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:51:23.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:51:06, diff=17.96677s, valid=True
2026-05-29T17:51:23.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:51:23.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:51:23.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:51:12, diff=11.969591s, valid=True
2026-05-29T17:51:23.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:51:23.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:51:23.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:51:02, diff=21.976233s, valid=True
2026-05-29T17:51:23.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:51:23.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:51:23.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:51:23.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:51:23.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:51:23.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:51:23.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:51:12, diff=11.979285s, valid=True
2026-05-29T17:51:23.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:51:23.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:51:23.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:51:23.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002525.979951s, valid=True
2026-05-29T17:51:23.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:51:23.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:51:23.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:51:23.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:51:23.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:51:24.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:51:24.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:51:24.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:51:24.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:51:24.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:51:24.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:51:24.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:51:24.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:51:24.305 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:51:24.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:51:24.977 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:51:25.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:51:25.086 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:51:25.086 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:51:25.314 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:51:25.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:51:55.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:51:55.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:51:55.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:51:55.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:51:55.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:51:55.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:51:55.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:51:55.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:51:55.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-05-29T17:51:55.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:51:55.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:51:55.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:51:55.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-05-29T17:51:58.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-05-29T17:51:58.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:51:58.545 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:51:58.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:51:58.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:51:58.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:51:58.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:51:58.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:51:58.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:51:58.566 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:51:58.566 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:51:58.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:51:58.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:51:58.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:51:58.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:51:58.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:51:58.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:51:58.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:51:58.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:51:58.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:51:58.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:51:58.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:51:58.819 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:51:58.882 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:51:36
2026-05-29T17:51:58.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72478, datetime.datetime(2026, 5, 29, 17, 51, 36), datetime.datetime(2026, 5, 29, 17, 51, 36), 'salt', 10.47, 68.72, None, 14.47, 44.03, 5.49, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:51:58.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:51:58.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:51:58.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:51:36, diff=22.888246s, valid=True
2026-05-29T17:51:58.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:51:58.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:51:58.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:52:12, diff=-13.108879s, valid=True
2026-05-29T17:51:58.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:51:58.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:51:58.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:51:33, diff=25.897829s, valid=True
2026-05-29T17:51:58.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:51:58.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:51:58.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:51:58.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:51:58.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:51:58.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:51:58.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:52:12, diff=-13.0991s, valid=True
2026-05-29T17:51:58.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:51:58.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:51:58.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:51:58.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002560.901564s, valid=True
2026-05-29T17:51:58.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:51:58.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:51:58.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:51:58.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:51:58.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:51:58.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:51:58.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:51:58.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:51:58.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:51:59.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:51:59.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:51:59.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:51:59.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:51:59.219 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:51:59.437 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:51:59.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:51:59.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:51:59.897 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:51:59.897 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:52:00.078 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:52:00.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:52:30.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:52:30.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:52:30.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:52:30.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:52:30.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:52:30.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:52:30.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-05-29T17:52:30.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:52:30.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-05-29T17:52:30.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:52:30.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:52:30.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:52:30.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-05-29T17:52:32.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-05-29T17:52:32.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:52:32.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:52:32.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:52:32.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:52:32.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:52:32.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:52:32.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:52:32.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:52:32.928 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:52:32.929 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:52:32.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:52:33.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:52:33.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:52:33.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:52:33.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:52:33.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:52:33.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:52:33.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:52:33.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:52:33.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:52:33.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:52:33.183 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:52:33.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:52:06
2026-05-29T17:52:33.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72479, datetime.datetime(2026, 5, 29, 17, 52, 6), datetime.datetime(2026, 5, 29, 17, 52, 6), 'salt', 10.57, 69.32, None, 14.05, 43.26, 5.37, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:52:33.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:52:33.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:52:33.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:52:06, diff=27.248582s, valid=True
2026-05-29T17:52:33.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:52:33.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:52:33.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:52:12, diff=21.25142s, valid=True
2026-05-29T17:52:33.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:52:33.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:52:33.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:52:03, diff=30.258114s, valid=True
2026-05-29T17:52:33.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:52:33.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:52:33.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:52:33.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:52:33.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:52:33.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:52:33.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:52:12, diff=21.261122s, valid=True
2026-05-29T17:52:33.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:52:33.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:52:33.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:52:33.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002595.26178s, valid=True
2026-05-29T17:52:33.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:52:33.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:52:33.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:52:33.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:52:33.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:52:33.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:52:33.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:52:33.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:52:33.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:52:33.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:52:33.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:52:33.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:52:33.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:52:33.584 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:52:33.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:52:34.249 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:52:34.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:52:34.349 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:52:34.349 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:52:34.593 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:52:34.593 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:53:04.604 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:53:04.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:53:04.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:53:04.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:53:04.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:53:05.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:53:05.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-05-29T17:53:05.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:53:05.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-05-29T17:53:05.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:53:05.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:53:05.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:53:05.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-05-29T17:53:07.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-05-29T17:53:07.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:53:07.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:53:07.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:53:07.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:53:07.435 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:53:07.435 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:53:07.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:53:07.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:53:07.436 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:53:07.436 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:53:07.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:53:07.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:53:07.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:53:07.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:53:07.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:53:07.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:53:07.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:53:07.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:53:07.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:53:07.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:53:07.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:53:07.698 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:53:07.759 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:53:07
2026-05-29T17:53:07.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72481, datetime.datetime(2026, 5, 29, 17, 53, 7), datetime.datetime(2026, 5, 29, 17, 53, 7), 'salt', 10.44, 69.59, None, 14.22, 50.29, 5.32, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:53:07.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:53:07.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:53:07.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:53:07, diff=0.766038s, valid=True
2026-05-29T17:53:07.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:53:07.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:53:07.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:53:12, diff=-4.230765s, valid=True
2026-05-29T17:53:07.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:53:07.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:53:07.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:53:06, diff=1.776792s, valid=True
2026-05-29T17:53:07.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:53:07.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:53:07.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:53:07.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:53:07.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:53:07.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:53:07.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:53:12, diff=-4.219801s, valid=True
2026-05-29T17:53:07.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:53:07.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:53:07.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:53:07.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002629.78095s, valid=True
2026-05-29T17:53:07.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:53:07.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:53:07.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:53:07.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:53:07.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:53:07.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:53:07.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:53:07.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:53:07.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:53:07.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:53:07.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:53:08.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:53:08.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:53:08.099 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:53:08.317 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:53:08.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:53:08.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:53:08.774 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:53:08.774 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:53:08.930 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:53:08.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:53:38.951 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:53:38.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:53:38.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:53:39.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:53:39.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:53:39.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:53:39.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-05-29T17:53:39.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:53:39.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-05-29T17:53:39.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:53:39.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:53:39.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:53:39.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-05-29T17:53:42.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-05-29T17:53:42.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:53:42.716 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:53:42.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:53:42.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:53:42.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:53:42.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:53:42.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:53:42.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:53:42.737 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:53:42.737 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:53:42.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:53:42.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:53:42.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:53:42.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:53:42.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:53:42.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:53:42.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:53:42.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:53:42.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:53:42.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:53:42.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:53:42.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:53:43.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:53:37
2026-05-29T17:53:43.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72482, datetime.datetime(2026, 5, 29, 17, 53, 37), datetime.datetime(2026, 5, 29, 17, 53, 37), 'salt', 10.37, 69.29, None, 14.08, 43.51, 5.37, 831.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:53:43.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:53:43.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:53:43.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:53:37, diff=6.057063s, valid=True
2026-05-29T17:53:43.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:53:43.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:53:43.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:54:12, diff=-28.940148s, valid=True
2026-05-29T17:53:43.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:53:43.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:53:43.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:53:37, diff=6.066419s, valid=True
2026-05-29T17:53:43.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:53:43.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:53:43.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:53:43.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:53:43.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:53:43.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:53:43.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:54:12, diff=-28.930579s, valid=True
2026-05-29T17:53:43.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:53:43.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:53:43.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:53:43.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002665.070102s, valid=True
2026-05-29T17:53:43.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:53:43.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:53:43.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:53:43.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:53:43.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:53:43.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:53:43.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:53:43.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:53:43.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:53:43.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:53:43.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:53:43.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:53:43.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:53:43.470 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:53:43.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:53:44.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:53:44.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:53:44.160 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:53:44.160 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:53:44.414 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:53:44.414 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:54:14.422 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:54:14.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:54:14.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:54:14.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:54:14.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:54:15.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:54:15.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-05-29T17:54:15.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:54:15.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-05-29T17:54:15.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:54:15.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:54:15.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:54:15.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-05-29T17:54:17.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-05-29T17:54:17.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:54:17.835 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:54:17.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:54:17.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:54:17.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:54:17.856 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:54:17.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:54:17.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:54:17.856 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:54:17.856 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:54:17.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:54:17.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:54:17.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:54:18.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:54:18.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:54:18.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:54:18.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:54:18.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:54:18.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:54:18.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:54:18.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:54:18.130 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:54:18.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:54:07
2026-05-29T17:54:18.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72483, datetime.datetime(2026, 5, 29, 17, 54, 7), datetime.datetime(2026, 5, 29, 17, 54, 7), 'salt', 10.37, 69.45, None, 15.63, 50.2, 5.34, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:54:18.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:54:18.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:54:18.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:54:07, diff=11.197261s, valid=True
2026-05-29T17:54:18.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:54:18.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:54:18.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:54:12, diff=6.200732s, valid=True
2026-05-29T17:54:18.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:54:18.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:54:18.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:54:04, diff=14.208722s, valid=True
2026-05-29T17:54:18.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:54:18.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:54:18.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:54:18.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:54:18.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:54:18.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:54:18.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:54:12, diff=6.211814s, valid=True
2026-05-29T17:54:18.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:54:18.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:54:18.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:54:18.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002700.212466s, valid=True
2026-05-29T17:54:18.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:54:18.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:54:18.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:54:18.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:54:18.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:54:18.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:54:18.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:54:18.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:54:18.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:54:18.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:54:18.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:54:18.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:54:18.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:54:18.535 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:54:18.762 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:54:19.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:54:19.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:54:19.226 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:54:19.226 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:54:19.392 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:54:19.392 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:54:49.418 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:54:49.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:54:49.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:54:49.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:54:49.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:54:49.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:54:49.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-05-29T17:54:49.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:54:49.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-05-29T17:54:49.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:54:49.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:54:49.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:54:49.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-05-29T17:54:52.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-05-29T17:54:52.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:54:52.225 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:54:52.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:54:52.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:54:52.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:54:52.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:54:52.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:54:52.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:54:52.245 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:54:52.245 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:54:52.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:54:52.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:54:52.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:54:52.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:54:52.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:54:52.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:54:52.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:54:52.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:54:52.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:54:52.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:54:52.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:54:52.496 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:54:52.554 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:54:38
2026-05-29T17:54:52.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72484, datetime.datetime(2026, 5, 29, 17, 54, 38), datetime.datetime(2026, 5, 29, 17, 54, 37), 'salt', 10.64, 69.89, None, 14.68, 44.78, 5.26, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:54:52.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:54:52.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:54:52.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:54:37, diff=15.561156s, valid=True
2026-05-29T17:54:52.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:54:52.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:54:52.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:55:12, diff=-19.43599s, valid=True
2026-05-29T17:54:52.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:54:52.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:54:52.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:54:34, diff=18.570827s, valid=True
2026-05-29T17:54:52.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:54:52.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:54:52.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:54:52.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:54:52.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:54:52.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:54:52.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:55:12, diff=-19.426155s, valid=True
2026-05-29T17:54:52.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:54:52.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:54:52.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:54:52.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002734.574502s, valid=True
2026-05-29T17:54:52.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:54:52.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:54:52.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:54:52.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:54:52.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:54:52.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:54:52.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:54:52.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:54:52.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:54:52.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:54:52.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:54:52.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:54:52.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:54:52.959 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:54:53.177 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:54:53.528 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:54:53.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:54:53.631 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:54:53.631 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:54:53.809 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:54:53.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:55:23.839 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:55:23.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:55:23.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:55:24.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:55:24.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:55:24.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:55:24.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-05-29T17:55:24.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:55:24.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-05-29T17:55:24.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:55:24.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:55:24.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:55:24.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T17:55:27.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-05-29T17:55:27.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:55:27.295 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:55:27.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:55:27.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:55:27.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:55:27.317 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:55:27.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:55:27.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:55:27.317 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:55:27.318 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:55:27.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:55:27.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:55:27.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:55:27.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:55:27.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:55:27.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:55:27.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:55:27.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:55:27.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:55:27.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:55:27.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:55:27.561 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:55:27.619 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:55:08
2026-05-29T17:55:27.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72485, datetime.datetime(2026, 5, 29, 17, 55, 8), datetime.datetime(2026, 5, 29, 17, 55, 8), 'salt', 10.2, 69.92, None, 14.72, 49.4, 5.23, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:55:27.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:55:27.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:55:27.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:55:08, diff=19.62619s, valid=True
2026-05-29T17:55:27.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:55:27.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:55:27.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:55:12, diff=15.629038s, valid=True
2026-05-29T17:55:27.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:55:27.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:55:27.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:55:05, diff=22.635794s, valid=True
2026-05-29T17:55:27.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:55:27.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:55:27.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:55:27.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:55:27.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:55:27.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:55:27.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:55:12, diff=15.638869s, valid=True
2026-05-29T17:55:27.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:55:27.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:55:27.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:55:27.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002769.639539s, valid=True
2026-05-29T17:55:27.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:55:27.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:55:27.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:55:27.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:55:27.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:55:27.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:55:27.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:55:27.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:55:27.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:55:27.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:55:27.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:55:27.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:55:27.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:55:27.957 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:55:28.174 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:55:28.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:55:28.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:55:28.628 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:55:28.628 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:55:28.697 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:55:28.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:55:58.723 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:55:58.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:55:58.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:55:58.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:55:58.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:55:59.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:55:59.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-05-29T17:55:59.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:55:59.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-05-29T17:55:59.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:55:59.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:55:59.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:55:59.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T17:56:01.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-05-29T17:56:01.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:56:01.604 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:56:01.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:56:01.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:56:01.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:56:01.625 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:56:01.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:56:01.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:56:01.625 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:56:01.625 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:56:01.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:56:01.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:56:01.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:56:01.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:56:01.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:56:01.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:56:01.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:56:01.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:56:01.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:56:01.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:56:01.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:56:01.882 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:56:01.943 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:55:38
2026-05-29T17:56:01.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72486, datetime.datetime(2026, 5, 29, 17, 55, 38), datetime.datetime(2026, 5, 29, 17, 55, 38), 'salt', 10.3, 70.15, None, 13.34, 46.94, 5.19, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:56:01.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:56:01.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:56:01.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:55:38, diff=23.949309s, valid=True
2026-05-29T17:56:01.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:56:01.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:56:01.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:56:12, diff=-10.04784s, valid=True
2026-05-29T17:56:01.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:56:01.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:56:01.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:55:35, diff=26.958644s, valid=True
2026-05-29T17:56:01.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:56:01.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:56:01.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:56:01.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:56:01.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:56:01.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:56:01.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:56:12, diff=-10.038316s, valid=True
2026-05-29T17:56:01.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:56:01.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:56:01.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:56:01.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002803.962342s, valid=True
2026-05-29T17:56:01.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:56:01.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:56:01.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:56:01.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:56:01.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:56:02.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:56:02.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:56:02.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:56:02.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:56:02.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:56:02.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:56:02.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:56:02.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:56:02.275 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:56:02.490 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:56:02.838 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:56:02.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:56:02.938 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:56:02.939 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:56:03.850 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:56:03.851 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:56:33.881 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:56:33.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:56:33.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:56:34.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:56:34.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:56:34.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:56:34.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T17:56:34.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:56:34.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T17:56:34.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:56:34.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:56:34.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:56:34.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-05-29T17:56:37.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-05-29T17:56:37.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:56:37.365 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:56:37.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:56:37.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:56:37.386 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:56:37.386 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:56:37.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:56:37.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:56:37.386 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:56:37.386 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:56:37.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:56:37.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T17:56:37.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:56:37.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T17:56:37.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:56:37.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:56:37.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:56:37.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:56:37.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:56:37.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:56:37.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:56:37.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:56:37.699 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:56:08
2026-05-29T17:56:37.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72487, datetime.datetime(2026, 5, 29, 17, 56, 8), datetime.datetime(2026, 5, 29, 17, 56, 8), 'salt', 10.27, 70.05, None, 14.93, 49.71, 5.21, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:56:37.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:56:37.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T17:56:37.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:56:08, diff=29.705329s, valid=True
2026-05-29T17:56:37.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:56:37.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:56:37.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:56:12, diff=25.708167s, valid=True
2026-05-29T17:56:37.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:56:37.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T17:56:37.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:56:05, diff=32.714982s, valid=True
2026-05-29T17:56:37.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:56:37.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:56:37.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:56:37.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:56:37.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:56:37.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:56:37.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:56:12, diff=25.718029s, valid=True
2026-05-29T17:56:37.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:56:37.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:56:37.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:56:37.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002839.718706s, valid=True
2026-05-29T17:56:37.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:56:37.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:56:37.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:56:37.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:56:37.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:56:37.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:56:37.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:56:37.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:56:37.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:56:37.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:56:37.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:56:37.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:56:37.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:56:38.033 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:56:38.249 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:56:38.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:56:38.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:56:38.759 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:56:38.759 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:56:38.914 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:56:38.914 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:57:08.932 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:57:08.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:57:08.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:57:09.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:57:09.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:57:09.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:57:09.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-05-29T17:57:09.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:57:09.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-05-29T17:57:09.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:57:09.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:57:09.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:57:09.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-05-29T17:57:11.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-05-29T17:57:11.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:57:11.949 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:57:11.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:57:11.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:57:11.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:57:11.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:57:11.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:57:11.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:57:11.970 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:57:11.970 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:57:11.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:57:12.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:57:12.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:57:12.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:57:12.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:57:12.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:57:12.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:57:12.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:57:12.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:57:12.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:57:12.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:57:12.222 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:57:12.281 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:57:09
2026-05-29T17:57:12.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72489, datetime.datetime(2026, 5, 29, 17, 57, 9), datetime.datetime(2026, 5, 29, 17, 57, 8), 'salt', 10.34, 69.09, None, 16.16, 52.97, 5.41, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:57:12.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:57:12.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:57:12.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:57:08, diff=4.287314s, valid=True
2026-05-29T17:57:12.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:57:12.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:57:12.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:57:12, diff=0.290083s, valid=True
2026-05-29T17:57:12.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:57:12.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:57:12.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:57:07, diff=5.296648s, valid=True
2026-05-29T17:57:12.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:57:12.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:57:12.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:57:12.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:57:12.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:57:12.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:57:12.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:57:12, diff=0.299597s, valid=True
2026-05-29T17:57:12.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:57:12.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:57:12.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:57:12.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002874.30026s, valid=True
2026-05-29T17:57:12.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:57:12.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:57:12.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:57:12.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:57:12.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:57:12.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:57:12.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:57:12.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:57:12.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:57:12.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:57:12.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:57:12.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:57:12.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:57:12.614 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:57:12.827 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:57:13.174 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:57:13.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:57:13.275 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:57:13.275 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:57:13.361 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:57:13.361 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:57:43.391 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:57:43.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17: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-05-29T17:57:43.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:57:43.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:57:43.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:57:43.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-05-29T17:57:43.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:57:43.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-05-29T17:57:43.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:57:43.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:57:43.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:57:43.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-05-29T17:57:46.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-05-29T17:57:46.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:57:46.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:57:46.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:57:46.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:57:46.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:57:46.070 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:57:46.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:57:46.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:57:46.070 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:57:46.071 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:57:46.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:57:46.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:57:46.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:57:46.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:57:46.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:57:46.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:57:46.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:57:46.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:57:46.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:57:46.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:57:46.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:57:46.337 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:57:46.400 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:57:39
2026-05-29T17:57:46.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72490, datetime.datetime(2026, 5, 29, 17, 57, 39), datetime.datetime(2026, 5, 29, 17, 57, 39), 'salt', 10.34, 67.83, None, 16.44, 53.06, 5.68, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:57:46.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:57:46.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:57:46.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:57:39, diff=7.40629s, valid=True
2026-05-29T17:57:46.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:57:46.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:57:46.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:58:12, diff=-25.590838s, valid=True
2026-05-29T17:57:46.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:57:46.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:57:46.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:57:38, diff=8.415943s, valid=True
2026-05-29T17:57:46.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:57:46.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:57:46.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:57:46.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:57:46.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:57:46.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:57:46.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:58:12, diff=-25.581012s, valid=True
2026-05-29T17:57:46.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:57:46.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:57:46.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:57:46.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002908.419656s, valid=True
2026-05-29T17:57:46.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:57:46.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:57:46.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:57:46.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:57:46.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:57:46.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:57:46.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:57:46.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:57:46.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:57:46.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:57:46.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:57:46.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:57:46.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:57:46.735 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:57:46.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:57:47.373 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:57:47.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:57:47.472 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:57:47.472 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:57:47.625 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:57:47.626 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:58:17.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:58:17.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:58:17.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:58:17.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:58:17.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:58:17.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:58:17.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-05-29T17:58:17.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:58:17.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-05-29T17:58:17.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:58:17.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:58:17.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:58:17.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-05-29T17:58:20.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-05-29T17:58:20.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:58:20.757 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:58:20.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:58:20.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:58:20.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:58:20.778 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:58:20.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:58:20.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:58:20.779 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:58:20.779 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:58:20.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:58:20.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:58:20.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:58:20.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:58:20.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:58:20.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:58:20.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:58:21.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:58:21.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:58:21.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:58:21.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:58:21.034 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:58:21.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:58:09
2026-05-29T17:58:21.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72491, datetime.datetime(2026, 5, 29, 17, 58, 9), datetime.datetime(2026, 5, 29, 17, 58, 9), 'salt', 10.6, 68.73, None, 14.05, 59.44, 5.49, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:58:21.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:58:21.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:58:21.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:58:09, diff=12.111617s, valid=True
2026-05-29T17:58:21.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:58:21.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:58:21.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:58:12, diff=9.114506s, valid=True
2026-05-29T17:58:21.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:58:21.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:58:21.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:58:06, diff=15.121316s, valid=True
2026-05-29T17:58:21.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:58:21.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:58:21.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:58:21.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:58:21.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:58:21.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:58:21.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:58:12, diff=9.124405s, valid=True
2026-05-29T17:58:21.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:58:21.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:58:21.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:58:21.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002943.125076s, valid=True
2026-05-29T17:58:21.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:58:21.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:58:21.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:58:21.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:58:21.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:58:21.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:58:21.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:58:21.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:58:21.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:58:21.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:58:21.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:58:21.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:58:21.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:58:21.441 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:58:21.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:58:22.011 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:58:22.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:58:22.115 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:58:22.115 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:58:22.266 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:58:22.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:58:52.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:58:52.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:58:52.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:58:52.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:58:52.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:58:52.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:58:52.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-05-29T17:58:52.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:58:52.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-05-29T17:58:52.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:58:52.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:58:52.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:58:52.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-05-29T17:58:55.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-05-29T17:58:55.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:58:55.380 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:58:55.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:58:55.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:58:55.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:58:55.401 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:58:55.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:58:55.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:58:55.402 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:58:55.402 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:58:55.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:58:55.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:58:55.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:58:55.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:58:55.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:58:55.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:58:55.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:58:55.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T17:58:55.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:58:55.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:58:55.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:58:55.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:58:55.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:58:40
2026-05-29T17:58:55.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72492, datetime.datetime(2026, 5, 29, 17, 58, 40), datetime.datetime(2026, 5, 29, 17, 58, 39), 'salt', 10.44, 69.56, None, 14.96, 48.09, 5.32, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:58:55.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:58:55.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:58:55.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:58:39, diff=16.721229s, valid=True
2026-05-29T17:58:55.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:58:55.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:58:55.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:59:12, diff=-16.275915s, valid=True
2026-05-29T17:58:55.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:58:55.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:58:55.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:58:37, diff=18.730821s, valid=True
2026-05-29T17:58:55.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:58:55.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:58:55.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:58:55.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:58:55.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:58:55.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T17:58:55.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:59:12, diff=-16.266156s, valid=True
2026-05-29T17:58:55.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:58:55.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:58:55.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:58:55.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1002977.734504s, valid=True
2026-05-29T17:58:55.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:58:55.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:58:55.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:58:55.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:58:55.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:58:55.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:58:55.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:58:55.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:58:55.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:58:55.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:58:55.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:58:55.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:58:56.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:58:56.049 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:58:56.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:58:56.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:58:56.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:58:56.786 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:58:56.786 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:58:56.938 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:58:56.938 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T17:59:26.960 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T17:59:26.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T17:59:26.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T17:59:27.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T17:59:27.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T17:59:27.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T17:59:27.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-05-29T17:59:27.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T17:59:27.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-05-29T17:59:27.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T17:59:27.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T17:59:27.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T17:59:27.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-05-29T17:59:30.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-05-29T17:59:30.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T17:59:30.460 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T17:59:30.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T17:59:30.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T17:59:30.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T17:59:30.481 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T17:59:30.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T17:59:30.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T17:59:30.481 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T17:59:30.481 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T17:59:30.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T17:59:30.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T17:59:30.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T17:59:30.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T17:59:30.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:59:30.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:59:30.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T17:59:30.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T17:59:30.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T17:59:30.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T17:59:30.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T17:59:30.731 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T17:59:30.789 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:59:10
2026-05-29T17:59:30.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72493, datetime.datetime(2026, 5, 29, 17, 59, 10), datetime.datetime(2026, 5, 29, 17, 59, 9), 'salt', 10.37, 70.22, None, 14.12, 55.69, 5.18, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T17:59:30.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T17:59:30.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T17:59:30.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:59:09, diff=21.795885s, valid=True
2026-05-29T17:59:30.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T17:59:30.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:59:30.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:59:12, diff=18.798721s, valid=True
2026-05-29T17:59:30.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T17:59:30.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T17:59:30.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:59:07, diff=23.805577s, valid=True
2026-05-29T17:59:30.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T17:59:30.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:59:30.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T17:59:30.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T17:59:30.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T17:59:30.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T17:59:30.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:59:12, diff=18.808608s, valid=True
2026-05-29T17:59:30.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T17:59:30.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T17:59:30.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T17:59:30.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003012.809278s, valid=True
2026-05-29T17:59:30.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T17:59:30.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T17:59:30.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T17:59:30.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T17:59:30.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T17:59:30.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T17:59:30.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T17:59:30.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T17:59:30.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T17:59:30.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T17:59:31.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T17:59:31.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T17:59:31.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T17:59:31.127 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T17:59:31.345 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:59:31.717 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T17:59:31.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T17:59:31.819 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T17:59:31.820 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T17:59:32.066 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T17:59:32.066 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:00:02.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:00:02.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:00:02.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:00:02.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:00:02.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:00:02.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:00:02.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-05-29T18:00:02.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:00:02.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-05-29T18:00:02.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:00:02.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:00:02.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:00:02.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-05-29T18:00:04.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-05-29T18:00:04.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:00:04.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:00:04.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:00:04.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:00:04.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:00:04.855 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:00:04.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:00:04.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:00:04.855 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:00:04.855 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:00:04.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:00:04.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:00:04.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:00:05.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:00:05.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:00:05.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T18:00:05.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:00:05.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T18:00:05.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:00:05.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:00:05.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:00:05.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:00:05.163 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 17:59:40
2026-05-29T18:00:05.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72494, datetime.datetime(2026, 5, 29, 17, 59, 40), datetime.datetime(2026, 5, 29, 17, 59, 40), 'salt', 10.27, 69.79, None, 14.47, 46.19, 5.26, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:00:05.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:00:05.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:00:05.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:59:40, diff=25.169818s, valid=True
2026-05-29T18:00:05.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:00:05.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T18:00:05.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:00:12, diff=-6.827329s, valid=True
2026-05-29T18:00:05.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:00:05.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:00:05.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 17:59:37, diff=28.17936s, valid=True
2026-05-29T18:00:05.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:00:05.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:00:05.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:00:05.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:00:05.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:00:05.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T18:00:05.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:00:12, diff=-6.817634s, valid=True
2026-05-29T18:00:05.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:00:05.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:00:05.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:00:05.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003047.183039s, valid=True
2026-05-29T18:00:05.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:00:05.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:00:05.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:00:05.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:00:05.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:00:05.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:00:05.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:00:05.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:00:05.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:00:05.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:00:05.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:00:05.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:00:05.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:00:05.569 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:00:05.785 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:00:06.180 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:00:06.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:00:06.282 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:00:06.282 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:00:06.464 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:00:06.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:00:36.486 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:00:36.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:00:36.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:00:36.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:00:36.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:00:36.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:00:36.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T18:00:36.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:00:36.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-05-29T18:00:36.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:00:36.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:00:36.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:00:36.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-05-29T18:00:39.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-05-29T18:00:39.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:00:39.211 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:00:39.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:00:39.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:00:39.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:00:39.230 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:00:39.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:00:39.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:00:39.231 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:00:39.231 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:00:39.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:00:39.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:00:39.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:00:39.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:00:39.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:00:39.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:00:39.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:00:39.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:00:39.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:00:39.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:00:39.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:00:39.477 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:00:39.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:00:10
2026-05-29T18:00:39.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72495, datetime.datetime(2026, 5, 29, 18, 0, 10), datetime.datetime(2026, 5, 29, 18, 0, 10), 'salt', 10.27, 69.39, None, 16.2, 47.6, 5.34, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:00:39.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:00:39.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:00:39.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:00:10, diff=29.541961s, valid=True
2026-05-29T18:00:39.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:00:39.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:00:39.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:00:12, diff=27.544785s, valid=True
2026-05-29T18:00:39.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:00:39.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:00:39.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:00:07, diff=32.551338s, valid=True
2026-05-29T18:00:39.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:00:39.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:00:39.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:00:39.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:00:39.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:00:39.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:00:39.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:00:12, diff=27.554444s, valid=True
2026-05-29T18:00:39.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:00:39.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:00:39.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:00:39.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003081.555123s, valid=True
2026-05-29T18:00:39.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:00:39.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:00:39.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:00:39.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:00:39.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:00:39.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:00:39.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:00:39.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:00:39.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:00:39.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:00:39.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:00:39.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:00:39.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:00:39.879 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:00:40.117 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:00:40.475 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:00:40.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:00:40.576 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:00:40.576 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:00:40.844 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:00:40.844 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:01:10.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:01:10.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:01:10.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:01:11.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:01:11.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:01:11.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:01:11.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-05-29T18:01:11.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:01:11.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-05-29T18:01:11.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:01:11.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:01:11.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:01:11.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-05-29T18:01:14.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T18:01:14.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:01:14.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:01:14.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:01:14.126 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:01:14.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:01:14.138 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:01:14.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:01:14.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:01:14.139 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:01:14.139 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:01:14.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:01:14.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:01:14.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:01:14.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:01:14.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:01:14.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:01:14.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:01:14.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:01:14.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:01:14.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:01:14.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:01:14.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:01:14.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:01:11
2026-05-29T18:01:14.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72497, datetime.datetime(2026, 5, 29, 18, 1, 11), datetime.datetime(2026, 5, 29, 18, 1, 10), 'salt', 10.41, 66.24, None, 17.4, 39.86, 6.02, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:01:14.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:01:14.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:01:14.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:01:10, diff=4.451483s, valid=True
2026-05-29T18:01:14.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:01:14.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:01:14.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:01:12, diff=2.454331s, valid=True
2026-05-29T18:01:14.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:01:14.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:01:14.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:01:08, diff=6.460967s, valid=True
2026-05-29T18:01:14.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:01:14.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:01:14.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:01:14.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:01:14.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:01:14.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:01:14.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:01:12, diff=2.463988s, valid=True
2026-05-29T18:01:14.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:01:14.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:01:14.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:01:14.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003116.464662s, valid=True
2026-05-29T18:01:14.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:01:14.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:01:14.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:01:14.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:01:14.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:01:14.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:01:14.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:01:14.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:01:14.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:01:14.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:01:14.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:01:14.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:01:14.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:01:14.848 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:01:15.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:01:15.415 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:01:15.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:01:15.517 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:01:15.517 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:01:15.599 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:01:15.599 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:01:45.629 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:01:45.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:01:45.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:01:45.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:01:45.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:01:45.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:01:45.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-05-29T18:01:45.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:01:45.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-05-29T18:01:45.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:01:45.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:01:45.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:01:45.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-05-29T18:01:48.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-05-29T18:01:48.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:01:48.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:01:48.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:01:48.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:01:48.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:01:48.660 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:01:48.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:01:48.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:01:48.660 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:01:48.660 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:01:48.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:01:48.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:01:48.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:01:48.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:01:48.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:01:48.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T18:01:48.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:01:48.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T18:01:48.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:01:48.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:01:48.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:01:48.923 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:01:48.981 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:01:41
2026-05-29T18:01:48.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72498, datetime.datetime(2026, 5, 29, 18, 1, 41), datetime.datetime(2026, 5, 29, 18, 1, 40), 'salt', 10.64, 65.88, None, 15.99, 50.09, 6.11, 831.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:01:48.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:01:48.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:01:48.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:01:40, diff=8.987945s, valid=True
2026-05-29T18:01:48.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:01:48.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T18:01:48.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:02:12, diff=-23.009217s, valid=True
2026-05-29T18:01:48.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:01:48.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:01:48.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:01:39, diff=9.997519s, valid=True
2026-05-29T18:01:48.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:01:48.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:01:48.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:01:48.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:01:48.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:01:48.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T18:01:49.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:02:12, diff=-22.999395s, valid=True
2026-05-29T18:01:49.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:01:49.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:01:49.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:01:49.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003151.001284s, valid=True
2026-05-29T18:01:49.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:01:49.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:01:49.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:01:49.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:01:49.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:01:49.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:01:49.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:01:49.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:01:49.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:01:49.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:01:49.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:01:49.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:01:49.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:01:49.318 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:01:49.537 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:01:49.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:01:50.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:01:50.003 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:01:50.003 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:01:50.073 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:01:50.073 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:02:20.103 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:02:20.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:02:20.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:02:20.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:02:20.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:02:20.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:02:20.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T18:02:20.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:02:20.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-05-29T18:02:20.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:02:20.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:02:20.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:02: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-05-29T18:02:23.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-05-29T18:02:23.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:02:23.128 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:02:23.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:02:23.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:02:23.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:02:23.149 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:02:23.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:02:23.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:02:23.149 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:02:23.149 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:02:23.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:02:23.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:02:23.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:02:23.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:02:23.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:02:23.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:02:23.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:02:23.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:02:23.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:02:23.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:02:23.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:02:23.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:02:23.484 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:02:11
2026-05-29T18:02:23.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72499, datetime.datetime(2026, 5, 29, 18, 2, 11), datetime.datetime(2026, 5, 29, 18, 2, 11), 'salt', 10.64, 66.11, None, 16.23, 54.75, 6.06, 831.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:02:23.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:02:23.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:02:23.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:02:11, diff=12.490832s, valid=True
2026-05-29T18:02:23.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:02:23.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:02:23.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:02:12, diff=11.493656s, valid=True
2026-05-29T18:02:23.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:02:23.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:02:23.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:02:10, diff=13.500225s, valid=True
2026-05-29T18:02:23.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:02:23.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:02:23.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:02:23.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:02:23.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:02:23.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:02:23.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:02:12, diff=11.503285s, valid=True
2026-05-29T18:02:23.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:02:23.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:02:23.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:02:23.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003185.503961s, valid=True
2026-05-29T18:02:23.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:02:23.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:02:23.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:02:23.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:02:23.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:02:23.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:02:23.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:02:23.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:02:23.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:02:23.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:02:23.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:02:23.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:02:23.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:02:23.831 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:02:24.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:02:24.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:02:24.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:02:24.502 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:02:24.502 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:02:24.658 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:02:24.658 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:02:54.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:02:54.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:02:54.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:02:54.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:02:54.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:02:55.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:02:55.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-05-29T18:02:55.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:02:55.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-05-29T18:02:55.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:02:55.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:02:55.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:02:55.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-05-29T18:02:57.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-05-29T18:02:57.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:02:57.768 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:02:57.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:02:57.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:02:57.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:02:57.790 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:02:57.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:02:57.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:02:57.790 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:02:57.790 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:02:57.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:02:57.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:02:57.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:02:57.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:02:57.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:02:58.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T18:02:58.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:02:58.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T18:02:58.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:02:58.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:02:58.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:02:58.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:02:58.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:02:41
2026-05-29T18:02:58.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72500, datetime.datetime(2026, 5, 29, 18, 2, 41), datetime.datetime(2026, 5, 29, 18, 2, 41), 'salt', 10.57, 65.88, None, 17.78, 30.5, 6.1, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:02:58.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:02:58.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:02:58.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:02:41, diff=17.108577s, valid=True
2026-05-29T18:02:58.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:02:58.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T18:02:58.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:03:12, diff=-13.888574s, valid=True
2026-05-29T18:02:58.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:02:58.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:02:58.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:02:39, diff=19.11807s, valid=True
2026-05-29T18:02:58.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:02:58.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:02:58.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:02:58.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:02:58.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:02:58.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T18:02:58.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:03:12, diff=-13.878874s, valid=True
2026-05-29T18:02:58.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:02:58.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:02:58.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:02:58.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003220.1218s, valid=True
2026-05-29T18:02:58.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:02:58.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:02:58.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:02:58.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:02:58.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:02:58.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:02:58.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:02:58.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:02:58.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:02:58.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:02:58.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:02:58.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:02:58.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:02:58.443 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:02:58.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:02:59.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:02:59.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:02:59.179 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:02:59.179 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:03:01.278 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:03:01.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:03:31.308 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:03:31.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:03:31.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:03:31.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:03:31.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:03:31.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:03:31.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-05-29T18:03:31.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:03:31.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-05-29T18:03:31.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:03:31.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:03:31.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:03:31.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-05-29T18:03:34.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T18:03:34.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:03:34.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:03:34.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:03:34.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:03:34.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:03:34.381 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:03:34.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:03:34.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:03:34.382 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:03:34.382 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:03:34.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:03:34.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:03:34.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:03:34.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:03:34.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:03:34.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:03:34.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:03:34.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:03:34.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:03:34.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:03:34.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:03:34.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:03:34.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:03:11
2026-05-29T18:03:34.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72501, datetime.datetime(2026, 5, 29, 18, 3, 11), datetime.datetime(2026, 5, 29, 18, 3, 11), 'salt', 10.74, 64.09, None, 17.15, 40.14, 6.51, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:03:34.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:03:34.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:03:34.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:03:11, diff=23.701236s, valid=True
2026-05-29T18:03:34.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:03:34.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:03:34.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:03:12, diff=22.704064s, valid=True
2026-05-29T18:03:34.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:03:34.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:03:34.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:03:09, diff=25.710726s, valid=True
2026-05-29T18:03:34.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:03:34.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:03:34.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:03:34.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:03:34.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:03:34.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:03:34.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:03:12, diff=22.713747s, valid=True
2026-05-29T18:03:34.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:03:34.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:03:34.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:03:34.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003256.714402s, valid=True
2026-05-29T18:03:34.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:03:34.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:03:34.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:03:34.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:03:34.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:03:34.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:03:34.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:03:34.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:03:34.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:03:34.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:03:34.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:03:34.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:03:34.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:03:35.030 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:03:35.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:03:35.597 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:03:35.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:03:35.698 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:03:35.698 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:03:36.101 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:03:36.101 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:04:06.132 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:04:06.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:04:06.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:04:06.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:04:06.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:04:06.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:04:06.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-05-29T18:04:06.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:04:06.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-05-29T18:04:06.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:04:06.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:04:06.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:04:06.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T18:04:09.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-05-29T18:04:09.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:04:09.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:04:09.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:04:09.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:04:09.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:04:09.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:04:09.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:04:09.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:04:09.252 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:04:09.252 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:04:09.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:04:09.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:04:09.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:04:09.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:04:09.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:04:09.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T18:04:09.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:04:09.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T18:04:09.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:04:09.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:04:09.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:04:09.567 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:04:09.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:03:42
2026-05-29T18:04:09.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72502, datetime.datetime(2026, 5, 29, 18, 3, 42), datetime.datetime(2026, 5, 29, 18, 3, 41), 'salt', 10.74, 63.69, None, 15.14, 51.78, 6.59, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:04:09.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:04:09.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:04:09.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:03:41, diff=28.635609s, valid=True
2026-05-29T18:04:09.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:04:09.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T18:04:09.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:04:12, diff=-2.361556s, valid=True
2026-05-29T18:04:09.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:04:09.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:04:09.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:03:39, diff=30.645065s, valid=True
2026-05-29T18:04:09.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:04:09.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:04:09.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:04:09.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:04:09.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:04:09.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T18:04:09.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:04:12, diff=-2.351884s, valid=True
2026-05-29T18:04:09.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:04:09.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:04:09.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:04:09.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003291.648782s, valid=True
2026-05-29T18:04:09.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:04:09.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:04:09.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:04:09.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:04:09.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:04:09.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:04:09.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:04:09.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:04:09.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:04:09.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:04:09.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:04:09.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:04:09.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:04:09.984 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:04:10.211 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:04:10.642 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:04:10.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:04:10.744 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:04:10.744 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:04:10.924 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:04:10.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:04:40.953 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:04:40.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:04:40.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:04:41.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:04:41.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:04:41.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:04:41.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T18:04:41.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:04:41.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-05-29T18:04:41.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:04:41.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:04:41.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:04:41.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-05-29T18:04:43.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-05-29T18:04:44.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:04:44.003 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:04:44.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:04:44.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:04:44.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:04:44.026 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:04:44.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:04:44.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:04:44.027 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:04:44.027 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:04:44.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:04:44.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:04:44.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:04:44.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:04:44.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:04:44.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T18:04:44.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:04:44.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T18:04:44.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:04:44.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:04:44.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:04:44.310 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:04:44.372 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:04:42
2026-05-29T18:04:44.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72504, datetime.datetime(2026, 5, 29, 18, 4, 42), datetime.datetime(2026, 5, 29, 18, 4, 41), 'salt', 10.77, 63.29, None, 13.87, 52.29, 6.68, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:04:44.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:04:44.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:04:44.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:04:41, diff=3.378959s, valid=True
2026-05-29T18:04:44.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:04:44.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T18:04:44.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:05:12, diff=-27.618182s, valid=True
2026-05-29T18:04:44.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:04:44.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:04:44.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:04:40, diff=4.388499s, valid=True
2026-05-29T18:04:44.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:04:44.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:04:44.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:04:44.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:04:44.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:04:44.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T18:04:44.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:05:12, diff=-27.608457s, valid=True
2026-05-29T18:04:44.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:04:44.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:04:44.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:04:44.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003326.392202s, valid=True
2026-05-29T18:04:44.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:04:44.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:04:44.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:04:44.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:04:44.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:04:44.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:04:44.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:04:44.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:04:44.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:04:44.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:04:44.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:04:44.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:04:44.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:04:44.717 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:04:44.940 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:04:45.307 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:04:45.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:04:45.409 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:04:45.409 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:04:45.491 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:04:45.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:05:15.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:05:15.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:05:15.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:05:15.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:05:15.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:05:15.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:05:15.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-05-29T18:05:15.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:05:15.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-05-29T18:05:15.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:05:15.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:05:15.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:05:15.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-05-29T18:05:18.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-05-29T18:05:18.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:05:18.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:05:18.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:05:18.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:05:18.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:05:18.528 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:05:18.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:05:18.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:05:18.529 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:05:18.529 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:05:18.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:05:18.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:05:18.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:05:18.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:05:18.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:05:18.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T18:05:18.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:05:18.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T18:05:18.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:05:18.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:05:18.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:05:18.782 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:05:18.846 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:05:12
2026-05-29T18:05:18.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72505, datetime.datetime(2026, 5, 29, 18, 5, 12), datetime.datetime(2026, 5, 29, 18, 5, 12), 'salt', 10.81, 64.32, None, 11.93, 52.57, 6.46, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:05:18.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:05:18.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:05:18.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:05:12, diff=6.852908s, valid=True
2026-05-29T18:05:18.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:05:18.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T18:05:18.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:05:12, diff=6.855755s, valid=True
2026-05-29T18:05:18.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:05:18.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:05:18.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:05:10, diff=8.862543s, valid=True
2026-05-29T18:05:18.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:05:18.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:05:18.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:05:18.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:05:18.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:05:18.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T18:05:18.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:05:12, diff=6.865616s, valid=True
2026-05-29T18:05:18.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:05:18.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:05:18.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:05:18.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003360.866288s, valid=True
2026-05-29T18:05:18.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:05:18.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:05:18.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:05:18.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:05:18.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:05:18.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:05:18.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:05:18.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:05:18.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:05:18.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:05:19.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:05:19.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:05:19.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:05:19.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:05:19.478 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:05:19.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:05:19.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:05:19.943 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:05:19.943 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:05:20.129 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:05:20.129 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:05:50.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:05:50.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:05:50.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:05:50.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:05:50.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:05:50.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:05:50.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-05-29T18:05:50.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:05:50.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-05-29T18:05:50.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:05:50.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:05:50.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:05:50.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-05-29T18:05:53.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-05-29T18:05:53.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:05:53.757 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:05:53.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:05:53.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:05:53.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:05:53.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:05:53.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:05:53.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:05:53.788 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:05:53.788 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:05:53.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:05:53.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:05:53.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:05:53.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:05:53.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:05:54.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T18:05:54.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:05:54.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T18:05:54.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:05:54.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:05:54.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:05:54.065 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:05:54.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:05:43
2026-05-29T18:05:54.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72506, datetime.datetime(2026, 5, 29, 18, 5, 43), datetime.datetime(2026, 5, 29, 18, 5, 42), 'salt', 10.74, 65.08, None, 10.55, 47.93, 6.28, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:05:54.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:05:54.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:05:54.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:05:42, diff=12.134803s, valid=True
2026-05-29T18:05:54.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:05:54.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T18:05:54.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:06:12, diff=-17.862329s, valid=True
2026-05-29T18:05:54.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:05:54.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:05:54.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:05:40, diff=14.144371s, valid=True
2026-05-29T18:05:54.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:05:54.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:05:54.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:05:54.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:05:54.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:05:54.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T18:05:54.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:06:12, diff=-17.852549s, valid=True
2026-05-29T18:05:54.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:05:54.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:05:54.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:05:54.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003396.148155s, valid=True
2026-05-29T18:05:54.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:05:54.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:05:54.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:05:54.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:05:54.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:05:54.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:05:54.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:05:54.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:05:54.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:05:54.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:05:54.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:05:54.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:05:54.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:05:54.471 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:05:54.715 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:05:55.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:05:55.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:05:55.179 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:05:55.179 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:05:55.353 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:05:55.353 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:06:25.383 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:06:25.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:06:25.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:06:25.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:06:25.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:06:25.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:06:25.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-05-29T18:06:25.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:06: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-05-29T18:06:25.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:06:25.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:06:25.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:06:25.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-05-29T18:06:28.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-05-29T18:06:28.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:06:28.465 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:06:28.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:06:28.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:06:28.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:06:28.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:06:28.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:06:28.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:06:28.488 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:06:28.489 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:06:28.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:06:28.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:06:28.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:06:28.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:06:28.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:06:28.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T18:06:28.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:06:28.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T18:06:28.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:06:28.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:06:28.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:06:28.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:06:28.839 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:06:13
2026-05-29T18:06:28.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72507, datetime.datetime(2026, 5, 29, 18, 6, 13), datetime.datetime(2026, 5, 29, 18, 6, 13), 'salt', 10.54, 66.44, None, 11.82, 57.97, 5.98, 831.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:06:28.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:06:28.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:06:28.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:06:13, diff=15.84527s, valid=True
2026-05-29T18:06:28.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:06:28.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T18:06:28.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:06:12, diff=16.848114s, valid=True
2026-05-29T18:06:28.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:06:28.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:06:28.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:06:12, diff=16.854829s, valid=True
2026-05-29T18:06:28.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:06:28.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:06:28.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:06:28.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:06:28.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:06:28.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T18:06:28.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:06:12, diff=16.857856s, valid=True
2026-05-29T18:06:28.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:06:28.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:06:28.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:06:28.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003430.858518s, valid=True
2026-05-29T18:06:28.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:06:28.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:06:28.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:06:28.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:06:28.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:06:28.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:06:28.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:06:28.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:06:28.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:06:28.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:06:29.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:06:29.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:06:29.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:06:29.256 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:06:29.476 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:06:29.834 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:06:29.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:06:29.959 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:06:29.959 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:06:30.126 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:06:30.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:07:00.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:07:00.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:07:00.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:07:00.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:07:00.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:07:00.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:07:00.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-05-29T18:07:00.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:07:00.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-05-29T18:07:00.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:07:00.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:07:00.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:07:00.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-05-29T18:07:03.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-05-29T18:07:03.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:07:03.889 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:07:03.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:07:03.899 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:07:03.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:07:03.911 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:07:03.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:07:03.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:07:03.911 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:07:03.911 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:07:03.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:07:03.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:07:04.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:07:04.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:07:04.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:07:04.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T18:07:04.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:07:04.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T18:07:04.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:07:04.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:07:04.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:07:04.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:07:04.248 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:06:44
2026-05-29T18:07:04.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72508, datetime.datetime(2026, 5, 29, 18, 6, 44), datetime.datetime(2026, 5, 29, 18, 6, 43), 'salt', 10.44, 67.17, None, 13.73, 60.97, 5.82, 831.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:07:04.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:07:04.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:07:04.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:06:43, diff=21.255061s, valid=True
2026-05-29T18:07:04.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:07:04.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T18:07:04.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:07:12, diff=-7.742071s, valid=True
2026-05-29T18:07:04.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:07:04.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:07:04.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:06:43, diff=21.264768s, valid=True
2026-05-29T18:07:04.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:07:04.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:07:04.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:07:04.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:07:04.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:07:04.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T18:07:04.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:07:12, diff=-7.732167s, valid=True
2026-05-29T18:07:04.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:07:04.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:07:04.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:07:04.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003466.268487s, valid=True
2026-05-29T18:07:04.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:07:04.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:07:04.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:07:04.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:07:04.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:07:04.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:07:04.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:07:04.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:07:04.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:07:04.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:07:04.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:07:04.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:07:04.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:07:04.588 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:07:04.809 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:07:05.166 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:07:05.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:07: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-05-29T18:07: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-05-29T18:07:05.437 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:07:05.437 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:07:35.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:07:35.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:07:35.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:07:35.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:07:35.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:07:35.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:07:35.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-05-29T18:07:35.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:07:35.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-05-29T18:07:35.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:07:35.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:07:35.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:07:35.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-05-29T18:07:38.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-05-29T18:07:38.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:07:38.777 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:07:38.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:07:38.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:07:38.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:07:38.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:07:38.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:07:38.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:07:38.799 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:07:38.799 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:07:38.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:07:38.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:07:38.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:07:38.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:07:38.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:07:39.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T18:07:39.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:07:39.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T18:07:39.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:07:39.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:07:39.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:07:39.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:07:39.150 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:07:14
2026-05-29T18:07:39.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72509, datetime.datetime(2026, 5, 29, 18, 7, 14), datetime.datetime(2026, 5, 29, 18, 7, 14), 'salt', 10.28, 69.26, None, 12.35, 60.15, 5.37, 831.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:07:39.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:07:39.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:07:39.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:07:14, diff=25.15706s, valid=True
2026-05-29T18:07:39.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:07:39.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T18:07:39.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:07:12, diff=27.159897s, valid=True
2026-05-29T18:07:39.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:07:39.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:07:39.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:07:11, diff=28.166597s, valid=True
2026-05-29T18:07:39.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:07:39.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:07:39.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:07:39.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:07:39.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:07:39.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T18:07:39.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:07:12, diff=27.169632s, valid=True
2026-05-29T18:07:39.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:07:39.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:07:39.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:07:39.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003501.170284s, valid=True
2026-05-29T18:07:39.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:07:39.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:07:39.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:07:39.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:07:39.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:07:39.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:07:39.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:07:39.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:07:39.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:07:39.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:07:39.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:07:39.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:07:39.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:07:39.565 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:07:39.784 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:07:40.166 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:07:40.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:07:40.271 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:07:40.271 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:07:40.441 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:07:40.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:08:10.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:08:10.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:08:10.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:08:11.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:08:11.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:08:11.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:08:11.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-05-29T18:08:11.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:08:11.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-05-29T18:08:11.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:08:11.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:08:11.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:08:11.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-05-29T18:08:13.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-05-29T18:08:13.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:08:13.929 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:08:13.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:08:13.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:08:13.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:08:13.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:08:13.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:08:13.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:08:13.952 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:08:13.952 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:08:13.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:08:14.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T18:08:14.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:08:14.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T18:08:14.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:08:14.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:08:14.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:08:14.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:08:14.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:08:14.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:08:14.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:08:14.280 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:08:14.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:07:45
2026-05-29T18:08:14.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72510, datetime.datetime(2026, 5, 29, 18, 7, 45), datetime.datetime(2026, 5, 29, 18, 7, 44), 'salt', 10.11, 70.06, None, 12.63, 62.75, 5.2, 831.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:08:14.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:08:14.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T18:08:14.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:07:44, diff=30.363479s, valid=True
2026-05-29T18:08:14.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:08:14.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:08:14.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:08:12, diff=2.370802s, valid=True
2026-05-29T18:08:14.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:08:14.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T18:08:14.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:07:41, diff=33.38808s, valid=True
2026-05-29T18:08:14.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:08:14.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:08:14.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:08:14.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:08:14.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:08:14.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:08:14.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:08:12, diff=2.395691s, valid=True
2026-05-29T18:08:14.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:08:14.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:08:14.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:08:14.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003536.397208s, valid=True
2026-05-29T18:08:14.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:08:14.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:08:14.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:08:14.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:08:14.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:08:14.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:08:14.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:08:14.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:08:14.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:08:14.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:08:14.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:08:14.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:08:14.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:08:14.723 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:08:14.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:08:15.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:08:15.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:08:15.395 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:08:15.395 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:08:15.563 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:08:15.564 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:08:45.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:08:45.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:08:45.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:08:46.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:08:46.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:08:46.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:08:46.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-05-29T18:08:46.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:08:46.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-05-29T18:08:46.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:08:46.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:08:46.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:08:46.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-05-29T18:08:49.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-05-29T18:08:49.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:08:49.352 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:08:49.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:08:49.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:08:49.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:08:49.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:08:49.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:08:49.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:08:49.423 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:08:49.423 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:08:49.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:08:49.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:08:49.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:08:49.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:08:49.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:08:49.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:08:49.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:08:49.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:08:49.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:08:49.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:08:49.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:08:49.682 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:08:49.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:08:45
2026-05-29T18:08:49.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72512, datetime.datetime(2026, 5, 29, 18, 8, 45), datetime.datetime(2026, 5, 29, 18, 8, 45), 'salt', 9.88, 73.11, None, 11.72, 42.84, 4.58, 831.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:08:49.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:08:49.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:08:49.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:08:45, diff=4.761991s, valid=True
2026-05-29T18:08:49.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:08:49.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:08:49.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:09:12, diff=-22.235172s, valid=True
2026-05-29T18:08:49.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:08:49.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:08:49.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:08:42, diff=7.771578s, valid=True
2026-05-29T18:08:49.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:08:49.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:08:49.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:08:49.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:08:49.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:08:49.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:08:49.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:09:12, diff=-22.22539s, valid=True
2026-05-29T18:08:49.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:08:49.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:08:49.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:08:49.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003571.775292s, valid=True
2026-05-29T18:08:49.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:08:49.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:08:49.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:08:49.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:08:49.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:08:49.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:08:49.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:08:49.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:08:49.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:08:49.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:08:49.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:08:50.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:08:50.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:08:50.110 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:08:50.330 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:08:50.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:08:50.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:08:50.785 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:08:50.785 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:08:51.170 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:08:51.170 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:09:21.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:09:21.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:09:21.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:09:21.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:09:21.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:09:21.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:09:21.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-05-29T18:09:21.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:09:21.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-05-29T18:09:21.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:09:21.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:09:21.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:09:21.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-05-29T18:09:24.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-05-29T18:09:24.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:09:24.575 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:09:24.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:09:24.584 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:09:24.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:09:24.597 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:09:24.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:09:24.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:09:24.597 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:09:24.597 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:09:24.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:09:24.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:09:24.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:09:24.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:09:24.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:09:24.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:09:24.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:09:24.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:09:24.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:09:24.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:09:24.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:09:24.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:09:24.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:09:15
2026-05-29T18:09:24.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72513, datetime.datetime(2026, 5, 29, 18, 9, 15), datetime.datetime(2026, 5, 29, 18, 9, 15), 'salt', 9.72, 73.44, None, 16.8, 48.42, 4.51, 832.02, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:09:24.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:09:24.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:09:24.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:09:15, diff=9.949871s, valid=True
2026-05-29T18:09:24.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:09:24.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:09:24.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:09:12, diff=12.952785s, valid=True
2026-05-29T18:09:24.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:09:24.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:09:24.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:09:12, diff=12.959562s, valid=True
2026-05-29T18:09:24.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:09:24.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:09:24.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:09:24.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:09:24.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:09:24.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:09:24.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:09:12, diff=12.962641s, valid=True
2026-05-29T18:09:24.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:09:24.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:09:24.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:09:24.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003606.9633s, valid=True
2026-05-29T18:09:24.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:09:24.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:09:24.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:09:24.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:09:24.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:09:25.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:09:25.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:09:25.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:09:25.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:09:25.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:09:25.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:09:25.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:09:25.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:09:25.279 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:09:25.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:09:25.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:09:26.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:09:26.008 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:09:26.008 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:09:26.093 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:09:26.093 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:09:56.119 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:09:56.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:09:56.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:09:56.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:09:56.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:09:56.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:09:56.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-05-29T18:09:56.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:09:56.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-05-29T18:09:56.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:09:56.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:09:56.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:09:56.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-05-29T18:10:00.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-05-29T18:10:00.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:10:00.147 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:10:00.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:10:00.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:10:00.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:10:00.168 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:10:00.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:10:00.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:10:00.168 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:10:00.169 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:10:00.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:10:00.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:10:00.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:10:00.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:10:00.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:10:00.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:10:00.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:10:00.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:10:00.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:10:00.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:10:00.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:10:00.433 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:10:00.493 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:09:46
2026-05-29T18:10:00.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72514, datetime.datetime(2026, 5, 29, 18, 9, 46), datetime.datetime(2026, 5, 29, 18, 9, 45), 'salt', 9.72, 72.48, None, 13.23, 50.84, 4.7, 831.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:10:00.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:10:00.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:10:00.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:09:45, diff=15.49982s, valid=True
2026-05-29T18:10:00.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:10:00.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:10:00.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:10:12, diff=-11.497349s, valid=True
2026-05-29T18:10:00.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:10:00.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:10:00.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:09:42, diff=18.509328s, valid=True
2026-05-29T18:10:00.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:10:00.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:10:00.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:10:00.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:10:00.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:10:00.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:10:00.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:10:12, diff=-11.487636s, valid=True
2026-05-29T18:10:00.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:10:00.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:10:00.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:10:00.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003642.513061s, valid=True
2026-05-29T18:10:00.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:10:00.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:10:00.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:10:00.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:10:00.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:10:00.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:10:00.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:10:00.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:10:00.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:10:00.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:10:00.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:10:00.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:10:00.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:10:00.835 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:10:01.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:10:01.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:10:01.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:10:01.507 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:10:01.507 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:10:01.732 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:10:01.733 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:10:31.763 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:10:31.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:10:31.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:10:32.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:10:32.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:10:32.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:10:32.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-05-29T18:10:32.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:10:32.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-05-29T18:10:32.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:10:32.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:10:32.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:10:32.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-05-29T18:10:35.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-05-29T18:10:35.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:10:35.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:10:35.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:10:35.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:10:35.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:10:35.178 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:10:35.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:10:35.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:10:35.178 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:10:35.178 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:10:35.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:10:35.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:10:35.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:10:35.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:10:35.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:10:35.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:10:35.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:10:35.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:10:35.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:10:35.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:10:35.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:10:35.456 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:10:35.552 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:10:16
2026-05-29T18:10:35.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72515, datetime.datetime(2026, 5, 29, 18, 10, 16), datetime.datetime(2026, 5, 29, 18, 10, 16), 'salt', 9.91, 71.02, None, 13.83, 50.61, 4.99, 831.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:10:35.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:10:35.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:10:35.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:10:16, diff=19.558665s, valid=True
2026-05-29T18:10:35.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:10:35.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:10:35.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:10:12, diff=23.561512s, valid=True
2026-05-29T18:10:35.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:10:35.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:10:35.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:10:12, diff=23.568327s, valid=True
2026-05-29T18:10:35.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:10:35.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:10:35.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:10:35.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:10:35.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:10:35.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:10:35.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:10:12, diff=23.571389s, valid=True
2026-05-29T18:10:35.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:10:35.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:10:35.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:10:35.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003677.57207s, valid=True
2026-05-29T18:10:35.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:10:35.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:10:35.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:10:35.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:10:35.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:10:35.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:10:35.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:10:35.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:10:35.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:10:35.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:10:35.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:10:35.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:10:35.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:10:35.888 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:10:36.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:10:36.561 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:10:36.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:10:36.662 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:10:36.662 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:10:36.841 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:10:36.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:11:06.870 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:11:06.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:11:06.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:11:07.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:11:07.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:11:07.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:11:07.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-05-29T18:11:07.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:11:07.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-05-29T18:11:07.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:11:07.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:11:07.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:11:07.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-05-29T18:11:10.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-05-29T18:11:10.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:11:10.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:11:10.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:11:10.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:11:10.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:11:10.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:11:10.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:11:10.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:11:10.250 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:11:10.250 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:11:10.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:11:10.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:11:10.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:11:10.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:11:10.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:11:10.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:11:10.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:11:10.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:11:10.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:11:10.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:11:10.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:11:10.517 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:11:10.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:10:46
2026-05-29T18:11:10.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72516, datetime.datetime(2026, 5, 29, 18, 10, 46), datetime.datetime(2026, 5, 29, 18, 10, 46), 'salt', 10.11, 68.1, None, 13.02, 47.44, 5.6, 831.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:11:10.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:11:10.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:11:10.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:10:46, diff=24.584426s, valid=True
2026-05-29T18:11:10.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:11:10.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:11:10.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:11:12, diff=-1.412648s, valid=True
2026-05-29T18:11:10.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:11:10.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:11:10.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:10:44, diff=26.593936s, valid=True
2026-05-29T18:11:10.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:11:10.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:11:10.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:11:10.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:11:10.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:11:10.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:11:10.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:11:12, diff=-1.403014s, valid=True
2026-05-29T18:11:10.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:11:10.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:11:10.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:11:10.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003712.597655s, valid=True
2026-05-29T18:11:10.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:11:10.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:11:10.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:11:10.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:11:10.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:11:10.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:11:10.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:11:10.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:11:10.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:11:10.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:11:10.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:11:10.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:11:10.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:11:10.927 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:11:11.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:11:11.497 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:11:11.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:11:11.608 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:11:11.608 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:11:11.792 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:11:11.792 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:11:41.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:11:41.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:11:41.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:11:42.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:11:42.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:11:42.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:11:42.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-05-29T18:11:42.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:11:42.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-05-29T18:11:42.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:11:42.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:11:42.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:11:42.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-05-29T18:11:45.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-05-29T18:11:45.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:11:45.267 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:11:45.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:11:45.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:11:45.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:11:45.287 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:11:45.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:11:45.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:11:45.287 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:11:45.288 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:11:45.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:11:45.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T18:11:45.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:11:45.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T18:11:45.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:11:45.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T18:11:45.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:11:45.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T18:11:45.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:11:45.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:11:45.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:11:45.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:11:45.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:11:17
2026-05-29T18:11:45.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72517, datetime.datetime(2026, 5, 29, 18, 11, 17), datetime.datetime(2026, 5, 29, 18, 11, 16), 'salt', 10.28, 67.14, None, 15.63, 47.06, 5.82, 831.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:11:45.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:11:45.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T18:11:45.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:11:16, diff=29.632873s, valid=True
2026-05-29T18:11:45.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:11:45.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T18:11:45.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:11:12, diff=33.635686s, valid=True
2026-05-29T18:11:45.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:11:45.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T18:11:45.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:11:15, diff=30.642363s, valid=True
2026-05-29T18:11:45.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:11:45.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:11:45.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:11:45.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:11:45.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:11:45.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T18:11:45.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:11:12, diff=33.645411s, valid=True
2026-05-29T18:11:45.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:11:45.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:11:45.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:11:45.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003747.646093s, valid=True
2026-05-29T18:11:45.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:11:45.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:11:45.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:11:45.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:11:45.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:11:45.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:11:45.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:11:45.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:11:45.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:11:45.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:11:45.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:11:45.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:11:45.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:11:45.961 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:11:46.248 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:11:46.596 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:11:46.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:11:46.700 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:11:46.700 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:11:46.871 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:11:46.871 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:12:16.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:12:16.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:12:16.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:12:16.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:12:16.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:12:17.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:12: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-05-29T18:12:17.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:12:17.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-05-29T18:12:17.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:12:17.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:12:17.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:12:17.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-05-29T18:12:20.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-05-29T18:12:20.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:12:20.797 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:12:20.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:12:20.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:12:20.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:12:20.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:12:20.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:12:20.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:12:20.818 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:12:20.818 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:12:20.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:12:20.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:12:20.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:12:20.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:12:20.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:12:21.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:12:21.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:12:21.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:12:21.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:12:21.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:12:21.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:12:21.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:12:21.149 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:12:17
2026-05-29T18:12:21.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72519, datetime.datetime(2026, 5, 29, 18, 12, 17), datetime.datetime(2026, 5, 29, 18, 12, 17), 'salt', 10.41, 65.12, None, 14.57, 43.94, 6.26, 832.02, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:12:21.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:12:21.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:12:21.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:12:17, diff=4.156838s, valid=True
2026-05-29T18:12:21.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:12:21.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:12:21.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:12:12, diff=9.160066s, valid=True
2026-05-29T18:12:21.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:12:21.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:12:21.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:12:14, diff=7.171872s, valid=True
2026-05-29T18:12:21.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:12:21.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:12:21.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:12:21.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:12:21.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:12:21.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:12:21.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:12:12, diff=9.175357s, valid=True
2026-05-29T18:12:21.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:12:21.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:12:21.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:12:21.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003783.176262s, valid=True
2026-05-29T18:12:21.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:12:21.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:12:21.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:12:21.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:12:21.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:12:21.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:12:21.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:12:21.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:12:21.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:12:21.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:12:21.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:12:21.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:12:21.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:12:21.568 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:12:21.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:12:22.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:12:22.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:12:22.331 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:12:22.331 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:12:22.519 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:12:22.519 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:12:52.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:12:52.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:12:52.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:12:52.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:12:52.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:12:52.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:12:52.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-05-29T18:12:52.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:12: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-05-29T18:12:52.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:12:52.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:12:52.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:12:52.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-05-29T18:12:55.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-05-29T18:12:55.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:12:55.847 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:12:55.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:12:55.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:12:55.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:12:55.867 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:12:55.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:12:55.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:12:55.868 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:12:55.868 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:12:55.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:12:55.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:12:55.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:12:56.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:12:56.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:12:56.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:12:56.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:12:56.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:12:56.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:12:56.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:12:56.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:12:56.126 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:12:56.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:12:47
2026-05-29T18:12:56.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72520, datetime.datetime(2026, 5, 29, 18, 12, 47), datetime.datetime(2026, 5, 29, 18, 12, 47), 'salt', 10.48, 63.99, None, 13.94, 47.91, 6.51, 831.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:12:56.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:12:56.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:12:56.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:12:47, diff=9.19157s, valid=True
2026-05-29T18:12:56.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:12:56.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:12:56.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:13:12, diff=-15.805564s, valid=True
2026-05-29T18:12:56.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:12:56.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:12:56.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:12:44, diff=12.200975s, valid=True
2026-05-29T18:12:56.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:12:56.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:12:56.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:12:56.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:12:56.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:12:56.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:12:56.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:13:12, diff=-15.796012s, valid=True
2026-05-29T18:12:56.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:12:56.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:12:56.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:12:56.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003818.204645s, valid=True
2026-05-29T18:12:56.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:12:56.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:12:56.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:12:56.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:12:56.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:12:56.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:12:56.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:12:56.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:12:56.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:12:56.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:12:56.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:12:56.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:12:56.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:12:56.618 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:12:56.844 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:12:57.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:12:57.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:12:57.310 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:12:57.310 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:12:57.560 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:12:57.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:13:27.589 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:13:27.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:13:27.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:13:27.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:13:27.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:13:28.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:13:28.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-05-29T18:13:28.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:13:28.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-05-29T18:13:28.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:13:28.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:13:28.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:13:28.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T18:13:31.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-05-29T18:13:31.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:13:31.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:13:31.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:13:31.599 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:13:31.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:13:31.612 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:13:31.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:13:31.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:13:31.612 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:13:31.612 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:13:31.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:13:31.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:13:31.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:13:31.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:13:31.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:13:31.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:13:31.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:13:31.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:13:31.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:13:31.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:13:31.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:13:31.866 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:13:31.925 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:13:17
2026-05-29T18:13:31.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72521, datetime.datetime(2026, 5, 29, 18, 13, 17), datetime.datetime(2026, 5, 29, 18, 13, 17), 'salt', 10.51, 63.89, None, 14.72, 46.13, 6.53, 831.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:13:31.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:13:31.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:13:31.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:13:17, diff=14.931478s, valid=True
2026-05-29T18:13:31.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:13:31.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:13:31.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:13:12, diff=19.934333s, valid=True
2026-05-29T18:13:31.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:13:31.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:13:31.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:13:14, diff=17.941093s, valid=True
2026-05-29T18:13:31.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:13:31.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:13:31.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:13:31.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:13:31.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:13:31.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:13:31.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:13:12, diff=19.944264s, valid=True
2026-05-29T18:13:31.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:13:31.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:13:31.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:13:31.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003853.944949s, valid=True
2026-05-29T18:13:31.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:13:31.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:13:31.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:13:31.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:13:31.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:13:32.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:13:32.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:13:32.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:13:32.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:13:32.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:13:32.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:13:32.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:13:32.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:13:32.263 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:13:32.480 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:13:32.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:13:32.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:13:32.934 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:13:32.934 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:13:33.110 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:13:33.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:14:03.122 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:14:03.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:14:03.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:14:03.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:14:03.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:14:03.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:14:03.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T18:14:03.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:14:03.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T18:14:03.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:14:03.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:14:03.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:14:03.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-05-29T18:14:06.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-05-29T18:14:06.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:14:06.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:14:06.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:14:06.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:14:06.444 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:14:06.444 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:14:06.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:14:06.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:14:06.445 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:14:06.445 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:14:06.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:14:06.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:14:06.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:14:06.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:14:06.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:14:06.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:14:06.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:14:06.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:14:06.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:14:06.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:14:06.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:14:06.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:14:06.783 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:13:48
2026-05-29T18:14:06.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72522, datetime.datetime(2026, 5, 29, 18, 13, 48), datetime.datetime(2026, 5, 29, 18, 13, 47), 'salt', 10.48, 63.17, None, 13.83, 48.64, 6.7, 831.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:14:06.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:14:06.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:14:06.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:13:47, diff=19.790518s, valid=True
2026-05-29T18:14:06.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:14:06.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:14:06.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:14:12, diff=-5.205713s, valid=True
2026-05-29T18:14:06.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:14:06.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:14:06.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:13:44, diff=22.800983s, valid=True
2026-05-29T18:14:06.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:14:06.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:14:06.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:14:06.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:14:06.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:14:06.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:14:06.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:14:12, diff=-5.195458s, valid=True
2026-05-29T18:14:06.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:14:06.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:14:06.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:14:06.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003888.805218s, valid=True
2026-05-29T18:14:06.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:14:06.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:14:06.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:14:06.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:14:06.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:14:06.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:14:06.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:14:06.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:14:06.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:14:07.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:14:07.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:14:07.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:14:07.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:14:07.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:14:07.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:14:07.810 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:14:07.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:14:07.921 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:14:07.921 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:14:08.162 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:14:08.162 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:14:38.175 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:14:38.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:14:38.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:14:38.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:14:38.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:14:38.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:14:38.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-05-29T18:14:38.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:14:38.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-05-29T18:14:38.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:14:38.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:14:38.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:14:38.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-05-29T18:14:41.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-05-29T18:14:41.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:14:41.498 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:14:41.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:14:41.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:14:41.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:14:41.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:14:41.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:14:41.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:14:41.518 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:14:41.518 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:14:41.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:14:41.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:14:41.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:14:41.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:14:41.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:14:41.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:14:41.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:14:41.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:14:41.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:14:41.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:14:41.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:14:41.775 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:14:41.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:14:18
2026-05-29T18:14:41.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72523, datetime.datetime(2026, 5, 29, 18, 14, 18), datetime.datetime(2026, 5, 29, 18, 14, 17), 'salt', 10.65, 62.97, None, 13.13, 47.21, 6.75, 831.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:14:41.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:14:41.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:14:41.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:14:17, diff=24.842604s, valid=True
2026-05-29T18:14:41.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:14:41.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:14:41.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:14:12, diff=29.845446s, valid=True
2026-05-29T18:14:41.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:14:41.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:14:41.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:14:15, diff=26.852269s, valid=True
2026-05-29T18:14:41.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:14:41.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:14:41.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:14:41.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:14:41.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:14:41.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:14:41.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:14:12, diff=29.855307s, valid=True
2026-05-29T18:14:41.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:14:41.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:14:41.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:14:41.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003923.855973s, valid=True
2026-05-29T18:14:41.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:14:41.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:14:41.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:14:41.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:14:41.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:14:41.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:14:41.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:14:41.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:14:41.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:14:41.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:14:42.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:14:42.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:14:42.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:14:42.172 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:14:42.394 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:14:42.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:14:42.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:14:42.847 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:14:42.847 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:14:43.056 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:14:43.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:15:13.086 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:15:13.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:15:13.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:15:13.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:15:13.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:15:13.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:15:13.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-05-29T18:15:13.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:15:13.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-05-29T18:15:13.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:15:13.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:15:13.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:15:13.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T18:15:16.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-05-29T18:15:16.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:15:16.530 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:15:16.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:15:16.539 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:15:16.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:15:16.551 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:15:16.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:15:16.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:15:16.551 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:15:16.551 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:15:16.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:15:16.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:15:16.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:15:16.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:15:16.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:15:16.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:15:16.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:15:16.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:15:16.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:15:16.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:15:16.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:15:16.877 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:15:16.940 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:14:48
2026-05-29T18:15:16.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72524, datetime.datetime(2026, 5, 29, 18, 14, 48), datetime.datetime(2026, 5, 29, 18, 14, 48), 'salt', 10.58, 63.4, None, 11.65, 55.39, 6.65, 831.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:15:16.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:15:16.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:15:16.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:14:48, diff=28.947075s, valid=True
2026-05-29T18:15:16.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:15:16.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:15:16.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:15:12, diff=4.949971s, valid=True
2026-05-29T18:15:16.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:15:16.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:15:16.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:14:45, diff=31.957958s, valid=True
2026-05-29T18:15:16.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:15:16.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:15:16.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:15:16.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:15:16.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:15:16.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:15:16.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:15:12, diff=4.961084s, valid=True
2026-05-29T18:15:16.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:15:16.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:15:16.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:15:16.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003958.961767s, valid=True
2026-05-29T18:15:16.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:15:16.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:15:16.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:15:16.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:15:16.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:15:17.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:15:17.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:15:17.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:15:17.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:15:17.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:15:17.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:15:17.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:15:17.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:15:17.294 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:15:17.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:15:17.897 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:15:18.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:15:18.006 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:15:18.006 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:15:18.247 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:15:18.247 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:15:48.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:15:48.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:15:48.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:15:48.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:15:48.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:15:48.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:15:48.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-05-29T18:15:48.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:15:48.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-05-29T18:15:48.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:15:48.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:15:48.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:15:48.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-05-29T18:15:51.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T18:15:51.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:15:51.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:15:51.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:15:51.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:15:51.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:15:51.793 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:15:51.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:15:51.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:15:51.793 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:15:51.794 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:15:51.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:15:51.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:15:51.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:15:51.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:15:51.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:15:52.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:15:52.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:15:52.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:15:52.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:15:52.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:15:52.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:15:52.046 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:15:52.106 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:15:49
2026-05-29T18:15:52.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72526, datetime.datetime(2026, 5, 29, 18, 15, 49), datetime.datetime(2026, 5, 29, 18, 15, 48), 'salt', 10.41, 65.92, None, 13.02, 48.97, 6.08, 831.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:15:52.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:15:52.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:15:52.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:15:48, diff=4.112181s, valid=True
2026-05-29T18:15:52.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:15:52.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:15:52.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:16:12, diff=-19.88496s, valid=True
2026-05-29T18:15:52.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:15:52.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:15:52.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:15:48, diff=4.121812s, valid=True
2026-05-29T18:15:52.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:15:52.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:15:52.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:15:52.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:15:52.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:15:52.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:15:52.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:16:12, diff=-19.875116s, valid=True
2026-05-29T18:15:52.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:15:52.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:15:52.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:15:52.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1003994.12554s, valid=True
2026-05-29T18:15:52.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:15:52.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:15:52.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:15:52.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:15:52.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:15:52.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:15:52.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:15:52.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:15:52.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:15:52.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:15:52.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:15:52.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:15:52.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:15:52.439 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:15:52.654 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:15:53.003 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:15:53.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:15:53.103 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:15:53.103 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:15:53.278 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:15:53.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:16:23.280 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:16:23.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:16:23.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:16:23.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:16:23.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:16:23.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:16:23.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-05-29T18:16:23.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:16:23.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-05-29T18:16:23.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:16:23.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:16:23.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:16:23.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-05-29T18:16:26.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-05-29T18:16:26.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:16:26.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:16:26.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:16:26.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:16:26.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:16:26.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:16:26.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:16:26.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:16:26.776 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:16:26.776 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:16:26.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:16:26.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:16:26.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:16:26.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:16:26.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:16:26.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:16:26.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:16:27.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:16:27.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:16:27.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:16:27.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:16:27.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:16:27.113 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:16:19
2026-05-29T18:16:27.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72527, datetime.datetime(2026, 5, 29, 18, 16, 19), datetime.datetime(2026, 5, 29, 18, 16, 18), 'salt', 10.35, 67.25, None, 13.06, 51.83, 5.8, 831.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:16:27.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:16:27.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:16:27.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:16:18, diff=9.119999s, valid=True
2026-05-29T18:16:27.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:16:27.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:16:27.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:16:12, diff=15.122858s, valid=True
2026-05-29T18:16:27.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:16:27.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:16:27.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:16:16, diff=11.129736s, valid=True
2026-05-29T18:16:27.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:16:27.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:16:27.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:16:27.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:16:27.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:16:27.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:16:27.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:16:12, diff=15.132786s, valid=True
2026-05-29T18:16:27.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:16:27.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:16:27.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:16:27.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004029.133443s, valid=True
2026-05-29T18:16:27.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:16:27.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:16:27.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:16:27.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:16:27.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:16:27.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:16:27.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:16:27.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:16:27.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:16:27.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:16:27.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:16:27.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:16:27.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:16:27.451 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:16:27.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:16:28.016 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:16:28.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:16:28.117 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:16:28.117 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:16:28.293 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:16:28.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:16:58.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:16:58.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:16:58.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:16:58.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:16:58.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:16:58.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:16:58.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-05-29T18:16:58.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:16:58.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T18:16:58.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:16:58.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:16:58.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:16:58.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-05-29T18:17:01.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-05-29T18:17:01.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:17:01.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:17:01.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:17:01.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:17:01.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:17:01.784 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:17:01.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:17:01.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:17:01.785 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:17:01.785 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:17:01.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:17:01.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:17:01.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:17:01.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:17:01.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:17:02.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:17:02.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:17:02.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:17:02.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:17:02.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:17:02.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:17:02.074 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:17:02.132 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:16:49
2026-05-29T18:17:02.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72528, datetime.datetime(2026, 5, 29, 18, 16, 49), datetime.datetime(2026, 5, 29, 18, 16, 49), 'salt', 10.08, 68.21, None, 12.85, 54.9, 5.58, 831.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:17:02.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:17:02.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:17:02.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:16:49, diff=13.138506s, valid=True
2026-05-29T18:17:02.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:17:02.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:17:02.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:17:12, diff=-9.858627s, valid=True
2026-05-29T18:17:02.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:17:02.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:17:02.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:16:46, diff=16.148164s, valid=True
2026-05-29T18:17:02.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:17:02.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:17:02.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:17:02.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:17:02.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:17:02.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:17:02.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:17:12, diff=-9.848796s, valid=True
2026-05-29T18:17:02.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:17:02.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:17:02.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:17:02.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004064.151878s, valid=True
2026-05-29T18:17:02.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:17:02.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:17:02.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:17:02.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:17:02.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:17:02.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:17:02.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:17:02.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:17:02.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:17:02.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:17:02.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:17:02.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:17:02.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:17:02.475 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:17:02.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:17:03.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:17:03.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:17:03.226 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:17:03.226 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:17:03.401 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:17:03.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:17:33.431 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:17:33.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:17:33.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:17:33.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:17:33.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:17:33.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:17:33.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-05-29T18:17:33.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:17:33.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-05-29T18:17:33.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:17:33.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:17:33.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:17:33.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-05-29T18:17:36.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T18:17:36.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:17:36.855 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:17:36.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:17:36.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:17:36.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:17:36.875 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:17:36.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:17:36.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:17:36.875 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:17:36.875 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:17:36.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:17:36.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:17:36.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:17:37.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:17:37.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:17:37.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:17:37.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:17:37.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:17:37.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:17:37.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:17:37.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:17:37.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:17:37.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:17:19
2026-05-29T18:17:37.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72529, datetime.datetime(2026, 5, 29, 18, 17, 19), datetime.datetime(2026, 5, 29, 18, 17, 18), 'salt', 10.25, 69.1, None, 12.7, 54.53, 5.4, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:17:37.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:17:37.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:17:37.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:17:18, diff=19.194654s, valid=True
2026-05-29T18:17:37.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:17:37.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:17:37.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:17:12, diff=25.197498s, valid=True
2026-05-29T18:17:37.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:17:37.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:17:37.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:17:16, diff=21.204269s, valid=True
2026-05-29T18:17:37.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:17:37.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:17:37.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:17:37.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:17:37.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:17:37.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:17:37.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:17:12, diff=25.207289s, valid=True
2026-05-29T18:17:37.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:17:37.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:17:37.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:17:37.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004099.207968s, valid=True
2026-05-29T18:17:37.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:17:37.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:17:37.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:17:37.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:17:37.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:17:37.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:17:37.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:17:37.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:17:37.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:17:37.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:17:37.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:17:37.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:17:37.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:17:37.522 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:17:37.736 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:17:38.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:17:38.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:17:38.186 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:17:38.186 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:17:38.371 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:17:38.371 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:18:08.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:18:08.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:18:08.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:18:08.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:18:08.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:18:09.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:18:09.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-05-29T18:18:09.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:18:09.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-05-29T18:18:09.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:18:09.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:18:09.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:18:09.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-05-29T18:18:11.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-05-29T18:18:11.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:18:11.930 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:18:11.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:18:11.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:18:11.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:18:11.952 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:18:11.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:18:11.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:18:11.952 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:18:11.952 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:18:11.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:18:12.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:18:12.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:18:12.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:18:12.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:18:12.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:18:12.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:18:12.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:18:12.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:18:12.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:18:12.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:18:12.204 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:18:12.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:17:49
2026-05-29T18:18:12.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72530, datetime.datetime(2026, 5, 29, 18, 17, 49), datetime.datetime(2026, 5, 29, 18, 17, 49), 'salt', 10.02, 69.3, None, 12.74, 57.39, 5.36, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:18:12.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:18:12.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:18:12.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:17:49, diff=23.269288s, valid=True
2026-05-29T18:18:12.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:18:12.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:18:12.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:18:12, diff=0.272152s, valid=True
2026-05-29T18:18:12.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:18:12.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:18:12.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:17:47, diff=25.278763s, valid=True
2026-05-29T18:18:12.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:18:12.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:18:12.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:18:12.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:18:12.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:18:12.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:18:12.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:18:12, diff=0.281789s, valid=True
2026-05-29T18:18:12.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:18:12.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:18:12.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:18:12.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004134.282434s, valid=True
2026-05-29T18:18:12.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:18:12.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:18:12.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:18:12.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:18:12.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:18:12.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:18:12.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:18:12.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:18:12.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:18:12.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:18:12.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:18:12.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:18:12.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:18:12.600 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:18:12.886 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:18:13.235 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:18:13.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:18:13.335 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:18:13.335 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:18:13.513 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:18:13.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:18:43.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:18:43.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:18:43.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:18:43.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:18:43.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:18:43.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:18:43.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T18:18:43.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:18:43.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-05-29T18:18:43.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:18:43.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:18:43.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:18:43.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-05-29T18:18:46.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-05-29T18:18:46.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:18:46.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:18:46.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:18:46.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:18:46.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:18:46.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:18:46.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:18:46.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:18:46.927 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:18:46.928 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:18:46.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:18:47.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:18:47.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:18:47.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:18:47.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:18:47.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:18:47.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:18:47.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:18:47.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:18:47.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:18:47.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:18:47.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:18:47.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:18:20
2026-05-29T18:18:47.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72531, datetime.datetime(2026, 5, 29, 18, 18, 20), datetime.datetime(2026, 5, 29, 18, 18, 19), 'salt', 9.98, 69.53, None, 10.34, 56.83, 5.3, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:18:47.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:18:47.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:18:47.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:18:19, diff=28.25222s, valid=True
2026-05-29T18:18:47.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:18:47.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:18:47.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:18:12, diff=35.255097s, valid=True
2026-05-29T18:18:47.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:18:47.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:18:47.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:18:17, diff=30.2618s, valid=True
2026-05-29T18:18:47.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:18:47.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:18:47.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:18:47.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:18:47.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:18:47.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:18:47.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:18:12, diff=35.264854s, valid=True
2026-05-29T18:18:47.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:18:47.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:18:47.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:18:47.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004169.265513s, valid=True
2026-05-29T18:18:47.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:18:47.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:18:47.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:18:47.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:18:47.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:18:47.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:18:47.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:18:47.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:18:47.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:18:47.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:18:47.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:18:47.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:18:47.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:18:47.590 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:18:47.805 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:18:48.154 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:18:48.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:18:48.254 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:18:48.254 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:18:48.339 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:18:48.339 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:19:18.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:19:18.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:19:18.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:19:18.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:19:18.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:19:18.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:19:18.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-05-29T18:19:18.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:19:18.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-05-29T18:19:18.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:19:18.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:19:18.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:19:18.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-05-29T18:19:22.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-05-29T18:19:22.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:19:22.401 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:19:22.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:19:22.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:19:22.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:19:22.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:19:22.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:19:22.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:19:22.423 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:19:22.423 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:19:22.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:19:22.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:19:22.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:19:22.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:19:22.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:19:22.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:19:22.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:19:22.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:19:22.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:19:22.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:19:22.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:19:22.678 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:19:22.747 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:19:20
2026-05-29T18:19:22.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72533, datetime.datetime(2026, 5, 29, 18, 19, 20), datetime.datetime(2026, 5, 29, 18, 19, 20), 'salt', 9.89, 70.13, None, 11.61, 57.04, 5.18, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:19:22.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:19:22.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:19:22.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:19:20, diff=2.753869s, valid=True
2026-05-29T18:19:22.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:19:22.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:19:22.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:19:12, diff=10.756727s, valid=True
2026-05-29T18:19:22.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:19:22.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:19:22.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:19:18, diff=4.764582s, valid=True
2026-05-29T18:19:22.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:19:22.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:19:22.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:19:22.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:19:22.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:19:22.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:19:22.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:19:12, diff=10.767837s, valid=True
2026-05-29T18:19:22.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:19:22.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:19:22.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:19:22.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004204.768875s, valid=True
2026-05-29T18:19:22.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:19:22.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:19:22.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:19:22.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:19:22.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:19:22.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:19:22.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:19:22.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:19:22.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:19:22.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:19:22.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:19:23.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:19:23.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:19:23.167 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:19:23.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:19:23.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:19:23.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:19:23.883 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:19:23.883 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:19:24.872 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:19:24.872 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:19:54.895 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:19:54.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:19:54.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:19:54.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:19:54.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:19:55.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:19:55.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T18:19:55.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:19:55.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-05-29T18:19:55.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:19:55.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:19:55.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:19:55.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-05-29T18:19:58.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-05-29T18:19:58.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:19:58.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:19:58.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:19:58.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:19:58.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:19:58.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:19:58.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:19:58.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:19:58.085 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:19:58.085 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:19:58.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:19:58.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:19:58.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:19:58.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:19:58.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:19:58.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:19:58.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:19:58.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:19:58.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:19:58.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:19:58.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:19:58.352 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:19:58.411 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:19:50
2026-05-29T18:19:58.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72534, datetime.datetime(2026, 5, 29, 18, 19, 50), datetime.datetime(2026, 5, 29, 18, 19, 50), 'salt', 9.79, 70.7, None, 11.47, 59.45, 5.06, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:19:58.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:19:58.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:19:58.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:19:50, diff=8.417153s, valid=True
2026-05-29T18:19:58.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:19:58.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:19:58.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:20:12, diff=-13.580033s, valid=True
2026-05-29T18:19:58.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:19:58.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:19:58.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:19:49, diff=9.42667s, valid=True
2026-05-29T18:19:58.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:19:58.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:19:58.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:19:58.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:19:58.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:19:58.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:19:58.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:20:12, diff=-13.57033s, valid=True
2026-05-29T18:19:58.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:19:58.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:19:58.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:19:58.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004240.430322s, valid=True
2026-05-29T18:19:58.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:19:58.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:19:58.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:19:58.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:19:58.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:19:58.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:19:58.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:19:58.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:19:58.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:19:58.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:19:58.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:19:58.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:19:58.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:19:58.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:19:58.974 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:19:59.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:19:59.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:19:59.424 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:19:59.424 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:19:59.511 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:19:59.511 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:20:29.541 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:20:29.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:20:29.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:20:29.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:20:29.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:20:30.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:20:30.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-05-29T18:20:30.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:20:30.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-05-29T18:20:30.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:20:30.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:20:30.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:20: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-05-29T18:20:33.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-05-29T18:20:33.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:20:33.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:20:33.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:20:33.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:20:33.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:20:33.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:20:33.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:20:33.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:20:33.290 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:20:33.290 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:20:33.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:20:33.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:20:33.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:20:33.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:20:33.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:20:33.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:20:33.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:20:33.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:20:33.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:20:33.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:20:33.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:20:33.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:20:33.603 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:20:20
2026-05-29T18:20:33.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72535, datetime.datetime(2026, 5, 29, 18, 20, 20), datetime.datetime(2026, 5, 29, 18, 20, 20), 'salt', 9.79, 71.46, None, 10.94, 53.68, 4.91, 832.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:20:33.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:20:33.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:20:33.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:20:20, diff=13.609791s, valid=True
2026-05-29T18:20:33.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:20:33.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:20:33.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:20:12, diff=21.612692s, valid=True
2026-05-29T18:20:33.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:20:33.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:20:33.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:20:19, diff=14.619562s, valid=True
2026-05-29T18:20:33.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:20:33.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:20:33.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:20:33.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:20:33.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:20:33.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:20:33.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:20:12, diff=21.62261s, valid=True
2026-05-29T18:20:33.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:20:33.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:20:33.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:20:33.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004275.623277s, valid=True
2026-05-29T18:20:33.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:20:33.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:20:33.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:20:33.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:20:33.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:20:33.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:20:33.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:20:33.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:20:33.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:20:33.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:20:33.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:20:33.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:20:33.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:20:34.002 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:20:34.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:20:34.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:20:34.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:20:34.665 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:20:34.665 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:20:34.844 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:20:34.844 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:21:04.872 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:21:04.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:21:04.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:21:05.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:21:05.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:21:05.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:21:05.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-05-29T18:21:05.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:21:05.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T18:21:05.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:21:05.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:21:05.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:21: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-05-29T18:21:08.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-05-29T18:21:08.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:21:08.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:21:08.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:21:08.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:21:08.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:21:08.588 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:21:08.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:21:08.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:21:08.589 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:21:08.589 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:21:08.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:21:08.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:21:08.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:21:08.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:21:08.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:21:08.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:21:08.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:21:08.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:21:08.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:21:08.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:21:08.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:21:08.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:21:08.899 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:20:51
2026-05-29T18:21:08.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72536, datetime.datetime(2026, 5, 29, 18, 20, 51), datetime.datetime(2026, 5, 29, 18, 20, 50), 'salt', 9.59, 73.78, None, 14.54, 64.85, 4.44, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:21:08.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:21:08.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:21:08.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:20:50, diff=18.905239s, valid=True
2026-05-29T18:21:08.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:21:08.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:21:08.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:21:12, diff=-3.091945s, valid=True
2026-05-29T18:21:08.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:21:08.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:21:08.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:20:49, diff=19.914737s, valid=True
2026-05-29T18:21:08.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:21:08.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:21:08.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:21:08.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:21:08.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:21:08.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:21:08.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:21:12, diff=-3.082281s, valid=True
2026-05-29T18:21:08.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:21:08.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:21:08.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:21:08.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004310.918379s, valid=True
2026-05-29T18:21:08.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:21:08.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:21:08.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:21:08.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:21:08.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:21:08.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:21:08.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:21:08.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:21:08.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:21:09.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:21:09.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:21:09.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:21:09.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:21:09.231 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:21:09.445 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:21:09.792 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:21:09.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:21:09.898 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:21:09.898 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:21:10.077 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:21:10.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:21:40.107 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:21:40.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:21:40.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:21:40.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:21:40.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:21:40.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:21:40.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-05-29T18:21:40.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:21:40.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-05-29T18:21:40.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:21:40.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:21:40.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:21:40.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-05-29T18:21:43.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-05-29T18:21:43.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:21:43.670 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:21:43.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:21:43.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:21:43.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:21:43.691 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:21:43.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:21:43.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:21:43.692 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:21:43.692 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:21:43.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:21:43.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:21:43.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:21:43.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:21:43.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:21:43.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:21:43.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:21:44.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:21:44.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:21:44.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:21:44.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:21:44.009 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:21:44.068 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:21:21
2026-05-29T18:21:44.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72537, datetime.datetime(2026, 5, 29, 18, 21, 21), datetime.datetime(2026, 5, 29, 18, 21, 21), 'salt', 9.49, 74.41, None, 13.02, 53.24, 4.32, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:21:44.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:21:44.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:21:44.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:21:21, diff=23.074504s, valid=True
2026-05-29T18:21:44.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:21:44.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:21:44.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:21:12, diff=32.077308s, valid=True
2026-05-29T18:21:44.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:21:44.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:21:44.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:21:19, diff=25.083923s, valid=True
2026-05-29T18:21:44.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:21:44.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:21:44.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:21:44.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:21:44.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:21:44.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:21:44.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:21:12, diff=32.086938s, valid=True
2026-05-29T18:21:44.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:21:44.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:21:44.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:21:44.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004346.087582s, valid=True
2026-05-29T18:21:44.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:21:44.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:21:44.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:21:44.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:21:44.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:21:44.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:21:44.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:21:44.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:21:44.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:21:44.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:21:44.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:21:44.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:21:44.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:21:44.400 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:21:44.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:21:44.980 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:21:45.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:21:45.082 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:21:45.082 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:21:45.322 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:21:45.322 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:22:15.352 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:22:15.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:22:15.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:22:15.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:22:15.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:22:15.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:22:15.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-05-29T18:22:15.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:22:15.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T18:22:15.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:22:15.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:22:15.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:22:15.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-05-29T18:22:18.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-05-29T18:22:18.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:22:18.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:22:18.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:22:18.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:22:18.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:22:18.734 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:22:18.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:22:18.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:22:18.734 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:22:18.734 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:22:18.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:22:18.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:22:18.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:22:18.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:22:18.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:22:18.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:22:18.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:22:18.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:22:18.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:22:18.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:22:18.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:22:18.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:22:19.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:21:51
2026-05-29T18:22:19.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72538, datetime.datetime(2026, 5, 29, 18, 21, 51), datetime.datetime(2026, 5, 29, 18, 21, 51), 'salt', 9.36, 75.94, None, 12.49, 63.4, 4.02, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:22:19.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:22:19.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:22:19.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:21:51, diff=28.062157s, valid=True
2026-05-29T18:22:19.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:22:19.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:22:19.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:22:12, diff=7.065446s, valid=True
2026-05-29T18:22:19.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:22:19.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:22:19.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:21:50, diff=29.073191s, valid=True
2026-05-29T18:22:19.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:22:19.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:22:19.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:22:19.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:22:19.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:22:19.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:22:19.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:22:12, diff=7.076643s, valid=True
2026-05-29T18:22:19.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:22:19.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:22:19.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:22:19.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004381.077388s, valid=True
2026-05-29T18:22:19.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:22:19.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:22:19.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:22:19.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:22:19.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:22:19.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:22:19.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:22:19.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:22:19.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:22:19.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:22:19.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:22:19.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:22:19.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:22:19.392 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:22:19.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:22:19.977 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:22:20.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:22:20.088 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:22:20.088 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:22:20.270 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:22:20.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:22:50.299 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:22:50.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:22:50.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:22:50.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:22:50.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:22:50.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:22:50.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T18:22:50.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:22:50.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-05-29T18:22:50.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:22:50.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:22:50.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:22:50.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-05-29T18:22:53.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-05-29T18:22:53.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:22:53.938 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:22:53.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:22:53.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:22:53.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:22:53.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:22:53.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:22:53.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:22:53.959 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:22:53.960 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:22:53.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:22:54.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:22:54.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:22:54.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:22:54.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:22:54.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:22:54.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:22:54.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:22:54.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:22:54.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:22:54.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:22:54.256 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:22:54.313 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:22:51
2026-05-29T18:22:54.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72540, datetime.datetime(2026, 5, 29, 18, 22, 51), datetime.datetime(2026, 5, 29, 18, 22, 51), 'salt', 9.13, 77.7, None, 11.4, 45.71, 3.69, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:22:54.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:22:54.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:22:54.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:22:51, diff=3.320359s, valid=True
2026-05-29T18:22:54.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:22:54.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:22:54.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:23:12, diff=-17.676775s, valid=True
2026-05-29T18:22:54.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:22:54.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:22:54.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:22:50, diff=4.332161s, valid=True
2026-05-29T18:22:54.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:22:54.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:22:54.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:22:54.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:22:54.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:22:54.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:22:54.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:23:12, diff=-17.664771s, valid=True
2026-05-29T18:22:54.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:22:54.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:22:54.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:22:54.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004416.335905s, valid=True
2026-05-29T18:22:54.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:22:54.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:22:54.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:22:54.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:22:54.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:22:54.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:22:54.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:22:54.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:22:54.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:22:54.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:22:54.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:22:54.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:22:54.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:22:54.662 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:22:54.913 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:22:55.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:22:55.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:22: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-05-29T18:22: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-05-29T18:22:55.632 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:22:55.633 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:23:25.663 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:23:25.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:23:25.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:23:25.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:23:25.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:23:26.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:23:26.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-05-29T18:23:26.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:23:26.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-05-29T18:23:26.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:23:26.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:23:26.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:23:26.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-05-29T18:23:28.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-05-29T18:23:28.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:23:28.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:23:28.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:23:28.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:23:29.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:23:29.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:23:29.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:23:29.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:23:29.008 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:23:29.008 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:23:29.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:23:29.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:23:29.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:23:29.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:23:29.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:23:29.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:23:29.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:23:29.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:23:29.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:23:29.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:23:29.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:23:29.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:23:29.336 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:23:22
2026-05-29T18:23:29.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72541, datetime.datetime(2026, 5, 29, 18, 23, 22), datetime.datetime(2026, 5, 29, 18, 23, 21), 'salt', 8.93, 78.26, None, 12.14, 53.99, 3.58, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:23:29.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:23:29.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:23:29.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:23:21, diff=8.342537s, valid=True
2026-05-29T18:23:29.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:23:29.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:23:29.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:23:12, diff=17.345409s, valid=True
2026-05-29T18:23:29.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:23:29.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:23:29.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:23:20, diff=9.35254s, valid=True
2026-05-29T18:23:29.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:23:29.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:23:29.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:23:29.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:23:29.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:23:29.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:23:29.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:23:12, diff=17.355716s, valid=True
2026-05-29T18:23:29.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:23:29.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:23:29.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:23:29.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004451.356374s, valid=True
2026-05-29T18:23:29.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:23:29.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:23:29.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:23:29.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:23:29.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:23:29.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:23:29.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:23:29.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:23:29.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:23:29.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:23:29.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:23:29.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:23:29.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:23:29.688 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:23:29.928 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:23:30.386 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:23:30.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:23:30.499 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:23:30.500 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:23:30.680 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:23:30.681 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:24:00.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:24:00.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:24:00.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:24:00.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:24:00.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:24:01.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:24:01.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-05-29T18:24:01.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:24:01.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-05-29T18:24:01.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:24:01.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:24:01.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:24:01.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-05-29T18:24:04.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-05-29T18:24:04.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:24:04.124 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:24:04.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:24:04.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:24:04.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:24:04.153 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:24:04.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:24:04.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:24:04.153 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:24:04.153 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:24:04.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:24:04.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:24:04.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:24:04.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:24:04.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:24:04.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:24:04.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:24:04.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:24:04.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:24:04.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:24:04.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:24:04.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:24:04.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:23:52
2026-05-29T18:24:04.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72542, datetime.datetime(2026, 5, 29, 18, 23, 52), datetime.datetime(2026, 5, 29, 18, 23, 52), 'salt', 8.83, 78.79, None, 13.3, 45.36, 3.47, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:24:04.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:24:04.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:24:04.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:23:52, diff=12.482592s, valid=True
2026-05-29T18:24:04.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:24:04.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:24:04.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:24:12, diff=-7.514539s, valid=True
2026-05-29T18:24:04.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:24:04.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:24:04.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:23:51, diff=13.492333s, valid=True
2026-05-29T18:24:04.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:24:04.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:24:04.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:24:04.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:24:04.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:24:04.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:24:04.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:24:12, diff=-7.504545s, valid=True
2026-05-29T18:24:04.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:24:04.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:24:04.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:24:04.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004486.496132s, valid=True
2026-05-29T18:24:04.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:24:04.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:24:04.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:24:04.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:24:04.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:24:04.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:24:04.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:24:04.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:24:04.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:24:04.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:24:04.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:24:04.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:24:04.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:24:04.839 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:24:05.055 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:24:05.406 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:24:05.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:24:05.509 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:24:05.509 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:24:05.688 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:24:05.688 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:24:35.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:24:35.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:24:35.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:24:36.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:24:36.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:24:36.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:24:36.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-05-29T18:24:36.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:24:36.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-05-29T18:24:36.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:24:36.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:24:36.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:24:36.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-05-29T18:24:39.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-05-29T18:24:39.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:24:39.183 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:24:39.183 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:24:39.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:24:39.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:24:39.203 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:24:39.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:24:39.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:24:39.204 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:24:39.204 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:24:39.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:24:39.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:24:39.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:24:39.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:24:39.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:24:39.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:24:39.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:24:39.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:24:39.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:24:39.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:24:39.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:24:39.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:24:39.514 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:24:23
2026-05-29T18:24:39.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72543, datetime.datetime(2026, 5, 29, 18, 24, 23), datetime.datetime(2026, 5, 29, 18, 24, 22), 'salt', 9.06, 78.92, None, 11.15, 47.7, 3.45, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:24:39.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:24:39.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:24:39.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:24:22, diff=17.520455s, valid=True
2026-05-29T18:24:39.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:24:39.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:24:39.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:24:12, diff=27.523368s, valid=True
2026-05-29T18:24:39.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:24:39.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:24:39.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:24:22, diff=17.530175s, valid=True
2026-05-29T18:24:39.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:24:39.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:24:39.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:24:39.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:24:39.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:24:39.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:24:39.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:24:12, diff=27.533309s, valid=True
2026-05-29T18:24:39.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:24:39.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:24:39.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:24:39.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004521.533995s, valid=True
2026-05-29T18:24:39.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:24:39.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:24:39.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:24:39.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:24:39.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:24:39.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:24:39.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:24:39.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:24:39.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:24:39.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:24:39.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:24:39.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:24:39.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:24:39.859 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:24:40.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:24:40.640 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:24:40.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:24:40.741 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:24:40.741 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:24:44.077 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:24:44.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:25:14.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:25:14.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:25:14.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:25:14.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:25:14.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:25:14.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:25:14.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-05-29T18:25:14.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:25:14.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-05-29T18:25:14.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:25:14.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:25:14.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:25:14.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T18:25:17.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-05-29T18:25:17.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:25:17.423 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:25:17.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:25:17.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:25:17.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:25:17.443 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:25:17.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:25:17.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:25:17.444 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:25:17.444 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:25:17.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:25:17.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:25:17.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:25:17.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:25:17.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:25:17.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:25:17.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:25:17.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:25:17.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:25:17.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:25:17.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:25:17.698 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:25:17.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:24:53
2026-05-29T18:25:17.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72544, datetime.datetime(2026, 5, 29, 18, 24, 53), datetime.datetime(2026, 5, 29, 18, 24, 52), 'salt', 9.03, 78.76, None, 13.59, 45.73, 3.49, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:25:17.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:25:17.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:25:17.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:24:52, diff=25.764747s, valid=True
2026-05-29T18:25:17.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:25:17.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:25:17.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:25:12, diff=5.768553s, valid=True
2026-05-29T18:25:17.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:25:17.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:25:17.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:24:51, diff=26.77838s, valid=True
2026-05-29T18:25:17.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:25:17.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:25:17.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:25:17.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:25:17.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:25:17.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:25:17.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:25:12, diff=5.782806s, valid=True
2026-05-29T18:25:17.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:25:17.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:25:17.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:25:17.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004559.783756s, valid=True
2026-05-29T18:25:17.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:25:17.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:25:17.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:25:17.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:25:17.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:25:17.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:25:17.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:25:17.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:25:17.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:25:17.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:25:18.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:25:18.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:25:18.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:25:18.166 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:25:18.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:25:18.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:25:18.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:25:18.871 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:25:18.872 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:25:19.141 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:25:19.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:25:49.151 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:25:49.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:25:49.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:25:49.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:25:49.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:25:49.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:25:49.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T18:25:49.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:25:49.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T18:25:49.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:25:49.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:25:49.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:25:49.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-05-29T18:25:52.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-05-29T18:25:52.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:25:52.683 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:25:52.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:25:52.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:25:52.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:25:52.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:25:52.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:25:52.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:25:52.704 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:25:52.704 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:25:52.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:25:52.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:25:52.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:25:52.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T18:25:52.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:25:52.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T18:25:52.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:25:52.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T18:25:52.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:25:52.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:25:52.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:25:52.957 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:25:53.015 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:25:23
2026-05-29T18:25:53.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72545, datetime.datetime(2026, 5, 29, 18, 25, 23), datetime.datetime(2026, 5, 29, 18, 25, 22), 'salt', 9.13, 78.59, None, 14.33, 56.24, 3.52, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:25:53.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:25:53.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:25:53.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:25:22, diff=31.022121s, valid=True
2026-05-29T18:25:53.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:25:53.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T18:25:53.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:25:12, diff=41.025053s, valid=True
2026-05-29T18:25:53.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:25:53.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T18:25:53.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:25:21, diff=32.031933s, valid=True
2026-05-29T18:25:53.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:25:53.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:25:53.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:25:53.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:25:53.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:25:53.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T18:25:53.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:25:12, diff=41.035064s, valid=True
2026-05-29T18:25:53.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:25:53.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:25:53.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:25:53.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004595.03577s, valid=True
2026-05-29T18:25:53.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:25:53.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:25:53.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:25:53.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:25:53.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:25:53.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:25:53.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:25:53.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:25:53.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:25:53.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:25:53.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:25:53.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:25:53.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:25:53.430 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:25:53.651 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:25:54.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:25:54.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:25:54.117 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:25:54.117 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:25:54.205 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:25:54.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:26:24.236 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:26:24.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:26:24.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:26:24.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:26:24.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:26:24.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:26: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-05-29T18:26:24.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:26:24.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-05-29T18:26:24.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:26:24.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:26:24.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:26:24.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-05-29T18:26:27.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-05-29T18:26:27.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:26:27.562 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:26:27.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:26:27.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:26:27.582 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:26:27.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:26:27.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:26:27.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:26:27.583 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:26:27.583 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:26:27.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:26:27.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:26:27.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:26:27.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:26:27.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:26:27.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:26:27.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:26:27.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:26:27.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:26:27.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:26:27.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:26:27.846 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:26:27.904 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:26:24
2026-05-29T18:26:27.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72547, datetime.datetime(2026, 5, 29, 18, 26, 24), datetime.datetime(2026, 5, 29, 18, 26, 23), 'salt', 9.29, 76.6, None, 14.43, 39.37, 3.89, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:26:27.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:26:27.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:26:27.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:26:23, diff=4.911064s, valid=True
2026-05-29T18:26:27.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:26:27.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:26:27.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:26:12, diff=15.913908s, valid=True
2026-05-29T18:26:27.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:26:27.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:26:27.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:26:22, diff=5.920735s, valid=True
2026-05-29T18:26:27.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:26:27.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:26:27.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:26:27.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:26:27.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:26:27.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:26:27.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:26:12, diff=15.923836s, valid=True
2026-05-29T18:26:27.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:26:27.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:26:27.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:26:27.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004629.92451s, valid=True
2026-05-29T18:26:27.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:26:27.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:26:27.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:26:27.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:26:27.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:26:27.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:26:27.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:26:27.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:26:28.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:26:28.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:26:28.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:26:28.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:26:28.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:26:28.241 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:26:28.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:26:28.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:26:28.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:26:28.915 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:26:28.915 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:26:29.142 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:26:29.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:26:59.161 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:26:59.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:26:59.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:26:59.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:26:59.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:26:59.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:26:59.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-05-29T18:26:59.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:26:59.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-05-29T18:26:59.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:26:59.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:26:59.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:26:59.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T18:27:02.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T18:27:02.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:27:02.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:27:02.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:27:02.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:27:02.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:27:02.790 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:27:02.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:27:02.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:27:02.791 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:27:02.791 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:27:02.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:27:02.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:27:02.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:27:02.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:27:02.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:27:03.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:27:03.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:27:03.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:27:03.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:27:03.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:27:03.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:27:03.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:27:03.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:26:54
2026-05-29T18:27:03.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72548, datetime.datetime(2026, 5, 29, 18, 26, 54), datetime.datetime(2026, 5, 29, 18, 26, 53), 'salt', 9.46, 75.18, None, 15.21, 46.72, 4.17, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:27:03.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:27:03.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:27:03.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:26:53, diff=10.125817s, valid=True
2026-05-29T18:27:03.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:27:03.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:27:03.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:27:12, diff=-8.869706s, valid=True
2026-05-29T18:27:03.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:27:03.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:27:03.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:26:52, diff=11.13984s, valid=True
2026-05-29T18:27:03.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:27:03.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:27:03.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:27:03.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:27:03.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:27:03.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:27:03.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:27:12, diff=-8.857093s, valid=True
2026-05-29T18:27:03.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:27:03.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:27:03.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:27:03.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004665.14357s, valid=True
2026-05-29T18:27:03.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:27:03.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:27:03.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:27:03.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:27:03.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:27:03.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:27:03.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:27:03.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:27:03.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:27:03.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:27:03.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:27:03.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:27:03.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:27:03.543 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:27:03.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:27:04.225 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:27:04.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:27:04.385 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:27:04.385 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:27:04.475 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:27:04.475 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:27:34.488 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:27:34.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:27:34.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:27:34.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:27:34.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:27:34.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:27:34.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-05-29T18:27:34.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:27:34.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-05-29T18:27:34.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:27:34.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:27:34.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:27:34.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-05-29T18:27:37.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-05-29T18:27:37.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:27:37.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:27:37.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:27:37.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:27:37.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:27:37.870 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:27:37.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:27:37.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:27:37.871 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:27:37.871 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:27:37.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:27:37.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:27:37.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:27:38.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:27:38.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:27:38.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:27:38.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:27:38.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:27:38.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:27:38.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:27:38.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:27:38.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:27:38.202 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:27:24
2026-05-29T18:27:38.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72549, datetime.datetime(2026, 5, 29, 18, 27, 24), datetime.datetime(2026, 5, 29, 18, 27, 24), 'salt', 9.53, 74.68, None, 13.69, 48.01, 4.27, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:27:38.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:27:38.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:27:38.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:27:24, diff=14.208727s, valid=True
2026-05-29T18:27:38.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:27:38.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:27:38.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:27:12, diff=26.211631s, valid=True
2026-05-29T18:27:38.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:27:38.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:27:38.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:27:23, diff=15.218489s, valid=True
2026-05-29T18:27:38.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:27:38.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:27:38.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:27:38.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:27:38.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:27:38.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:27:38.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:27:12, diff=26.221577s, valid=True
2026-05-29T18:27:38.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:27:38.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:27:38.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:27:38.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004700.222247s, valid=True
2026-05-29T18:27:38.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:27:38.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:27:38.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:27:38.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:27:38.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:27:38.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:27:38.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:27:38.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:27:38.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:27:38.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:27:38.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:27:38.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:27:38.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:27:38.538 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:27:38.761 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:27:39.117 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:27:39.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:27:39.219 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:27:39.219 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:27:39.306 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:27:39.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:28:09.309 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:28:09.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:28:09.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:28:09.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:28:09.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:28:10.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:28:10.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-05-29T18:28:10.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:28:10.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-05-29T18:28:10.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:28:10.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:28:10.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:28:10.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-05-29T18:28:12.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T18:28:12.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:28:12.966 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:28:12.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:28:12.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:28:12.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:28:12.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:28:12.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:28:12.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:28:12.987 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:28:12.987 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:28:12.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:28:13.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:28:13.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:28:13.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:28:13.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:28:13.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:28:13.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:28:13.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:28:13.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:28:13.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:28:13.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:28:13.304 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:28:13.366 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:27:54
2026-05-29T18:28:13.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72550, datetime.datetime(2026, 5, 29, 18, 27, 54), datetime.datetime(2026, 5, 29, 18, 27, 54), 'salt', 9.53, 73.85, None, 14.01, 47.98, 4.43, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:28:13.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:28:13.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:28:13.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:27:54, diff=19.37239s, valid=True
2026-05-29T18:28:13.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:28:13.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:28:13.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:28:12, diff=1.375225s, valid=True
2026-05-29T18:28:13.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:28:13.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:28:13.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:27:53, diff=20.381924s, valid=True
2026-05-29T18:28:13.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:28:13.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:28:13.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:28:13.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:28:13.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:28:13.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:28:13.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:28:12, diff=1.38495s, valid=True
2026-05-29T18:28:13.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:28:13.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:28:13.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:28:13.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004735.385601s, valid=True
2026-05-29T18:28:13.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:28:13.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:28:13.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:28:13.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:28:13.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:28:13.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:28:13.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:28:13.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:28:13.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:28:13.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:28:13.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:28:13.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:28:13.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:28:13.701 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:28:13.917 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:28:14.269 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:28:14.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:28:14.372 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:28:14.372 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:28:14.554 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:28:14.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:28:44.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:28:44.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:28:44.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:28:45.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:28:45.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:28:45.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:28:45.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T18:28:45.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:28:45.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-05-29T18:28:45.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:28:45.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:28:45.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:28:45.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-05-29T18:28:48.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-05-29T18:28:48.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:28:48.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:28:48.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:28:48.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:28:48.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:28:48.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:28:48.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:28:48.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:28:48.182 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:28:48.182 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:28:48.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:28:48.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:28:48.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:28:48.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:28:48.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:28:48.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:28:48.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:28:48.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:28:48.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:28:48.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:28:48.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:28:48.430 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:28:48.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:28:24
2026-05-29T18:28:48.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72551, datetime.datetime(2026, 5, 29, 18, 28, 24), datetime.datetime(2026, 5, 29, 18, 28, 24), 'salt', 9.69, 73.09, None, 13.09, 52.58, 4.58, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:28:48.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:28:48.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:28:48.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:28:24, diff=24.493907s, valid=True
2026-05-29T18:28:48.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:28:48.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:28:48.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:28:12, diff=36.496698s, valid=True
2026-05-29T18:28:48.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:28:48.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:28:48.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:28:24, diff=24.503273s, valid=True
2026-05-29T18:28:48.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:28:48.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:28:48.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:28:48.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:28:48.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:28:48.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:28:48.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:28:12, diff=36.506263s, valid=True
2026-05-29T18:28:48.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:28:48.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:28:48.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:28:48.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004770.506927s, valid=True
2026-05-29T18:28:48.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:28:48.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:28:48.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:28:48.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:28:48.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:28:48.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:28:48.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:28:48.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:28:48.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:28:48.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:28:48.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:28:48.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:28:48.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:28:48.823 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:28:49.040 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:28:49.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:28:49.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:28:49.496 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:28:49.496 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:28:49.697 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:28:49.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:29:19.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:29:19.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:29:19.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:29:20.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:29:20.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:29:20.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:29:20.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-05-29T18:29:20.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:29:20.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-05-29T18:29:20.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:29:20.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:29:20.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:29:20.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-05-29T18:29:23.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T18:29:23.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:29:23.494 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:29:23.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:29:23.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:29:23.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:29:23.515 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:29:23.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:29:23.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:29:23.516 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:29:23.516 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:29:23.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:29:23.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:29:23.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:29:23.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:29:23.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:29:23.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:29:23.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:29:23.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:29:23.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:29:23.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:29:23.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:29:23.771 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:29:23.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:28:55
2026-05-29T18:29:23.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72552, datetime.datetime(2026, 5, 29, 18, 28, 55), datetime.datetime(2026, 5, 29, 18, 28, 54), 'salt', 9.69, 72.29, None, 12.81, 46.65, 4.73, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:29:23.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:29:23.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:29:23.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:28:54, diff=29.836299s, valid=True
2026-05-29T18:29:23.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:29:23.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:29:23.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:29:12, diff=11.840492s, valid=True
2026-05-29T18:29:23.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:29:23.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:29:23.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:28:54, diff=29.85064s, valid=True
2026-05-29T18:29:23.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:29:23.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:29:23.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:29:23.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:29:23.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:29:23.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:29:23.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:29:12, diff=11.855303s, valid=True
2026-05-29T18:29:23.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:29:23.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:29:23.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:29:23.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004805.856372s, valid=True
2026-05-29T18:29:23.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:29:23.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:29:23.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:29:23.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:29:23.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:29:23.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:29:23.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:29:23.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:29:23.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:29:23.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:29:24.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:29:24.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:29:24.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:29:24.182 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:29:24.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:29:24.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:29:24.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:29:24.875 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:29:24.875 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:29:25.123 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:29:25.123 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:29:55.138 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:29:55.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:29:55.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:29:55.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:29:55.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:29:55.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:29:55.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-05-29T18:29:55.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:29:55.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-05-29T18:29:55.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:29:55.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:29:55.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:29:55.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-05-29T18:29:58.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-05-29T18:29:58.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:29:58.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:29:58.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:29:58.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:29:58.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:29:58.546 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:29:58.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:29:58.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:29:58.546 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:29:58.546 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:29:58.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:29:58.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:29:58.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:29:58.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:29:58.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:29:58.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:29:58.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:29:58.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:29:58.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:29:58.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:29:58.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:29:58.797 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:29:58.855 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:29:57
2026-05-29T18:29:58.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72554, datetime.datetime(2026, 5, 29, 18, 29, 57), datetime.datetime(2026, 5, 29, 18, 29, 55), 'salt', 9.69, 71.8, None, 12.92, 48.88, 4.83, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:29:58.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:29:58.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:29:58.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:29:55, diff=3.861452s, valid=True
2026-05-29T18:29:58.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:29:58.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:29:58.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:30:12, diff=-13.135655s, valid=True
2026-05-29T18:29:58.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:29:58.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:29:58.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:29:54, diff=4.871103s, valid=True
2026-05-29T18:29:58.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:29:58.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:29:58.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:29:58.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:29:58.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:29:58.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:29:58.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:30:12, diff=-13.125794s, valid=True
2026-05-29T18:29:58.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:29:58.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:29:58.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:29:58.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004840.874888s, valid=True
2026-05-29T18:29:58.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:29:58.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:29:58.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:29:58.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:29:58.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:29:58.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:29:58.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:29:58.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:29:58.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:29:59.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:29:59.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:29:59.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:29:59.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:29:59.189 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:29:59.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:29:59.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:29:59.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:29:59.946 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:29:59.946 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:30:00.195 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:30:00.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:30:30.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:30:30.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:30:30.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:30:30.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:30:30.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:30:30.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:30:30.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-05-29T18:30:30.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:30:30.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T18:30:30.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:30:30.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:30:30.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:30:30.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-05-29T18:30:33.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-05-29T18:30:33.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:30:33.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:30:33.585 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:30:33.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:30:33.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:30:33.605 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:30:33.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:30:33.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:30:33.606 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:30:33.606 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:30:33.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:30:33.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:30:33.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:30:33.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:30:33.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:30:33.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:30:33.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:30:33.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:30:33.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:30:33.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:30:33.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:30:33.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:30:33.921 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:30:27
2026-05-29T18:30:33.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72555, datetime.datetime(2026, 5, 29, 18, 30, 27), datetime.datetime(2026, 5, 29, 18, 30, 27), 'salt', 9.63, 71.43, None, 15.21, 44.19, 4.91, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:30:33.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:30:33.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:30:33.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:30:27, diff=6.928008s, valid=True
2026-05-29T18:30:33.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:30:33.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:30:33.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:30:12, diff=21.930866s, valid=True
2026-05-29T18:30:33.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:30:33.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:30:33.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:30:24, diff=9.937658s, valid=True
2026-05-29T18:30:33.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:30:33.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:30:33.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:30:33.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:30:33.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:30:33.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:30:33.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:30:12, diff=21.940726s, valid=True
2026-05-29T18:30:33.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:30:33.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:30:33.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:30:33.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004875.941408s, valid=True
2026-05-29T18:30:33.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:30:33.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:30:33.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:30:33.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:30:33.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:30:34.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:30:34.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:30:34.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:30:34.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:30:34.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:30:34.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:30:34.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:30:34.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:30:34.264 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:30:34.482 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:30:34.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:30:34.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:30:34.941 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:30:34.941 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:30:35.198 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:30:35.198 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:31:05.228 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:31:05.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:31:05.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:31:05.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:31:05.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:31:05.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:31:05.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T18:31:05.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:31:05.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-05-29T18:31:05.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:31:05.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:31:05.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:31:05.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-05-29T18:31: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-05-29T18:31:08.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:31:08.856 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:31:08.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:31:08.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:31:08.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:31:08.877 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:31:08.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:31:08.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:31:08.877 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:31:08.877 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:31:08.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:31:08.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:31:08.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:31:09.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:31:09.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:31:09.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:31:09.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:31:09.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:31:09.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:31:09.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:31:09.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:31:09.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:31:09.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:30:57
2026-05-29T18:31:09.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72556, datetime.datetime(2026, 5, 29, 18, 30, 57), datetime.datetime(2026, 5, 29, 18, 30, 57), 'salt', 9.66, 71.4, None, 15.32, 53.64, 4.91, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:31:09.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:31:09.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:31:09.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:30:57, diff=12.197295s, valid=True
2026-05-29T18:31:09.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:31:09.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:31:09.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:31:12, diff=-2.79985s, valid=True
2026-05-29T18:31:09.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:31:09.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:31:09.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:30:55, diff=14.20678s, valid=True
2026-05-29T18:31:09.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:31:09.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:31:09.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:31:09.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:31:09.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:31:09.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:31:09.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:31:12, diff=-2.790172s, valid=True
2026-05-29T18:31:09.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:31:09.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:31:09.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:31:09.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004911.210488s, valid=True
2026-05-29T18:31:09.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:31:09.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:31:09.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:31:09.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:31:09.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:31:09.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:31:09.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:31:09.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:31:09.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:31:09.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:31:09.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:31:09.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:31:09.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:31:09.530 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:31:09.825 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:31:10.205 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:31:10.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:31:10.308 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:31:10.308 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:31:10.496 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:31:10.496 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:31:40.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:31:40.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:31:40.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:31:40.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:31:40.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:31:41.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:31:41.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-05-29T18:31:41.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:31:41.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-05-29T18:31:41.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:31:41.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:31:41.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:31:41.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-05-29T18:31:44.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-05-29T18:31:44.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:31:44.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:31:44.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:31:44.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:31:44.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:31:44.719 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:31:44.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:31:44.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:31:44.720 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:31:44.720 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:31:44.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:31:44.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:31:44.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:31:44.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:31:44.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:31:44.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:31:44.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:31:44.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:31:44.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:31:44.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:31:44.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:31:44.972 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:31:45.031 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:31:28
2026-05-29T18:31:45.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72557, datetime.datetime(2026, 5, 29, 18, 31, 28), datetime.datetime(2026, 5, 29, 18, 31, 27), 'salt', 9.69, 71.2, None, 13.27, 56.5, 4.95, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:31:45.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:31:45.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:31:45.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:31:27, diff=18.038053s, valid=True
2026-05-29T18:31:45.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:31:45.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:31:45.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:31:12, diff=33.040897s, valid=True
2026-05-29T18:31:45.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:31:45.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:31:45.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:31:25, diff=20.047538s, valid=True
2026-05-29T18:31:45.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:31:45.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:31:45.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:31:45.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:31:45.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:31:45.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:31:45.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:31:12, diff=33.050624s, valid=True
2026-05-29T18:31:45.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:31:45.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:31:45.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:31:45.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004947.051286s, valid=True
2026-05-29T18:31:45.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:31:45.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:31:45.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:31:45.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:31:45.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:31:45.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:31:45.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:31:45.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:31:45.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:31:45.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:31:45.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:31:45.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:31:45.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:31:45.368 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:31:45.586 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:31:45.938 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:31:46.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:31:46.042 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:31:46.042 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:31:46.228 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:31:46.228 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:32:16.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:32:16.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:32:16.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:32:16.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:32:16.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:32:16.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:32:16.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-05-29T18:32:16.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:32:16.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-05-29T18:32:16.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:32:16.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:32:16.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:32:16.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-05-29T18:32:20.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-05-29T18:32:20.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:32:20.090 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:32:20.090 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:32:20.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:32:20.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:32:20.112 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:32:20.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:32:20.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:32:20.112 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:32:20.112 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:32:20.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:32:20.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:32:20.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:32:20.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:32:20.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:32:20.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:32:20.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:32:20.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:32:20.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:32:20.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:32:20.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:32:20.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:32:20.427 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:31:58
2026-05-29T18:32:20.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72558, datetime.datetime(2026, 5, 29, 18, 31, 58), datetime.datetime(2026, 5, 29, 18, 31, 57), 'salt', 9.69, 71.3, None, 12.28, 48.64, 4.93, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:32:20.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:32:20.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:32:20.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:31:57, diff=23.43392s, valid=True
2026-05-29T18:32:20.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:32:20.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:32:20.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:32:12, diff=8.43674s, valid=True
2026-05-29T18:32:20.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:32:20.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:32:20.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:31:55, diff=25.443514s, valid=True
2026-05-29T18:32:20.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:32:20.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:32:20.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:32:20.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:32:20.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:32:20.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:32:20.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:32:12, diff=8.446531s, valid=True
2026-05-29T18:32:20.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:32:20.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:32:20.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:32:20.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1004982.447214s, valid=True
2026-05-29T18:32:20.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:32:20.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:32:20.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:32:20.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:32:20.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:32:20.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:32:20.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:32:20.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:32:20.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:32:20.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:32:20.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:32:20.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:32:20.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:32:20.827 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:32:21.041 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:32:21.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:32:21.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:32:21.491 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:32:21.491 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:32:21.754 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:32:21.754 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:32:51.784 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:32:51.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:32:51.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:32:52.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:32:52.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:32:52.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:32:52.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-05-29T18:32:52.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:32: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-05-29T18:32:52.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:32:52.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:32:52.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:32: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-05-29T18:32:55.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-05-29T18:32:55.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:32:55.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:32:55.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:32:55.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:32:55.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:32:55.113 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:32:55.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:32:55.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:32:55.114 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:32:55.114 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:32:55.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:32:55.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:32:55.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:32:55.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:32:55.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:32:55.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:32:55.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:32:55.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:32:55.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:32:55.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:32:55.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:32:55.368 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:32:55.426 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:32:28
2026-05-29T18:32:55.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72559, datetime.datetime(2026, 5, 29, 18, 32, 28), datetime.datetime(2026, 5, 29, 18, 32, 28), 'salt', 9.66, 71.73, None, 13.55, 49.51, 4.85, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:32:55.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:32:55.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:32:55.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:32:28, diff=27.432567s, valid=True
2026-05-29T18:32:55.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:32:55.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:32:55.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:32:12, diff=43.435441s, valid=True
2026-05-29T18:32:55.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:32:55.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:32:55.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:32:26, diff=29.442237s, valid=True
2026-05-29T18:32:55.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:32:55.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:32:55.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:32:55.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:32:55.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:32:55.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:32:55.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:32:12, diff=43.445277s, valid=True
2026-05-29T18:32:55.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:32:55.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:32:55.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:32:55.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005017.445968s, valid=True
2026-05-29T18:32:55.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:32:55.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:32:55.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:32:55.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:32:55.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:32:55.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:32:55.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:32:55.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:32:55.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:32:55.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:32:55.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:32:55.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:32:55.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:32:55.764 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:32:55.984 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:32:56.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:32:56.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:32:56.442 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:32:56.442 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:32:56.630 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:32:56.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:33:26.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:33:26.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:33:26.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:33:26.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:33:26.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:33:27.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:33:27.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-05-29T18:33:27.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:33:27.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-05-29T18:33:27.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:33:27.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:33:27.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:33:27.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T18:33:30.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-05-29T18:33:30.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:33:30.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:33:30.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:33:30.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:33:30.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:33:30.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:33:30.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:33:30.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:33:30.948 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:33:30.948 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:33:30.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:33:31.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:33:31.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:33:31.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:33:31.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:33:31.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:33:31.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:33:31.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:33:31.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:33:31.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:33:31.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:33:31.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:33:31.265 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:33:28
2026-05-29T18:33:31.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72561, datetime.datetime(2026, 5, 29, 18, 33, 28), datetime.datetime(2026, 5, 29, 18, 33, 28), 'salt', 9.49, 72.76, None, 13.9, 48.78, 4.63, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:33:31.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:33:31.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:33:31.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:33:28, diff=3.271998s, valid=True
2026-05-29T18:33:31.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:33:31.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:33:31.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:33:12, diff=19.274871s, valid=True
2026-05-29T18:33:31.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:33:31.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:33:31.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:33:28, diff=3.281664s, valid=True
2026-05-29T18:33:31.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:33:31.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:33:31.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:33:31.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:33:31.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:33:31.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:33:31.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:33:12, diff=19.28472s, valid=True
2026-05-29T18:33:31.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:33:31.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:33:31.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:33:31.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005053.28538s, valid=True
2026-05-29T18:33:31.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:33:31.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:33:31.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:33:31.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:33:31.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:33:31.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:33:31.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:33:31.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:33:31.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:33:31.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:33:31.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:33:31.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:33:31.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:33:31.686 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:33:31.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:33:32.267 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:33:32.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:33:32.369 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:33:32.369 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:33:32.617 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:33:32.617 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:34:02.633 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:34:02.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:34:02.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:34:03.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:34:03.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:34:03.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:34:03.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-05-29T18:34:03.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:34:03.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-05-29T18:34:03.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:34:03.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:34:03.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:34:03.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-05-29T18:34:06.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-05-29T18:34:06.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:34:06.168 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:34:06.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:34:06.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:34:06.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:34:06.189 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:34:06.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:34:06.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:34:06.190 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:34:06.190 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:34:06.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:34:06.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:34:06.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:34:06.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:34:06.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:34:06.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:34:06.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:34:06.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:34:06.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:34:06.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:34:06.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:34:06.446 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:34:06.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:33:59
2026-05-29T18:34:06.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72562, datetime.datetime(2026, 5, 29, 18, 33, 59), datetime.datetime(2026, 5, 29, 18, 33, 58), 'salt', 9.49, 73.22, None, 15.07, 48.62, 4.54, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:34:06.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:34:06.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:34:06.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:33:58, diff=8.51083s, valid=True
2026-05-29T18:34:06.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:34:06.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:34:06.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:34:12, diff=-5.486328s, valid=True
2026-05-29T18:34:06.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:34:06.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:34:06.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:33:57, diff=9.520317s, valid=True
2026-05-29T18:34:06.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:34:06.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:34:06.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:34:06.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:34:06.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:34:06.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:34:06.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:34:12, diff=-5.47662s, valid=True
2026-05-29T18:34:06.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:34:06.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:34:06.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:34:06.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005088.524047s, valid=True
2026-05-29T18:34:06.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:34:06.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:34:06.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:34:06.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:34:06.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:34:06.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:34:06.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:34:06.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:34:06.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:34:06.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:34:06.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:34:06.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:34:06.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:34:06.838 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:34:07.052 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:34:07.400 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:34:07.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:34:07.509 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:34:07.509 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:34:07.702 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:34:07.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:34:37.732 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:34:37.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:34:37.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:34:38.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:34:38.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:34:38.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:34:38.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T18:34:38.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:34:38.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-05-29T18:34:38.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:34:38.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:34:38.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:34:38.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-05-29T18:34:41.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-05-29T18:34:41.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:34:41.135 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:34:41.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:34:41.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:34:41.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:34:41.156 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:34:41.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:34:41.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:34:41.157 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:34:41.157 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:34:41.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:34:41.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:34:41.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:34:41.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:34:41.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:34:41.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:34:41.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:34:41.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:34:41.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:34:41.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:34:41.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:34:41.477 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:34:41.540 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:34:29
2026-05-29T18:34:41.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72563, datetime.datetime(2026, 5, 29, 18, 34, 29), datetime.datetime(2026, 5, 29, 18, 34, 29), 'salt', 9.43, 73.69, None, 15.17, 47.07, 4.45, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:34:41.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:34:41.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:34:41.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:34:29, diff=12.546476s, valid=True
2026-05-29T18:34:41.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:34:41.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:34:41.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:34:12, diff=29.549305s, valid=True
2026-05-29T18:34:41.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:34:41.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:34:41.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:34:27, diff=14.555958s, valid=True
2026-05-29T18:34:41.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:34:41.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:34:41.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:34:41.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:34:41.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:34:41.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:34:41.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:34:12, diff=29.558938s, valid=True
2026-05-29T18:34:41.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:34:41.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:34:41.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:34:41.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005123.55959s, valid=True
2026-05-29T18:34:41.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:34:41.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:34:41.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:34:41.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:34:41.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:34:41.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:34:41.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:34:41.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:34:41.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:34:41.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:34:41.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:34:41.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:34:41.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:34:41.872 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:34:42.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:34:42.433 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:34:42.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:34:42.534 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:34:42.534 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:34:42.773 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:34:42.773 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:35:12.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:35:12.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:35:12.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:35:13.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:35:13.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:35:13.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:35:13.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-05-29T18:35:13.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:35:13.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-05-29T18:35:13.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:35:13.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:35:13.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:35:13.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-05-29T18:35:16.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-05-29T18:35:16.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:35:16.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:35:16.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:35:16.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:35:16.126 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:35:16.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:35:16.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:35:16.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:35:16.127 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:35:16.127 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:35:16.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:35:16.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:35:16.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:35:16.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:35:16.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:35:16.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:35:16.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:35:16.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:35:16.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:35:16.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:35:16.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:35:16.388 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:35:16.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:34:59
2026-05-29T18:35:16.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72564, datetime.datetime(2026, 5, 29, 18, 34, 59), datetime.datetime(2026, 5, 29, 18, 34, 59), 'salt', 9.46, 73.86, None, 13.76, 52.26, 4.42, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:35:16.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:35:16.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:35:16.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:34:59, diff=17.453779s, valid=True
2026-05-29T18:35:16.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:35:16.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:35:16.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:35:12, diff=4.456661s, valid=True
2026-05-29T18:35:16.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:35:16.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:35:16.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:34:57, diff=19.463324s, valid=True
2026-05-29T18:35:16.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:35:16.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:35:16.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:35:16.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:35:16.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:35:16.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:35:16.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:35:12, diff=4.466384s, valid=True
2026-05-29T18:35:16.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:35:16.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:35:16.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:35:16.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005158.467056s, valid=True
2026-05-29T18:35:16.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:35:16.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:35:16.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:35:16.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:35:16.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:35:16.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:35:16.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:35:16.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:35:16.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:35:16.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:35:16.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:35:16.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:35:16.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:35:16.781 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:35:16.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:35:17.344 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:35:17.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:35:17.446 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:35:17.446 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:35:17.532 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:35:17.532 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:35:47.562 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:35:47.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:35:47.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:35:47.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:35:47.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:35:48.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:35:48.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-05-29T18:35:48.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:35:48.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-05-29T18:35:48.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:35:48.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:35:48.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:35:48.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-05-29T18:35:50.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-05-29T18:35:50.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:35:50.892 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:35:50.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:35:50.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:35:50.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:35:50.912 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:35:50.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:35:50.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:35:50.912 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:35:50.913 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:35:50.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:35:50.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:35:50.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:35:51.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:35:51.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:35:51.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:35:51.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:35:51.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:35:51.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:35:51.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:35:51.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:35:51.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:35:51.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:35:29
2026-05-29T18:35:51.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72565, datetime.datetime(2026, 5, 29, 18, 35, 29), datetime.datetime(2026, 5, 29, 18, 35, 29), 'salt', 9.33, 75.48, None, 14.33, 51.32, 4.1, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:35:51.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:35:51.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:35:51.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:35:29, diff=22.25323s, valid=True
2026-05-29T18:35:51.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:35:51.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:35:51.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:35:12, diff=39.25612s, valid=True
2026-05-29T18:35:51.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:35:51.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:35:51.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:35:27, diff=24.26295s, valid=True
2026-05-29T18:35:51.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:35:51.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:35:51.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:35:51.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:35:51.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:35:51.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:35:51.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:35:12, diff=39.266046s, valid=True
2026-05-29T18:35:51.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:35:51.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:35:51.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:35:51.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005193.26672s, valid=True
2026-05-29T18:35:51.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:35:51.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:35:51.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:35:51.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:35:51.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:35:51.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:35:51.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:35:51.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:35:51.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:35:51.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:35:51.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:35:51.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:35:51.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:35:51.684 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:35:51.931 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:35:52.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:35:52.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:35:52.393 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:35:52.393 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:35:52.579 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:35:52.579 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:36:22.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:36:22.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:36:22.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:36:23.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:36:23.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:36:23.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:36:23.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-05-29T18:36:23.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:36:23.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-05-29T18:36:23.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:36:23.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:36:23.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:36:23.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-05-29T18:36:26.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-05-29T18:36:26.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:36:26.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:36:26.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:36:26.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:36:26.139 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:36:26.139 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:36:26.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:36:26.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:36:26.139 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:36:26.140 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:36:26.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:36:26.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:36:26.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:36:26.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:36:26.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:36:26.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:36:26.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:36:26.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:36:26.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:36:26.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:36:26.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:36:26.400 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:36:26.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:36:00
2026-05-29T18:36:26.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72566, datetime.datetime(2026, 5, 29, 18, 36), datetime.datetime(2026, 5, 29, 18, 35, 59), 'salt', 9.13, 76.14, None, 13.27, 43.44, 3.97, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:36:26.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:36:26.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:36:26.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:35:59, diff=27.465071s, valid=True
2026-05-29T18:36:26.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:36:26.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:36:26.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:36:12, diff=14.468019s, valid=True
2026-05-29T18:36:26.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:36:26.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:36:26.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:35:58, diff=28.47471s, valid=True
2026-05-29T18:36:26.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:36:26.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:36:26.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:36:26.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:36:26.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:36:26.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:36:26.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:36:12, diff=14.477792s, valid=True
2026-05-29T18:36:26.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:36:26.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:36:26.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:36:26.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005228.47845s, valid=True
2026-05-29T18:36:26.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:36:26.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:36:26.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:36:26.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:36:26.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:36:26.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:36:26.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:36:26.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:36:26.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:36:26.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:36:26.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:36:26.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:36:26.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:36:26.816 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:36:27.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:36:27.472 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:36:27.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:36:27.577 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:36:27.577 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:36:27.759 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:36:27.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:36:57.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:36:57.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:36:57.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:36:58.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:36:58.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:36:58.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:36:58.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-05-29T18:36:58.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:36:58.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-05-29T18:36:58.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:36:58.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:36:58.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:36:58.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-05-29T18:37:01.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-05-29T18:37:01.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:37:01.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:37:01.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:37:01.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:37:01.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:37:01.409 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:37:01.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:37:01.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:37:01.410 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:37:01.410 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:37:01.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:37:01.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:37:01.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:37:01.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:37:01.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:37:01.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:37:01.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:37:01.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:37:01.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:37:01.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:37:01.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:37:01.670 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:37:01.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:37:00
2026-05-29T18:37:01.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72568, datetime.datetime(2026, 5, 29, 18, 37), datetime.datetime(2026, 5, 29, 18, 37), 'salt', 9.07, 77.27, None, 14.05, 53.95, 3.76, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:37:01.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:37:01.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:37:01.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:37:00, diff=1.735206s, valid=True
2026-05-29T18:37:01.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:37:01.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:37:01.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:37:12, diff=-10.261935s, valid=True
2026-05-29T18:37:01.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:37:01.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:37:01.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:36:59, diff=2.74478s, valid=True
2026-05-29T18:37:01.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:37:01.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:37:01.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:37:01.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:37:01.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:37:01.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:37:01.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:37:12, diff=-10.252181s, valid=True
2026-05-29T18:37:01.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:37:01.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:37:01.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:37:01.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005263.74847s, valid=True
2026-05-29T18:37:01.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:37:01.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:37:01.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:37:01.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:37:01.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:37:01.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:37:01.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:37:01.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:37:01.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:37:01.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:37:01.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:37:01.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:37:02.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:37:02.062 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:37:02.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:37:02.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:37:02.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:37:02.706 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:37:02.706 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:37:03.102 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:37:03.103 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:37:33.133 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:37:33.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:37:33.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:37:33.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:37:33.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:37:33.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:37:33.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-05-29T18:37:33.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:37:33.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-05-29T18:37:33.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:37:33.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:37:33.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:37:33.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-05-29T18:37:36.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-05-29T18:37:36.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:37:36.241 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:37:36.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:37:36.248 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:37:36.260 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:37:36.260 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:37:36.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:37:36.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:37:36.261 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:37:36.261 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:37:36.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:37:36.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:37:36.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:37:36.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:37:36.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:37:36.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:37:36.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:37:36.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:37:36.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:37:36.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:37:36.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:37:36.514 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:37:36.581 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:37:30
2026-05-29T18:37:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72569, datetime.datetime(2026, 5, 29, 18, 37, 30), datetime.datetime(2026, 5, 29, 18, 37, 30), 'salt', 9.03, 77.01, None, 14.89, 54.56, 3.8, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:37:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:37:36.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:37:36.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:37:30, diff=6.587378s, valid=True
2026-05-29T18:37:36.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:37:36.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:37:36.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:37:12, diff=24.590207s, valid=True
2026-05-29T18:37:36.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:37:36.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:37:36.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:37:29, diff=7.59682s, valid=True
2026-05-29T18:37:36.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:37:36.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:37:36.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:37:36.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:37:36.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:37:36.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:37:36.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:37:12, diff=24.599831s, valid=True
2026-05-29T18:37:36.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:37:36.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:37:36.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:37:36.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005298.600478s, valid=True
2026-05-29T18:37:36.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:37:36.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:37:36.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:37:36.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:37:36.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:37:36.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:37:36.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:37:36.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:37:36.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:37:36.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:37:36.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:37:36.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:37:36.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:37:36.913 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:37:37.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:37:37.528 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:37:37.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:37:37.627 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:37:37.627 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:37:37.820 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:37:37.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:38:07.829 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:38:07.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:38:07.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:38:08.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:38:08.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:38:08.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:38:08.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-05-29T18:38:08.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:38:08.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-05-29T18:38:08.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:38:08.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:38:08.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:38:08.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T18:38:10.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-05-29T18:38:10.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:38:10.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:38:10.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:38:10.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:38:10.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:38:10.742 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:38:10.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:38:10.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:38:10.742 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:38:10.742 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:38:10.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:38:10.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:38:10.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:38:10.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:38:10.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:38:10.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:38:10.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:38:10.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:38:10.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:38:10.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:38:10.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:38:10.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:38:11.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:38:01
2026-05-29T18:38:11.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72570, datetime.datetime(2026, 5, 29, 18, 38, 1), datetime.datetime(2026, 5, 29, 18, 38), 'salt', 9.07, 76.71, None, 14.12, 49.19, 3.87, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:38:11.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:38:11.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:38:11.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:38:00, diff=11.056219s, valid=True
2026-05-29T18:38:11.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:38:11.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:38:11.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:38:12, diff=-0.94091s, valid=True
2026-05-29T18:38:11.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:38:11.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:38:11.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:37:59, diff=12.065806s, valid=True
2026-05-29T18:38:11.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:38:11.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:38:11.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:38:11.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:38:11.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:38:11.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:38:11.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:38:12, diff=-0.931172s, valid=True
2026-05-29T18:38:11.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:38:11.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:38:11.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:38:11.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005333.069479s, valid=True
2026-05-29T18:38:11.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:38:11.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:38:11.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:38:11.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:38:11.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:38:11.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:38:11.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:38:11.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:38:11.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:38:11.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:38:11.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:38:11.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:38:11.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:38:11.390 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:38:11.596 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:38:11.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:38:12.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:38:12.034 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:38:12.034 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:38:12.303 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:38:12.303 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:38:42.318 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:38:42.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:38:42.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:38:42.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:38:42.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:38:42.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:38:42.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-05-29T18:38:43.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:38:43.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-05-29T18:38:43.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:38:43.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:38:43.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:38:43.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-05-29T18:38:45.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-05-29T18:38:45.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:38:45.400 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:38:45.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:38:45.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:38:45.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:38:45.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:38:45.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:38:45.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:38:45.420 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:38:45.421 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:38:45.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:38:45.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:38:45.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:38:45.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:38:45.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:38:45.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:38:45.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:38:45.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:38:45.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:38:45.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:38:45.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:38:45.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:38:45.735 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:38:31
2026-05-29T18:38:45.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72571, datetime.datetime(2026, 5, 29, 18, 38, 31), datetime.datetime(2026, 5, 29, 18, 38, 30), 'salt', 9.13, 76.78, None, 14.19, 46.28, 3.85, 831.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:38:45.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:38:45.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:38:45.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:38:30, diff=15.741831s, valid=True
2026-05-29T18:38:45.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:38:45.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:38:45.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:38:12, diff=33.744645s, valid=True
2026-05-29T18:38:45.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:38:45.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:38:45.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:38:29, diff=16.751329s, valid=True
2026-05-29T18:38:45.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:38:45.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:38:45.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:38:45.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:38:45.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:38:45.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:38:45.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:38:12, diff=33.754337s, valid=True
2026-05-29T18:38:45.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:38:45.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:38:45.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:38:45.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005367.754991s, valid=True
2026-05-29T18:38:45.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:38:45.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:38:45.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:38:45.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:38:45.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:38:45.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:38:45.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:38:45.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:38:45.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:38:45.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:38:45.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:38:45.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:38:46.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:38:46.139 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:38:46.363 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:38:46.707 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:38:46.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:38:46.807 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:38:46.807 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:38:46.893 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:38:46.894 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:39:16.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:39:16.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:39:16.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:39:17.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:39:17.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:39:17.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:39:17.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-05-29T18:39:17.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:39:17.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-05-29T18:39:17.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:39:17.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:39:17.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:39:17.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T18:39:19.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-05-29T18:39:19.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:39:19.961 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:39:19.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:39:19.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:39:19.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:39:19.983 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:39:19.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:39:19.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:39:19.983 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:39:19.983 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:39:19.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:39:20.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:39:20.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:39:20.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:39:20.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:39:20.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:39:20.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:39:20.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:39:20.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:39:20.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:39:20.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:39:20.245 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:39:20.304 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:39:01
2026-05-29T18:39:20.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72572, datetime.datetime(2026, 5, 29, 18, 39, 1), datetime.datetime(2026, 5, 29, 18, 39, 1), 'salt', 9.1, 77.34, None, 14.15, 46.25, 3.75, 831.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:39:20.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:39:20.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:39:20.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:01, diff=19.310329s, valid=True
2026-05-29T18:39:20.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:39:20.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:39:20.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=8.313184s, valid=True
2026-05-29T18:39:20.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:39:20.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:39:20.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:38:59, diff=21.319959s, valid=True
2026-05-29T18:39:20.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:39:20.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:39:20.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:39:20.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:39:20.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:39:20.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:39:20.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=8.323698s, valid=True
2026-05-29T18:39:20.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:39:20.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:39:20.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:39:20.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005402.324383s, valid=True
2026-05-29T18:39:20.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:39:20.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:39:20.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:39:20.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:39:20.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:39:20.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:39:20.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:39:20.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:39:20.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:39:20.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:39:20.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:39:20.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:39:20.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:39:20.645 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:39:20.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:39:21.192 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:39:21.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:39:21.291 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:39:21.291 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:39:21.556 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:39:21.556 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:39:51.586 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:39:51.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:39:51.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:39:51.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:39:51.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:39:52.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:39:52.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-05-29T18:39:52.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:39:52.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T18:39:52.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:39:52.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:39:52.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:39:52.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-05-29T18:39:54.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-05-29T18:39:54.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:39:54.519 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:39:54.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:39:54.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:39:54.539 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:39:54.539 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:39:54.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:39:54.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:39:54.539 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:39:54.539 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:39:54.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:39:54.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:39:54.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:39:54.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:39:54.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:39:54.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:39:54.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:39:54.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T18:39:54.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:39:54.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:39:54.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:39:54.796 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:39:54.856 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:39:31
2026-05-29T18:39:54.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72573, datetime.datetime(2026, 5, 29, 18, 39, 31), datetime.datetime(2026, 5, 29, 18, 39, 31), 'salt', 8.97, 78.53, None, 14.5, 50.17, 3.53, 831.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:39:54.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:39:54.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:39:54.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:31, diff=23.86209s, valid=True
2026-05-29T18:39:54.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:39:54.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:39:54.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=42.864962s, valid=True
2026-05-29T18:39:54.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:39:54.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:39:54.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:30, diff=24.873929s, valid=True
2026-05-29T18:39:54.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:39:54.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:39:54.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:39:54.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:39:54.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:39:54.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T18:39:54.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=42.878635s, valid=True
2026-05-29T18:39:54.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:39:54.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:39:54.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:39:54.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005436.879769s, valid=True
2026-05-29T18:39:54.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:39:54.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:39:54.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:39:54.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:39:54.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:39:54.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:39:54.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:39:54.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:39:54.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:39:55.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:39:55.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:39:55.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:39:55.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:39:55.278 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:39:55.494 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:39:55.852 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:39:55.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:39:55.952 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:39:55.952 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:39:56.135 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:39:56.135 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:40:26.165 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:40:26.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:40:26.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:40:26.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:40:26.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:40:26.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:40:26.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-05-29T18:40:26.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:40:26.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T18:40:26.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:40:26.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:40:26.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:40:26.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-05-29T18:40:29.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-05-29T18:40:29.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:40:29.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:40:29.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:40:29.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:40:29.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:40:29.260 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:40:29.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:40:29.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:40:29.260 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:40:29.260 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:40:29.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:40:29.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:40:29.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:40:29.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:40:29.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:40:29.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T18:40:29.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:40:29.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T18:40:29.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:40:29.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:40:29.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:40:29.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:40:29.579 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:40:01
2026-05-29T18:40:29.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72574, datetime.datetime(2026, 5, 29, 18, 40, 1), datetime.datetime(2026, 5, 29, 18, 40, 1), 'salt', 8.93, 78.7, None, 16.23, 46.61, 3.49, 831.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:40:29.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:40:29.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:40:29.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:40:01, diff=28.585492s, valid=True
2026-05-29T18:40:29.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:40:29.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T18:40:29.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=77.588342s, valid=True
2026-05-29T18:40:29.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:40:29.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:40:29.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:40:00, diff=29.595189s, valid=True
2026-05-29T18:40:29.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:40:29.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:40:29.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:40:29.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:40:29.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:40:29.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T18:40:29.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=77.598218s, valid=True
2026-05-29T18:40:29.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:40:29.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:40:29.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:40:29.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005471.598898s, valid=True
2026-05-29T18:40:29.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:40:29.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:40:29.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:40:29.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:40:29.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:40:29.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:40:29.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:40:29.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:40:29.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:40:29.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:40:29.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:40:29.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:40:29.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:40:29.946 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:40:30.170 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:40:30.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:40:30.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:40:30.635 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:40:30.635 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:40:30.873 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:40:30.873 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:41:00.893 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:41:00.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:41:00.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:41:01.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:41:01.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:41:01.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:41:01.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-05-29T18:41:01.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:41:01.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-05-29T18:41:01.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:41:01.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:41:01.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:41:01.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-05-29T18:41:03.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-05-29T18:41:03.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:41:03.763 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:41:03.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:41:03.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:41:03.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:41:03.786 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:41:03.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:41:03.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:41:03.786 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:41:03.786 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:41:03.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:41:03.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:41:03.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:41:03.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:41:03.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:41:04.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T18:41:04.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:41:04.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T18:41:04.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:41:04.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:41:04.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:41:04.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:41:04.125 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:41:02
2026-05-29T18:41:04.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72576, datetime.datetime(2026, 5, 29, 18, 41, 2), datetime.datetime(2026, 5, 29, 18, 41, 1), 'salt', 9.07, 78.2, None, 15.46, 45.06, 3.59, 831.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:41:04.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:41:04.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:41:04.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:41:01, diff=3.132755s, valid=True
2026-05-29T18:41:04.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:41:04.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T18:41:04.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=112.13609s, valid=True
2026-05-29T18:41:04.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:41:04.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:41:04.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:41:01, diff=3.143799s, valid=True
2026-05-29T18:41:04.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:41:04.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:41:04.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:41:04.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:41:04.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:41:04.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T18:41:04.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=112.14702s, valid=True
2026-05-29T18:41:04.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:41:04.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:41:04.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:41:04.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005506.147701s, valid=True
2026-05-29T18:41:04.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:41:04.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:41:04.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:41:04.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:41:04.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:41:04.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:41:04.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:41:04.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:41:04.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:41:04.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:41:04.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:41:04.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:41:04.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:41:04.539 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:41:04.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:41:05.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:41:05.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:41:05.226 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:41:05.226 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:41:05.398 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:41:05.398 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:41:35.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:41:35.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:41:35.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:41:35.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:41:35.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:41:36.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:41:36.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-05-29T18:41:36.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:41:36.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-05-29T18:41:36.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:41:36.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:41:36.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:41:36.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-05-29T18:41:38.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-05-29T18:41:38.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:41:38.441 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:41:38.441 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:41:38.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:41:38.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:41:38.462 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:41:38.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:41:38.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:41:38.462 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:41:38.462 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:41:38.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:41:38.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:41:38.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:41:38.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:41:38.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:41:38.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T18:41:38.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:41:38.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T18:41:38.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:41:38.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:41:38.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:41:38.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:41:38.776 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:41:32
2026-05-29T18:41:38.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72577, datetime.datetime(2026, 5, 29, 18, 41, 32), datetime.datetime(2026, 5, 29, 18, 41, 31), 'salt', 9.07, 76.64, None, 15.77, 49.23, 3.88, 831.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:41:38.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:41:38.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:41:38.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:41:31, diff=7.782327s, valid=True
2026-05-29T18:41:38.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:41:38.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T18:41:38.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=146.786914s, valid=True
2026-05-29T18:41:38.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:41:38.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:41:38.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:41:31, diff=7.793842s, valid=True
2026-05-29T18:41:38.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:41:38.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:41:38.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:41:38.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:41:38.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:41:38.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T18:41:38.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=146.796893s, valid=True
2026-05-29T18:41:38.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:41:38.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:41:38.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:41:38.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005540.797558s, valid=True
2026-05-29T18:41:38.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:41:38.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:41:38.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:41:38.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:41:38.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:41:38.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:41:38.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:41:38.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:41:38.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:41:38.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:41:39.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:41:39.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:41:39.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:41:39.124 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:41:39.340 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:41:39.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:41:39.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:41:39.792 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:41:39.792 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:41:39.965 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:41:39.965 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:42:09.994 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:42:09.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:42:09.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:42:10.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:42:10.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:42:10.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:42:10.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-05-29T18:42:10.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:42:10.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-05-29T18:42:10.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:42:10.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:42:10.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:42:10.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-05-29T18:42:13.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-05-29T18:42:13.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:42:13.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:42:13.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:42:13.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:42:13.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:42:13.126 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:42:13.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:42:13.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:42:13.126 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:42:13.126 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:42:13.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:42:13.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:42:13.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:42:13.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:42:13.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:42:13.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T18:42:13.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:42:13.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T18:42:13.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:42:13.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:42:13.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:42:13.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:42:13.513 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:42:02
2026-05-29T18:42:13.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72578, datetime.datetime(2026, 5, 29, 18, 42, 2), datetime.datetime(2026, 5, 29, 18, 42, 2), 'salt', 9.23, 75.78, None, 16.13, 45.6, 4.04, 831.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:42:13.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:42:13.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:42:13.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:42:02, diff=11.519937s, valid=True
2026-05-29T18:42:13.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:42:13.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T18:42:13.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=181.522811s, valid=True
2026-05-29T18:42:13.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:42:13.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:42:13.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:42:02, diff=11.529791s, valid=True
2026-05-29T18:42:13.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:42:13.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:42:13.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:42:13.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:42:13.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:42:13.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T18:42:13.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=181.533142s, valid=True
2026-05-29T18:42:13.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:42:13.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:42:13.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:42:13.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005575.533813s, valid=True
2026-05-29T18:42:13.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:42:13.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:42:13.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:42:13.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:42:13.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:42:13.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:42:13.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:42:13.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:42:13.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:42:13.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:42:13.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:42:13.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:42:13.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:42:13.857 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:42:14.083 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:42:14.425 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:42:14.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:42:14.524 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:42:14.524 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:42:14.697 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:42:14.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:42:44.727 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:42:44.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:42:44.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:42:44.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:42:44.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:42:45.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:42:45.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-05-29T18:42:45.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:42:45.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-05-29T18:42:45.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:42:45.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:42:45.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:42:45.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-05-29T18:42:47.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-05-29T18:42:47.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:42:47.993 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:42:47.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:42:48.005 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:42:48.018 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:42:48.019 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:42:48.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:42:48.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:42:48.020 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:42:48.020 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:42:48.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:42:48.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:42:48.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:42:48.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:42:48.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:42:48.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T18:42:48.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:42:48.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T18:42:48.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:42:48.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:42:48.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:42:48.326 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:42:48.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:42:32
2026-05-29T18:42:48.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72579, datetime.datetime(2026, 5, 29, 18, 42, 32), datetime.datetime(2026, 5, 29, 18, 42, 32), 'salt', 9.27, 74.19, None, 16.16, 49.4, 4.35, 831.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:42:48.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:42:48.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:42:48.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:42:32, diff=16.397329s, valid=True
2026-05-29T18:42:48.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:42:48.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T18:42:48.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=216.400245s, valid=True
2026-05-29T18:42:48.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:42:48.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:42:48.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:42:31, diff=17.407118s, valid=True
2026-05-29T18:42:48.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:42:48.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:42:48.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:42:48.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:42:48.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:42:48.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T18:42:48.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=216.410485s, valid=True
2026-05-29T18:42:48.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:42:48.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:42:48.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:42:48.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005610.411183s, valid=True
2026-05-29T18:42:48.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:42:48.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:42:48.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:42:48.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:42:48.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:42:48.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:42:48.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:42:48.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:42:48.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:42:48.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:42:48.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:42:48.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:42:48.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:42:48.734 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:42:48.946 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:42:49.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:42:49.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:42:49.394 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:42:49.394 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:42:49.566 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:42:49.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:43:19.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:43:19.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:43:19.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:43:19.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:43:19.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:43:20.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:43:20.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-05-29T18:43:20.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:43:20.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-05-29T18:43:20.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:43:20.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:43:20.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:43:20.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-05-29T18:43:22.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-05-29T18:43:22.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:43:22.557 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:43:22.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:43:22.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:43:22.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:43:22.581 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:43:22.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:43:22.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:43:22.581 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:43:22.581 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:43:22.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:43:22.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:43:22.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:43:22.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:43:22.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:43:22.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:43:22.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:43:22.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:43:22.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:43:22.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:43:22.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:43:22.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:43:22.890 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:43:03
2026-05-29T18:43:22.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72580, datetime.datetime(2026, 5, 29, 18, 43, 3), datetime.datetime(2026, 5, 29, 18, 43, 2), 'salt', 9.33, 73.83, None, 16.76, 49.3, 4.42, 831.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:43:22.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:43:22.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:43:22.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:43:02, diff=20.896791s, valid=True
2026-05-29T18:43:22.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:43:22.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:43:22.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=250.899634s, valid=True
2026-05-29T18:43:22.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:43:22.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:43:22.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:43:02, diff=20.906393s, valid=True
2026-05-29T18:43:22.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:43:22.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:43:22.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:43:22.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:43:22.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:43:22.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:43:22.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=250.909413s, valid=True
2026-05-29T18:43:22.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:43:22.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:43:22.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:43:22.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005644.91009s, valid=True
2026-05-29T18:43:22.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:43:22.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:43:22.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:43:22.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:43:22.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:43:22.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:43:22.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:43:22.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:43:22.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:43:23.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:43:23.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:43:23.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:43:23.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:43:23.226 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:43:23.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:43:23.781 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:43:23.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:43:23.880 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:43:23.881 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:43:24.059 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:43:24.060 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:43:54.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:43:54.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:43:54.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:43:54.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:43:54.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:43:54.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:43:54.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T18:43:54.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:43:54.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-05-29T18:43:54.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:43:54.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:43:54.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:43:54.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-05-29T18:43:57.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T18:43:57.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:43:57.142 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:43:57.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:43:57.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:43:57.171 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:43:57.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:43:57.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:43:57.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:43:57.172 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:43:57.172 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:43:57.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:43:57.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:43:57.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:43:57.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:43:57.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:43:57.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:43:57.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:43:57.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:43:57.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:43:57.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:43:57.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:43:57.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:43:57.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:43:33
2026-05-29T18:43:57.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72581, datetime.datetime(2026, 5, 29, 18, 43, 33), datetime.datetime(2026, 5, 29, 18, 43, 32), 'salt', 9.5, 72.8, None, 16.48, 48.79, 4.63, 831.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:43:57.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:43:57.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:43:57.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:43:32, diff=25.489043s, valid=True
2026-05-29T18:43:57.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:43:57.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:43:57.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=285.491882s, valid=True
2026-05-29T18:43:57.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:43:57.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:43:57.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:43:32, diff=25.498605s, valid=True
2026-05-29T18:43:57.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:43:57.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:43:57.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:43:57.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:43:57.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:43:57.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:43:57.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=285.501691s, valid=True
2026-05-29T18:43:57.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:43:57.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:43:57.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:43:57.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005679.502371s, valid=True
2026-05-29T18:43:57.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:43:57.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:43:57.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:43:57.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:43:57.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:43:57.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:43:57.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:43:57.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:43:57.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:43:57.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:43:57.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:43:57.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:43:57.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:43:57.819 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:43:58.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:43:58.369 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:43:58.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:43:58.470 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:43:58.470 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:43:58.650 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:43:58.650 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:44:28.679 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:44:28.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:44:28.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:44:29.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:44:29.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:44:29.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:44:29.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-05-29T18:44:29.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:44:29.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-05-29T18:44:29.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:44:29.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:44:29.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:44:29.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-05-29T18:44:31.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T18:44:32.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:44:32.042 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:44:32.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:44:32.051 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:44:32.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:44:32.063 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:44:32.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:44:32.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:44:32.064 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:44:32.064 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:44:32.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:44:32.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:44:32.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:44:32.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:44:32.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:44:32.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:44:32.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:44:32.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:44:32.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:44:32.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:44:32.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:44:32.317 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:44:32.374 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:44:03
2026-05-29T18:44:32.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72582, datetime.datetime(2026, 5, 29, 18, 44, 3), datetime.datetime(2026, 5, 29, 18, 44, 3), 'salt', 9.5, 72.3, None, 16.23, 49.12, 4.73, 831.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:44:32.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:44:32.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:44:32.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:44:03, diff=29.38086s, valid=True
2026-05-29T18:44:32.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:44:32.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:44:32.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=320.383663s, valid=True
2026-05-29T18:44:32.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:44:32.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:44:32.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:44:03, diff=29.390287s, valid=True
2026-05-29T18:44:32.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:44:32.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:44:32.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:44:32.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:44:32.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:44:32.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:44:32.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:39:12, diff=320.3933s, valid=True
2026-05-29T18:44:32.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:44:32.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:44:32.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:44:32.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005714.393968s, valid=True
2026-05-29T18:44:32.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:44:32.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:44:32.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:44:32.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:44:32.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:44:32.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:44:32.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:44:32.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:44:32.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:44:32.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:44:32.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:44:32.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:44:32.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:44:32.708 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:44:32.915 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:44:33.259 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:44:33.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:44:33.358 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:44:33.358 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:44:33.543 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:44:33.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:45:03.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:45:03.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:45:03.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:45:04.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:45:04.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:45:04.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:45:04.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-05-29T18:45:04.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:45:04.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-05-29T18:45:04.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:45:04.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:45:04.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:45:04.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-05-29T18:45:06.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-05-29T18:45:06.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:45:06.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:45:06.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:45:06.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:45:06.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:45:06.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:45:06.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:45:06.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:45:06.623 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:45:06.623 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:45:06.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:45:06.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:45:06.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:45:06.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:45:06.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:45:06.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:45:06.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:45:06.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:45:06.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:45:06.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:45:06.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:45:06.875 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:45:06.949 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:45:03
2026-05-29T18:45:06.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72584, datetime.datetime(2026, 5, 29, 18, 45, 3), datetime.datetime(2026, 5, 29, 18, 45, 3), 'salt', 9.53, 71.07, None, 15.95, 48.13, 4.97, 831.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:45:06.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:45:06.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:45:06.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:45:03, diff=3.956206s, valid=True
2026-05-29T18:45:06.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:45:06.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:45:06.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:45:12, diff=-5.040931s, valid=True
2026-05-29T18:45:06.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:45:06.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:45:06.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:45:03, diff=3.96582s, valid=True
2026-05-29T18:45:06.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:45:06.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:45:06.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:45:06.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:45:06.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:45:06.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:45:06.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:45:12, diff=-5.031117s, valid=True
2026-05-29T18:45:06.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:45:06.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:45:06.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:45:06.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005748.96957s, valid=True
2026-05-29T18:45:06.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:45:06.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:45:06.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:45:06.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:45:06.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:45:07.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:45:07.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:45:07.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:45:07.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:45:07.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:45:07.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:45:07.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:45:07.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:45:07.285 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:45:07.493 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:45:07.892 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:45:07.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:45:07.991 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:45:07.991 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:45:08.172 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:45:08.173 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:45:38.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:45:38.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:45:38.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:45:38.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:45:38.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:45:38.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:45:38.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-05-29T18:45:38.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:45:38.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-05-29T18:45:38.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:45:38.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:45:38.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:45:38.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-05-29T18:45:41.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-05-29T18:45:41.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:45:41.460 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:45:41.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:45:41.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:45:41.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:45:41.481 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:45:41.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:45:41.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:45:41.481 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:45:41.481 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:45:41.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:45:41.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:45:41.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:45:41.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:45:41.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:45:41.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:45:41.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:45:41.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:45:41.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:45:41.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:45:41.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:45:41.747 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:45:41.811 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:45:34
2026-05-29T18:45:41.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72585, datetime.datetime(2026, 5, 29, 18, 45, 34), datetime.datetime(2026, 5, 29, 18, 45, 33), 'salt', 9.57, 70.58, None, 15.0, 50.27, 5.08, 831.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:45:41.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:45:41.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:45:41.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:45:33, diff=8.817961s, valid=True
2026-05-29T18:45:41.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:45:41.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:45:41.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:46:12, diff=-30.179191s, valid=True
2026-05-29T18:45:41.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:45:41.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:45:41.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:45:33, diff=8.827428s, valid=True
2026-05-29T18:45:41.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:45:41.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:45:41.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:45:41.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:45:41.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:45:41.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:45:41.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:46:12, diff=-30.169567s, valid=True
2026-05-29T18:45:41.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:45:41.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:45:41.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:45:41.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005783.831122s, valid=True
2026-05-29T18:45:41.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:45:41.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:45:41.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:45:41.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:45:41.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:45:41.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:45:41.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:45:41.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:45:41.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:45:41.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:45:42.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:45:42.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:45:42.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:45:42.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:45:42.355 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:45:42.700 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:45:42.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:45:42.800 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:45:42.801 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:45:43.054 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:45:43.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:46:13.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:46:13.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:46:13.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:46:13.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:46:13.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:46:13.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:46: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-05-29T18:46:13.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:46:13.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-05-29T18:46:13.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:46:13.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:46:13.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:46:13.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-05-29T18:46:16.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-05-29T18:46:16.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:46:16.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:46:16.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:46:16.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:46:16.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:46:16.317 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:46:16.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:46:16.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:46:16.317 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:46:16.317 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:46:16.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:46:16.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:46:16.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:46:16.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:46:16.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:46:16.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:46:16.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:46:16.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:46:16.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:46:16.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:46:16.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:46:16.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:46:16.630 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:46:04
2026-05-29T18:46:16.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72586, datetime.datetime(2026, 5, 29, 18, 46, 4), datetime.datetime(2026, 5, 29, 18, 46, 4), 'salt', 9.6, 70.74, None, 16.27, 51.28, 5.04, 831.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:46:16.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:46:16.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:46:16.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:46:04, diff=12.638403s, valid=True
2026-05-29T18:46:16.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:46:16.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:46:16.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:46:12, diff=4.641278s, valid=True
2026-05-29T18:46:16.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:46:16.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:46:16.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:46:03, diff=13.647958s, valid=True
2026-05-29T18:46:16.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:46:16.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:46:16.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:46:16.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:46:16.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:46:16.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:46:16.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:46:12, diff=4.651018s, valid=True
2026-05-29T18:46:16.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:46:16.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:46:16.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:46:16.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005818.651684s, valid=True
2026-05-29T18:46:16.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:46:16.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:46:16.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:46:16.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:46:16.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:46:16.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:46:16.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:46:16.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:46:16.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:46:16.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:46:16.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:46:16.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:46:16.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:46:16.975 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:46:17.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:46:17.604 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:46:17.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:46:17.702 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:46:17.703 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:46:17.877 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:46:17.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:46:47.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:46:47.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:46:47.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:46:48.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:46:48.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:46:48.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:46:48.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-05-29T18:46:48.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:46:48.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-05-29T18:46:48.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:46:48.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:46:48.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:46:48.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-05-29T18:46:50.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-05-29T18:46:50.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:46:50.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:46:50.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:46:50.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:46:50.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:46:50.835 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:46:50.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:46:50.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:46:50.835 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:46:50.835 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:46:50.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:46:50.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:46:50.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:46:51.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:46:51.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:46:51.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:46:51.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:46:51.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:46:51.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:46:51.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:46:51.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:46:51.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:46:51.172 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:46:34
2026-05-29T18:46:51.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72587, datetime.datetime(2026, 5, 29, 18, 46, 34), datetime.datetime(2026, 5, 29, 18, 46, 34), 'salt', 9.6, 70.94, None, 15.6, 48.46, 5.0, 831.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:46:51.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:46:51.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:46:51.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:46:34, diff=17.178805s, valid=True
2026-05-29T18:46:51.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:46:51.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:46:51.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:47:12, diff=-20.818286s, valid=True
2026-05-29T18:46:51.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:46:51.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:46:51.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:46:34, diff=17.188494s, valid=True
2026-05-29T18:46:51.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:46:51.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:46:51.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:46:51.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:46:51.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:46:51.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:46:51.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:47:12, diff=-20.808416s, valid=True
2026-05-29T18:46:51.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:46:51.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:46:51.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:46:51.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005853.19225s, valid=True
2026-05-29T18:46:51.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:46:51.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:46:51.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:46:51.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:46:51.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:46:51.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:46:51.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:46:51.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:46:51.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:46:51.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:46:51.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:46:51.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:46:51.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:46:51.512 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:46:51.726 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:46:52.069 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:46:52.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:46:52.171 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:46:52.171 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:46:52.347 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:46:52.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:47:22.377 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:47:22.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:47:22.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:47:22.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:47:22.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:47:22.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:47:22.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-05-29T18:47:22.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:47:22.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T18:47:22.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:47:22.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:47:22.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:47:22.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-05-29T18:47:25.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-05-29T18:47:25.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:47:25.371 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:47:25.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:47:25.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:47:25.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:47:25.391 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:47:25.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:47:25.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:47:25.392 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:47:25.392 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:47:25.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:47:25.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:47:25.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:47:25.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:47:25.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:47:25.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:47:25.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:47:25.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:47:25.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:47:25.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:47:25.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:47:25.655 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:47:25.717 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:47:05
2026-05-29T18:47:25.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72588, datetime.datetime(2026, 5, 29, 18, 47, 5), datetime.datetime(2026, 5, 29, 18, 47, 4), 'salt', 9.9, 71.11, None, 16.27, 52.73, 4.98, 831.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:47:25.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:47:25.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:47:25.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:47:04, diff=21.72368s, valid=True
2026-05-29T18:47:25.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:47:25.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:47:25.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:47:12, diff=13.726489s, valid=True
2026-05-29T18:47:25.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:47:25.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:47:25.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:47:04, diff=21.733022s, valid=True
2026-05-29T18:47:25.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:47:25.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:47:25.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:47:25.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:47:25.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:47:25.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:47:25.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:47:12, diff=13.736031s, valid=True
2026-05-29T18:47:25.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:47:25.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:47:25.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:47:25.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005887.736689s, valid=True
2026-05-29T18:47:25.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:47:25.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:47:25.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:47:25.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:47:25.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:47:25.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:47:25.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:47:25.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:47:25.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:47:25.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:47:25.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:47:25.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:47:26.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:47:26.120 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:47:26.327 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:47:26.668 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:47:26.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:47:26.768 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:47:26.768 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:47:27.040 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:47:27.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:47:57.070 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:47:57.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:47:57.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:47:57.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:47:57.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:47:57.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:47:57.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-05-29T18:47:57.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:47:57.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-05-29T18:47:57.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:47:57.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:47:57.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:47:57.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-05-29T18:47:59.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-05-29T18:47:59.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:47:59.999 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:47:59.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:48:00.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:48:00.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:48:00.021 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:48:00.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:48:00.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:48:00.021 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:48:00.021 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:48:00.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:48:00.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:48:00.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:48:00.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:48:00.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:48:00.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:48:00.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:48:00.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:48:00.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:48:00.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:48:00.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:48:00.307 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:48:00.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:47:35
2026-05-29T18:48:00.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72589, datetime.datetime(2026, 5, 29, 18, 47, 35), datetime.datetime(2026, 5, 29, 18, 47, 35), 'salt', 9.63, 71.27, None, 16.13, 51.63, 4.93, 831.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:48:00.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:48:00.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:48:00.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:47:35, diff=25.410007s, valid=True
2026-05-29T18:48:00.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:48:00.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:48:00.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:48:12, diff=-11.58713s, valid=True
2026-05-29T18:48:00.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:48:00.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:48:00.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:47:34, diff=26.419549s, valid=True
2026-05-29T18:48:00.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:48:00.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:48:00.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:48:00.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:48:00.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:48:00.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:48:00.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:48:12, diff=-11.577415s, valid=True
2026-05-29T18:48:00.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:48:00.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:48:00.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:48:00.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005922.423242s, valid=True
2026-05-29T18:48:00.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:48:00.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:48:00.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:48:00.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:48:00.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:48:00.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:48:00.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:48:00.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:48:00.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:48:00.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:48:00.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:48:00.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:48:00.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:48:00.740 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:48:00.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:48:01.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:48:01.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:48: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-05-29T18:48: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-05-29T18:48:01.571 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:48:01.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:48:31.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:48:31.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:48:31.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:48:31.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:48:31.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:48:32.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:48:32.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-05-29T18:48:32.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:48:32.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-05-29T18:48:32.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:48:32.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:48:32.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:48:32.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T18:48:34.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-05-29T18:48:34.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:48:34.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:48:34.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:48:34.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:48:34.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:48:34.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:48:34.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:48:34.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:48:34.772 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:48:34.772 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:48:34.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:48:34.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T18:48:34.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:48:34.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T18:48:34.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:48:35.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:48:35.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:48:35.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:48:35.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:48:35.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:48:35.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:48:35.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:48:35.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:48:05
2026-05-29T18:48:35.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72590, datetime.datetime(2026, 5, 29, 18, 48, 5), datetime.datetime(2026, 5, 29, 18, 48, 5), 'salt', 9.7, 71.37, None, 14.96, 52.15, 4.92, 831.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:48:35.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:48:35.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T18:48:35.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:48:05, diff=30.125695s, valid=True
2026-05-29T18:48:35.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:48:35.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:48:35.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:48:12, diff=23.128585s, valid=True
2026-05-29T18:48:35.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:48:35.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T18:48:35.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:48:04, diff=31.135204s, valid=True
2026-05-29T18:48:35.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:48:35.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:48:35.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:48:35.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:48:35.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:48:35.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:48:35.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:48:12, diff=23.138231s, valid=True
2026-05-29T18:48:35.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:48:35.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:48:35.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:48:35.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005957.138913s, valid=True
2026-05-29T18:48:35.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:48:35.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:48:35.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:48:35.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:48:35.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:48:35.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:48:35.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:48:35.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:48:35.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:48:35.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:48:35.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:48:35.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:48:35.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:48:35.558 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:48:35.801 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:48:36.164 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:48:36.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:48:36.264 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:48:36.264 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:48:36.434 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:48:36.434 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:49:06.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:49:06.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:49:06.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:49:07.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:49:07.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:49:07.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:49:07.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-05-29T18:49:07.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:49:07.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-05-29T18:49:07.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:49:07.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:49:07.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:49:07.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-05-29T18:49:09.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-05-29T18:49:09.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:49:09.662 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:49:09.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:49:09.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:49:09.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:49:09.684 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:49:09.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:49:09.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:49:09.684 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:49:09.684 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:49:09.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:49:09.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:49:09.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:49:09.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:49:09.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:49:09.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:49:09.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:49:09.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:49:09.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:49:09.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:49:09.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:49:09.952 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:49:10.011 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:49:06
2026-05-29T18:49:10.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72592, datetime.datetime(2026, 5, 29, 18, 49, 6), datetime.datetime(2026, 5, 29, 18, 49, 5), 'salt', 9.63, 72.2, None, 14.79, 50.81, 4.75, 831.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:49:10.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:49:10.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:49:10.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:49:05, diff=5.018206s, valid=True
2026-05-29T18:49:10.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:49:10.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:49:10.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:49:12, diff=-1.97879s, valid=True
2026-05-29T18:49:10.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:49:10.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:49:10.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:49:05, diff=5.02885s, valid=True
2026-05-29T18:49:10.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:49:10.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:49:10.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:49:10.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:49:10.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:49:10.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:49:10.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:49:12, diff=-1.967968s, valid=True
2026-05-29T18:49:10.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:49:10.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:49:10.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:49:10.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1005992.032737s, valid=True
2026-05-29T18:49:10.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:49:10.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:49:10.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:49:10.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:49:10.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:49:10.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:49:10.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:49:10.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:49:10.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:49:10.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:49:10.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:49:10.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:49:10.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:49:10.357 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:49:10.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:49:10.914 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:49:11.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:49:11.015 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:49:11.015 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:49:11.277 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:49:11.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:49:41.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:49:41.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:49:41.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:49:41.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:49:41.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:49:41.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:49:41.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T18:49:41.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:49:41.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-05-29T18:49:41.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:49:41.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:49:41.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:49:41.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-05-29T18:49:44.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-05-29T18:49:44.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:49:44.102 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:49:44.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:49:44.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:49:44.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:49:44.121 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:49:44.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:49:44.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:49:44.122 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:49:44.122 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:49:44.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:49:44.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:49:44.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:49:44.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:49:44.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:49:44.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:49:44.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:49:44.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:49:44.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:49:44.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:49:44.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:49:44.373 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:49:44.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:49:36
2026-05-29T18:49:44.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72593, datetime.datetime(2026, 5, 29, 18, 49, 36), datetime.datetime(2026, 5, 29, 18, 49, 36), 'salt', 9.44, 72.93, None, 14.5, 53.91, 4.6, 831.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:49:44.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:49:44.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:49:44.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:49:36, diff=8.438316s, valid=True
2026-05-29T18:49:44.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:49:44.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:49:44.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:50:12, diff=-27.558769s, valid=True
2026-05-29T18:49:44.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:49:44.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:49:44.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:49:35, diff=9.44804s, valid=True
2026-05-29T18:49:44.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:49:44.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:49:44.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:49:44.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:49:44.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:49:44.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:49:44.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:50:12, diff=-27.548915s, valid=True
2026-05-29T18:49:44.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:49:44.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:49:44.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:49:44.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006026.451769s, valid=True
2026-05-29T18:49:44.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:49:44.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:49:44.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:49:44.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:49:44.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:49:44.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:49:44.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:49:44.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:49:44.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:49:44.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:49:44.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:49:44.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:49:44.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:49:44.848 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:49:45.055 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:49:45.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:49:45.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:49:45.498 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:49:45.498 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:49:46.314 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:49:46.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:50:16.343 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:50:16.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:50:16.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:50:16.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:50:16.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:50:17.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:50:17.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-05-29T18:50:17.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:50:17.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-05-29T18:50:17.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:50:17.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:50:17.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:50:17.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-05-29T18:50:19.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-05-29T18:50:19.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:50:19.395 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:50:19.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:50:19.405 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:50:19.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:50:19.417 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:50:19.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:50:19.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:50:19.417 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:50:19.417 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:50:19.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:50:19.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:50:19.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:50:19.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:50:19.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:50:19.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:50:19.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:50:19.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:50:19.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:50:19.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:50:19.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:50:19.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:50:19.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:50:06
2026-05-29T18:50:19.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72594, datetime.datetime(2026, 5, 29, 18, 50, 6), datetime.datetime(2026, 5, 29, 18, 50, 6), 'salt', 9.37, 73.33, None, 14.05, 50.72, 4.52, 831.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:50:19.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:50:19.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:50:19.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:50:06, diff=13.735666s, valid=True
2026-05-29T18:50:19.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:50:19.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:50:19.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:50:12, diff=7.738497s, valid=True
2026-05-29T18:50:19.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:50:19.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:50:19.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:50:05, diff=14.745302s, valid=True
2026-05-29T18:50:19.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:50:19.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:50:19.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:50:19.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:50:19.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:50:19.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:50:19.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:50:12, diff=7.748376s, valid=True
2026-05-29T18:50:19.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:50:19.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:50:19.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:50:19.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006061.74905s, valid=True
2026-05-29T18:50:19.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:50:19.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:50:19.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:50:19.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:50:19.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:50:19.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:50:19.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:50:19.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:50:19.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:50:19.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:50:19.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:50:19.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:50:20.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:50:20.085 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:50:20.315 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:50:20.667 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:50:20.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:50:20.770 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:50:20.770 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:50:21.151 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:50:21.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:50:51.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:50:51.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:50:51.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:50:51.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:50:51.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:50:51.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:50:51.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-05-29T18:50:51.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:50:51.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-05-29T18:50:51.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:50:51.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:50:51.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:50:51.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-05-29T18:50:53.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-05-29T18:50:53.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:50:53.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:50:53.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:50:53.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:50:53.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:50:53.964 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:50:53.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:50:53.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:50:53.964 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:50:53.964 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:50:53.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:50:54.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:50:54.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:50:54.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:50:54.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:50:54.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:50:54.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:50:54.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:50:54.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:50:54.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:50:54.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:50:54.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:50:54.345 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:50:36
2026-05-29T18:50:54.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72595, datetime.datetime(2026, 5, 29, 18, 50, 36), datetime.datetime(2026, 5, 29, 18, 50, 36), 'salt', 9.4, 73.27, None, 15.39, 52.62, 4.53, 831.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:50:54.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:50:54.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:50:54.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:50:36, diff=18.351565s, valid=True
2026-05-29T18:50:54.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:50:54.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:50:54.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:51:12, diff=-17.645599s, valid=True
2026-05-29T18:50:54.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:50:54.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:50:54.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:50:36, diff=18.36093s, valid=True
2026-05-29T18:50:54.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:50:54.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:50:54.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:50:54.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:50:54.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:50:54.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:50:54.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:51:12, diff=-17.636101s, valid=True
2026-05-29T18:50:54.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:50:54.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:50:54.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:50:54.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006096.364546s, valid=True
2026-05-29T18:50:54.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:50:54.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:50:54.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:50:54.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:50:54.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:50:54.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:50:54.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:50:54.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:50:54.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:50:54.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:50:54.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:50:54.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:50:54.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:50:54.678 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:50:54.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:50:55.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:50:55.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:50:55.348 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:50:55.348 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:50:55.527 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:50:55.528 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:51:25.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:51:25.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:51:25.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:51:25.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:51:25.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:51:25.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:51:25.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-05-29T18:51:26.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:51:26.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-05-29T18:51:26.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:51:26.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:51:26.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:51:26.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-05-29T18:51:29.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-05-29T18:51:29.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:51:29.629 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:51:29.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:51:29.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:51:29.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:51:29.652 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:51:29.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:51:29.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:51:29.652 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:51:29.652 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:51:29.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:51:29.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:51:29.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:51:29.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:51:29.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:51:29.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:51:29.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:51:29.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:51:29.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:51:29.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:51:29.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:51:29.943 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:51:30.003 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:51:07
2026-05-29T18:51:30.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72596, datetime.datetime(2026, 5, 29, 18, 51, 7), datetime.datetime(2026, 5, 29, 18, 51, 6), 'salt', 9.5, 72.87, None, 15.14, 51.44, 4.61, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:51:30.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:51:30.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:51:30.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:51:06, diff=24.009983s, valid=True
2026-05-29T18:51:30.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:51:30.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:51:30.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:51:12, diff=18.013206s, valid=True
2026-05-29T18:51:30.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:51:30.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:51:30.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:51:06, diff=24.021114s, valid=True
2026-05-29T18:51:30.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:51:30.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:51:30.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:51:30.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:51:30.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:51:30.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:51:30.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:51:12, diff=18.024307s, valid=True
2026-05-29T18:51:30.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:51:30.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:51:30.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:51:30.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006132.024984s, valid=True
2026-05-29T18:51:30.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:51:30.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:51:30.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:51:30.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:51:30.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:51:30.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:51:30.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:51:30.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:51:30.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:51:30.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:51:30.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:51:30.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:51:30.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:51:30.359 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:51:30.584 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:51:30.953 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:51:31.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:51: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-05-29T18:51: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-05-29T18:51:31.245 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:51:31.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:52:01.276 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:52:01.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:52:01.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:52:01.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:52:01.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:52:01.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:52:01.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-05-29T18:52:01.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:52:01.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-05-29T18:52:01.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:52:01.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:52:01.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:52:01.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-05-29T18:52:04.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-05-29T18:52:04.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:52:04.184 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:52:04.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:52:04.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:52:04.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:52:04.205 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:52:04.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:52:04.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:52:04.205 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:52:04.205 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:52:04.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:52:04.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:52:04.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:52:04.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:52:04.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:52:04.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:52:04.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:52:04.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:52:04.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:52:04.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:52:04.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:52:04.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:52:04.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:51:37
2026-05-29T18:52:04.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72597, datetime.datetime(2026, 5, 29, 18, 51, 37), datetime.datetime(2026, 5, 29, 18, 51, 36), 'salt', 9.54, 72.6, None, 15.07, 50.41, 4.67, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:52:04.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:52:04.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:52:04.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:51:36, diff=28.527887s, valid=True
2026-05-29T18:52:04.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:52:04.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:52:04.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:52:12, diff=-7.469226s, valid=True
2026-05-29T18:52:04.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:52:04.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:52:04.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:51:36, diff=28.537456s, valid=True
2026-05-29T18:52:04.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:52:04.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:52:04.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:52:04.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:52:04.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:52:04.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:52:04.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:52:12, diff=-7.459482s, valid=True
2026-05-29T18:52:04.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:52:04.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:52:04.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:52:04.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006166.541184s, valid=True
2026-05-29T18:52:04.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:52:04.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:52:04.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:52:04.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:52:04.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:52:04.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:52:04.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:52:04.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:52:04.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:52:04.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:52:04.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:52:04.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:52:04.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:52:04.861 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:52:05.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:52:05.430 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:52:05.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:52:05.531 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:52:05.531 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:52:05.709 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:52:05.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:52:35.739 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:52:35.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:52:35.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:52:36.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:52:36.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:52:36.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:52:36.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-05-29T18:52:36.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:52:36.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-05-29T18:52:36.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:52:36.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:52:36.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:52:36.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-05-29T18:52:38.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-05-29T18:52:38.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:52:38.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:52:38.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:52:38.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:52:38.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:52:38.872 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:52:38.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:52:38.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:52:38.872 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:52:38.873 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:52:38.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:52:38.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:52:38.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:52:39.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:52:39.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:52:39.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:52:39.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:52:39.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:52:39.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:52:39.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:52:39.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:52:39.123 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:52:39.181 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:52:37
2026-05-29T18:52:39.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72599, datetime.datetime(2026, 5, 29, 18, 52, 37), datetime.datetime(2026, 5, 29, 18, 52, 37), 'salt', 9.54, 71.87, None, 15.42, 54.45, 4.82, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:52:39.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:52:39.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:52:39.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:52:37, diff=2.188004s, valid=True
2026-05-29T18:52:39.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:52:39.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:52:39.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:53:12, diff=-32.809078s, valid=True
2026-05-29T18:52:39.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:52:39.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:52:39.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:52:36, diff=3.197639s, valid=True
2026-05-29T18:52:39.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:52:39.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:52:39.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:52:39.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:52:39.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:52:39.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:52:39.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:53:12, diff=-32.799307s, valid=True
2026-05-29T18:52:39.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:52:39.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:52:39.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:52:39.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006201.201355s, valid=True
2026-05-29T18:52:39.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:52:39.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:52:39.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:52:39.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:52:39.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:52:39.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:52:39.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:52:39.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:52:39.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:52:39.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:52:39.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:52:39.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:52:39.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:52:39.517 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:52:39.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:52:40.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:52:40.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:52:40.277 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:52:40.277 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:52:40.527 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:52:40.527 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:53:10.558 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:53:10.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:53:10.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:53:10.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:53:10.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:53:11.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:53:11.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-05-29T18:53:11.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:53:11.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-05-29T18:53:11.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:53:11.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:53:11.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:53:11.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-05-29T18:53:13.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T18:53:13.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:53:13.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:53:13.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:53:13.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:53:13.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:53:13.411 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:53:13.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:53:13.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:53:13.412 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:53:13.412 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:53:13.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:53:13.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:53:13.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:53:13.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:53:13.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:53:13.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:53:13.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:53:13.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:53:13.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:53:13.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:53:13.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:53:13.660 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:53:13.722 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:53:07
2026-05-29T18:53:13.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72600, datetime.datetime(2026, 5, 29, 18, 53, 7), datetime.datetime(2026, 5, 29, 18, 53, 7), 'salt', 9.64, 70.85, None, 18.03, 44.87, 5.03, 831.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:53:13.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:53:13.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:53:13.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:53:07, diff=6.728917s, valid=True
2026-05-29T18:53:13.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:53:13.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:53:13.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:53:12, diff=1.731737s, valid=True
2026-05-29T18:53:13.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:53:13.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:53:13.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:53:07, diff=6.738346s, valid=True
2026-05-29T18:53:13.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:53:13.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:53:13.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:53:13.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:53:13.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:53:13.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:53:13.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:53:12, diff=1.741396s, valid=True
2026-05-29T18:53:13.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:53:13.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:53:13.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:53:13.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006235.742073s, valid=True
2026-05-29T18:53:13.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:53:13.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:53:13.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:53:13.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:53:13.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:53:13.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:53:13.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:53:13.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:53:13.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:53:13.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:53:13.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:53:13.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:53:14.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:53:14.054 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:53:14.284 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:53:14.632 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:53:14.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:53:14.733 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:53:14.733 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:53:14.907 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:53:14.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:53:44.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:53:44.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:53:44.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:53:45.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:53:45.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:53:45.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:53:45.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-05-29T18:53:45.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:53:45.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-05-29T18:53:45.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:53:45.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:53:45.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:53:45.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-05-29T18:53:47.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-05-29T18:53:47.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:53:47.780 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:53:47.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:53:47.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:53:47.800 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:53:47.800 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:53:47.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:53:47.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:53:47.801 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:53:47.801 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:53:47.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:53:47.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:53:47.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:53:47.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:53:47.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:53:48.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:53:48.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:53:48.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:53:48.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:53:48.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:53:48.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:53:48.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:53:48.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:53:38
2026-05-29T18:53:48.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72601, datetime.datetime(2026, 5, 29, 18, 53, 38), datetime.datetime(2026, 5, 29, 18, 53, 37), 'salt', 9.77, 70.95, None, 15.84, 46.4, 5.01, 831.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:53:48.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:53:48.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:53:48.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:53:37, diff=11.123094s, valid=True
2026-05-29T18:53:48.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:53:48.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:53:48.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:54:12, diff=-23.873397s, valid=True
2026-05-29T18:53:48.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:53:48.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:53:48.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:53:37, diff=11.138869s, valid=True
2026-05-29T18:53:48.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:53:48.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:53:48.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:53:48.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:53:48.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:53:48.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:53:48.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:54:12, diff=-23.855286s, valid=True
2026-05-29T18:53:48.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:53:48.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:53:48.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:53:48.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006270.145855s, valid=True
2026-05-29T18:53:48.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:53:48.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:53:48.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:53:48.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:53:48.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:53:48.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:53:48.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:53:48.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:53:48.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:53:48.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:53:48.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:53:48.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:53:48.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:53:48.468 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:53:48.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:53:49.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:53:49.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:53:49.209 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:53:49.209 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:53:49.359 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:53:49.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:54:19.389 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:54:19.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:54:19.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:54:19.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:54:19.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:54:19.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:54:19.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-05-29T18:54:19.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:54:19.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-05-29T18:54:19.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:54:19.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:54:19.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:54:19.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-05-29T18:54:22.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-05-29T18:54:22.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:54:22.241 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:54:22.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:54:22.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:54:22.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:54:22.262 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:54:22.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:54:22.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:54:22.263 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:54:22.263 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:54:22.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:54:22.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:54:22.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:54:22.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:54:22.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:54:22.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:54:22.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:54:22.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:54:22.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:54:22.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:54:22.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:54:22.513 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:54:22.571 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:54:08
2026-05-29T18:54:22.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72602, datetime.datetime(2026, 5, 29, 18, 54, 8), datetime.datetime(2026, 5, 29, 18, 54, 7), 'salt', 9.8, 70.81, None, 15.6, 49.4, 5.03, 832.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:54:22.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:54:22.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:54:22.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:54:07, diff=15.577918s, valid=True
2026-05-29T18:54:22.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:54:22.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:54:22.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:54:12, diff=10.580735s, valid=True
2026-05-29T18:54:22.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:54:22.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:54:22.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:54:08, diff=14.587336s, valid=True
2026-05-29T18:54:22.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:54:22.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:54:22.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:54:22.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:54:22.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:54:22.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:54:22.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:54:12, diff=10.590372s, valid=True
2026-05-29T18:54:22.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:54:22.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:54:22.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:54:22.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006304.591063s, valid=True
2026-05-29T18:54:22.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:54:22.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:54:22.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:54:22.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:54:22.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:54:22.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:54:22.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:54:22.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:54:22.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:54:22.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:54:22.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:54:22.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:54:22.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:54:22.907 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:54:23.124 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:54:23.474 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:54:23.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:54: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-05-29T18:54: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-05-29T18:54:23.764 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:54:23.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:54:53.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:54:53.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:54:53.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:54:54.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:54:54.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:54:54.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:54:54.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-05-29T18:54:54.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:54:54.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-05-29T18:54:54.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:54:54.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:54:54.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:54:54.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T18:54:57.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T18:54:57.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:54:57.375 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:54:57.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:54:57.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:54:57.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:54:57.395 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:54:57.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:54:57.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:54:57.395 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:54:57.395 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:54:57.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:54:57.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:54:57.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:54:57.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:54:57.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:54:57.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:54:57.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:54:57.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:54:57.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:54:57.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:54:57.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:54:57.651 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:54:57.709 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:54:38
2026-05-29T18:54:57.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72603, datetime.datetime(2026, 5, 29, 18, 54, 38), datetime.datetime(2026, 5, 29, 18, 54, 38), 'salt', 9.77, 70.52, None, 16.62, 49.43, 5.1, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:54:57.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:54:57.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:54:57.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:54:38, diff=19.715779s, valid=True
2026-05-29T18:54:57.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:54:57.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:54:57.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:55:12, diff=-14.281425s, valid=True
2026-05-29T18:54:57.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:54:57.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:54:57.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:54:38, diff=19.725291s, valid=True
2026-05-29T18:54:57.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:54:57.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:54:57.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:54:57.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:54:57.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:54:57.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:54:57.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:55:12, diff=-14.271701s, valid=True
2026-05-29T18:54:57.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:54:57.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:54:57.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:54:57.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006339.72896s, valid=True
2026-05-29T18:54:57.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:54:57.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:54:57.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:54:57.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:54:57.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:54:57.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:54:57.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:54:57.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:54:57.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:54:57.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:54:57.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:54:57.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:54:58.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:54:58.113 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:54:58.327 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:54:58.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:54:58.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:54: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-05-29T18:54: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-05-29T18:54:59.017 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:54:59.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:55:29.048 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:55:29.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:55:29.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:55:29.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:55:29.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:55:29.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:55:29.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-05-29T18:55:29.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:55:29.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-05-29T18:55:29.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:55:29.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:55:29.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:55:29.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-05-29T18:55:32.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T18:55:32.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:55:32.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:55:32.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:55:32.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:55:32.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:55:32.130 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:55:32.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:55:32.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:55:32.130 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:55:32.130 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:55:32.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:55:32.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:55:32.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:55:32.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:55:32.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:55:32.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:55:32.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:55:32.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:55:32.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:55:32.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:55:32.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:55:32.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:55:32.439 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:55:08
2026-05-29T18:55:32.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72604, datetime.datetime(2026, 5, 29, 18, 55, 8), datetime.datetime(2026, 5, 29, 18, 55, 8), 'salt', 9.77, 69.82, None, 14.75, 49.61, 5.24, 832.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:55:32.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:55:32.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:55:32.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:55:08, diff=24.445214s, valid=True
2026-05-29T18:55:32.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:55:32.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:55:32.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:55:12, diff=20.448116s, valid=True
2026-05-29T18:55:32.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:55:32.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:55:32.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:55:08, diff=24.454953s, valid=True
2026-05-29T18:55:32.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:55:32.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:55:32.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:55:32.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:55:32.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:55:32.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:55:32.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:55:12, diff=20.458004s, valid=True
2026-05-29T18:55:32.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:55:32.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:55:32.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:55:32.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006374.458675s, valid=True
2026-05-29T18:55:32.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:55:32.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:55:32.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:55:32.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:55:32.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:55:32.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:55:32.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:55:32.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:55:32.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:55:32.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:55:32.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:55:32.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:55:32.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:55:32.774 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:55:32.990 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:55:33.341 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:55:33.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:55:33.443 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:55:33.443 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:55:33.631 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:55:33.631 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:56:03.661 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:56:03.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:56:03.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:56:03.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:56:03.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:56:04.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:56:04.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-05-29T18:56:04.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:56:04.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-05-29T18:56:04.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:56:04.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:56:04.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:56:04.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-05-29T18:56:06.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-05-29T18:56:06.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:56:06.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:56:06.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:56:06.339 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:56:06.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:56:06.351 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:56:06.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:56:06.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:56:06.352 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:56:06.352 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:56:06.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:56:06.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:56:06.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:56:06.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:56:06.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:56:06.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:56:06.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:56:06.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:56:06.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:56:06.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:56:06.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:56:06.606 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:56:06.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:55:39
2026-05-29T18:56:06.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72605, datetime.datetime(2026, 5, 29, 18, 55, 39), datetime.datetime(2026, 5, 29, 18, 55, 38), 'salt', 9.84, 69.55, None, 14.57, 53.51, 5.3, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:56:06.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:56:06.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:56:06.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:55:38, diff=28.670599s, valid=True
2026-05-29T18:56:06.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:56:06.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:56:06.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:56:12, diff=-5.326602s, valid=True
2026-05-29T18:56:06.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:56:06.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:56:06.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:55:38, diff=28.680031s, valid=True
2026-05-29T18:56:06.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:56:06.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:56:06.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:56:06.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:56:06.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:56:06.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:56:06.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:56:12, diff=-5.317s, valid=True
2026-05-29T18:56:06.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:56:06.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:56:06.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:56:06.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006408.683675s, valid=True
2026-05-29T18:56:06.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:56:06.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:56:06.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:56:06.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:56:06.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:56:06.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:56:06.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:56:06.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:56:06.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:56:06.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:56:06.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:56:06.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:56:07.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:56:07.065 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:56:07.279 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:56:07.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:56:07.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:56:07.727 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:56:07.727 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:56:07.903 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:56:07.903 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:56:37.925 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:56:37.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:56:37.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:56:38.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:56:38.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:56:38.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:56:38.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-05-29T18:56:38.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:56:38.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-05-29T18:56:38.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:56:38.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:56:38.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:56:38.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-05-29T18:56:41.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-05-29T18:56:41.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:56:41.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:56:41.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:56:41.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:56:41.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:56:41.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:56:41.077 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:56:41.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:56:41.078 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:56:41.078 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:56:41.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:56:41.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:56:41.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:56:41.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:56:41.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:56:41.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:56:41.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:56:41.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:56:41.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:56:41.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:56:41.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:56:41.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:56:41.397 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:56:39
2026-05-29T18:56:41.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72607, datetime.datetime(2026, 5, 29, 18, 56, 39), datetime.datetime(2026, 5, 29, 18, 56, 39), 'salt', 9.84, 69.65, None, 14.75, 43.65, 5.28, 831.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:56:41.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:56:41.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:56:41.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:56:39, diff=2.403949s, valid=True
2026-05-29T18:56:41.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:56:41.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:56:41.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:57:12, diff=-30.593174s, valid=True
2026-05-29T18:56:41.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:56:41.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:56:41.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:56:39, diff=2.413489s, valid=True
2026-05-29T18:56:41.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:56:41.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:56:41.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:56:41.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:56:41.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:56:41.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:56:41.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:57:12, diff=-30.583491s, valid=True
2026-05-29T18:56:41.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:56:41.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:56:41.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:56:41.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006443.417252s, valid=True
2026-05-29T18:56:41.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:56:41.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:56:41.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:56:41.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:56:41.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:56:41.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:56:41.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:56:41.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:56:41.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:56:41.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:56:41.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:56:41.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:56:41.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:56:41.753 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:56:41.995 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:56:42.361 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:56:42.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:56:42.461 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:56:42.461 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:56:42.642 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:56:42.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:57:12.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:57:12.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:57:12.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:57:13.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:57:13.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:57:13.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:57:13.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-05-29T18:57:13.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:57:13.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-05-29T18:57:13.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:57:13.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:57:13.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:57:13.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-05-29T18:57:15.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-05-29T18:57:15.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:57:15.627 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:57:15.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:57:15.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:57:15.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:57:15.649 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:57:15.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:57:15.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:57:15.649 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:57:15.649 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:57:15.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:57:15.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:57:15.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:57:15.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:57:15.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:57:15.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:57:15.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:57:15.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:57:15.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:57:15.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:57:15.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:57:15.971 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:57:16.029 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:57:10
2026-05-29T18:57:16.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72608, datetime.datetime(2026, 5, 29, 18, 57, 10), datetime.datetime(2026, 5, 29, 18, 57, 10), 'salt', 9.77, 70.15, None, 13.73, 49.99, 5.17, 831.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:57:16.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:57:16.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:57:16.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:57:10, diff=6.035359s, valid=True
2026-05-29T18:57:16.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:57:16.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:57:16.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:57:12, diff=4.038228s, valid=True
2026-05-29T18:57:16.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:57:16.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:57:16.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:57:09, diff=7.045159s, valid=True
2026-05-29T18:57:16.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:57:16.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:57:16.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:57:16.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:57:16.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:57:16.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:57:16.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:57:12, diff=4.048225s, valid=True
2026-05-29T18:57:16.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:57:16.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:57:16.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:57:16.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006478.048919s, valid=True
2026-05-29T18:57:16.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:57:16.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:57:16.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:57:16.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:57:16.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:57:16.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:57:16.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:57:16.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:57:16.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:57:16.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:57:16.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:57:16.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:57:16.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:57:16.362 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:57:16.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:57:16.925 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:57:17.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:57:17.025 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:57:17.026 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:57:17.296 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:57:17.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:57:47.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:57:47.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:57:47.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:57:47.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:57:47.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:57:47.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:57:47.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-05-29T18:57:47.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:57:47.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-05-29T18:57:47.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:57:47.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:57:47.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:57:47.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-05-29T18:57:50.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-05-29T18:57:50.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:57:50.444 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:57:50.444 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:57:50.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:57:50.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:57:50.465 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:57:50.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:57:50.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:57:50.465 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:57:50.465 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:57:50.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:57:50.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:57:50.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:57:50.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:57:50.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:57:50.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:57:50.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:57:50.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:57:50.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:57:50.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:57:50.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:57:50.717 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:57:50.775 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:57:40
2026-05-29T18:57:50.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72609, datetime.datetime(2026, 5, 29, 18, 57, 40), datetime.datetime(2026, 5, 29, 18, 57, 40), 'salt', 9.77, 70.45, None, 13.97, 51.44, 5.11, 831.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:57:50.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:57:50.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:57:50.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:57:40, diff=10.781594s, valid=True
2026-05-29T18:57:50.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:57:50.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:57:50.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:58:12, diff=-21.215561s, valid=True
2026-05-29T18:57:50.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:57:50.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:57:50.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:57:39, diff=11.790993s, valid=True
2026-05-29T18:57:50.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:57:50.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:57:50.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:57:50.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:57:50.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:57:50.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:57:50.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:58:12, diff=-21.205976s, valid=True
2026-05-29T18:57:50.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:57:50.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:57:50.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:57:50.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006512.794722s, valid=True
2026-05-29T18:57:50.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:57:50.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:57:50.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:57:50.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:57:50.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:57:50.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:57:50.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:57:50.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:57:50.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:57:50.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:57:50.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:57:51.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:57:51.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:57:51.109 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:57:51.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:57:51.684 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:57:51.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:57:51.785 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:57:51.785 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:57:51.979 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:57:51.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:58:22.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:58:22.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:58:22.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:58:22.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:58:22.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:58:22.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:58:22.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-05-29T18:58:22.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:58:22.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-05-29T18:58:22.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:58:22.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:58:22.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:58:22.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-05-29T18:58:24.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-05-29T18:58:24.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:58:24.935 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:58:24.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:58:24.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:58:24.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:58:24.955 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:58:24.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:58:24.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:58:24.956 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:58:24.956 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:58:24.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:58:25.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:58:25.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:58:25.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:58:25.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:58:25.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:58:25.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:58:25.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:58:25.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:58:25.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:58:25.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:58:25.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:58:25.273 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:58:10
2026-05-29T18:58:25.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72610, datetime.datetime(2026, 5, 29, 18, 58, 10), datetime.datetime(2026, 5, 29, 18, 58, 10), 'salt', 9.6, 71.74, None, 14.26, 48.51, 4.84, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:58:25.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:58:25.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:58:25.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:58:10, diff=15.279721s, valid=True
2026-05-29T18:58:25.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:58:25.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:58:25.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:58:12, diff=13.282501s, valid=True
2026-05-29T18:58:25.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:58:25.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:58:25.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:58:10, diff=15.289066s, valid=True
2026-05-29T18:58:25.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:58:25.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:58:25.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:58:25.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:58:25.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:58:25.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:58:25.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:58:12, diff=13.292057s, valid=True
2026-05-29T18:58:25.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:58:25.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:58:25.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:58:25.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006547.292728s, valid=True
2026-05-29T18:58:25.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:58:25.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:58:25.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:58:25.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:58:25.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:58:25.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:58:25.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:58:25.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:58:25.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:58:25.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:58:25.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:58:25.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:58:25.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:58:25.608 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:58:25.824 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:58:26.176 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:58:26.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:58:26.277 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:58:26.277 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:58:26.466 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:58:26.467 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:58:56.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:58:56.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:58:56.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:58:56.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:58:56.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:58:56.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:58:56.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-05-29T18:58:56.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:58:56.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-05-29T18:58:56.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:58:56.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:58:56.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:58:56.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-05-29T18:59:00.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-05-29T18:59:00.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:59:00.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:59:00.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:59:00.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:59:00.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:59:00.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:59:00.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:59:00.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:59:00.066 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:59:00.066 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:59:00.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:59:00.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:59:00.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:59:00.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:59:00.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:59:00.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:59:00.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:59:00.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T18:59:00.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:59:00.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:59:00.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:59:00.323 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:59:00.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:58:41
2026-05-29T18:59:00.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72611, datetime.datetime(2026, 5, 29, 18, 58, 41), datetime.datetime(2026, 5, 29, 18, 58, 40), 'salt', 9.54, 72.74, None, 14.12, 50.58, 4.64, 832.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:59:00.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:59:00.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:59:00.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:58:40, diff=20.389206s, valid=True
2026-05-29T18:59:00.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:59:00.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:59:00.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:59:12, diff=-11.607946s, valid=True
2026-05-29T18:59:00.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:59:00.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:59:00.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:58:40, diff=20.398696s, valid=True
2026-05-29T18:59:00.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:59:00.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:59:00.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:59:00.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:59:00.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:59:00.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T18:59:00.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:59:12, diff=-11.598266s, valid=True
2026-05-29T18:59:00.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:59:00.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:59:00.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:59:00.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006582.402386s, valid=True
2026-05-29T18:59:00.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:59:00.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:59:00.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:59:00.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:59:00.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:59:00.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:59:00.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:59:00.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:59:00.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:59:00.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:59:00.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:59:00.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:59:00.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:59:00.717 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:59:00.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:59:01.352 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:59:01.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:59:01.484 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:59:01.484 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:59:01.681 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:59:01.681 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T18:59:31.711 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T18:59:31.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T18:59:31.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T18:59:32.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T18:59:32.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T18:59:32.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T18:59:32.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-05-29T18:59:32.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T18:59:32.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T18:59:32.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T18:59:32.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T18:59:32.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T18:59:32.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-05-29T18:59:35.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-05-29T18:59:35.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T18:59:35.358 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T18:59:35.358 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T18:59:35.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T18:59:35.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T18:59:35.378 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T18:59:35.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T18:59:35.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T18:59:35.378 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T18:59:35.378 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T18:59:35.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T18:59:35.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T18:59:35.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T18:59:35.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T18:59:35.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:59:35.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:59:35.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T18:59:35.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T18:59:35.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T18:59:35.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T18:59:35.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T18:59:35.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T18:59:35.716 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:59:11
2026-05-29T18:59:35.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72612, datetime.datetime(2026, 5, 29, 18, 59, 11), datetime.datetime(2026, 5, 29, 18, 59, 10), 'salt', 9.24, 74.27, None, 12.95, 54.05, 4.33, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T18:59:35.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T18:59:35.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T18:59:35.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:59:10, diff=25.722834s, valid=True
2026-05-29T18:59:35.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T18:59:35.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:59:35.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:59:12, diff=23.725677s, valid=True
2026-05-29T18:59:35.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T18:59:35.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T18:59:35.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:59:10, diff=25.732485s, valid=True
2026-05-29T18:59:35.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T18:59:35.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:59:35.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T18:59:35.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T18:59:35.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T18:59:35.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T18:59:35.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:59:12, diff=23.735533s, valid=True
2026-05-29T18:59:35.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T18:59:35.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T18:59:35.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T18:59:35.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006617.736198s, valid=True
2026-05-29T18:59:35.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T18:59:35.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T18:59:35.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T18:59:35.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T18:59:35.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T18:59:35.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T18:59:35.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T18:59:35.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T18:59:35.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T18:59:35.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T18:59:35.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T18:59:35.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T18:59:36.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T18:59:36.050 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T18:59:36.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:59:36.617 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T18:59:36.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T18:59:36.717 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T18:59:36.717 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T18:59:36.968 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T18:59:36.968 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:00:06.997 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:00:06.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:00:06.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:00:07.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:00:07.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:00:07.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:00:07.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-05-29T19:00:07.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:00:07.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T19:00:07.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:00:07.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:00:07.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:00:07.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-05-29T19:00:10.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:00:10.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:00:10.115 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:00:10.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:00:10.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:00:10.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:00:10.135 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:00:10.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:00:10.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:00:10.136 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:00:10.136 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:00:10.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:00:10.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:00:10.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:00:10.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:00:10.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:00:10.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T19:00:10.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:00:10.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T19:00:10.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:00:10.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:00:10.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:00:10.389 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:00:10.448 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 18:59:41
2026-05-29T19:00:10.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72613, datetime.datetime(2026, 5, 29, 18, 59, 41), datetime.datetime(2026, 5, 29, 18, 59, 41), 'salt', 9.17, 75.03, None, 14.26, 50.06, 4.18, 832.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:00:10.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:00:10.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:00:10.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:59:41, diff=29.454595s, valid=True
2026-05-29T19:00:10.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:00:10.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T19:00:10.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:00:12, diff=-1.54251s, valid=True
2026-05-29T19:00:10.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:00:10.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:00:10.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 18:59:40, diff=30.464023s, valid=True
2026-05-29T19:00:10.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:00:10.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:00:10.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:00:10.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:00:10.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:00:10.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T19:00:10.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:00:12, diff=-1.53293s, valid=True
2026-05-29T19:00:10.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:00:10.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:00:10.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:00:10.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006652.467741s, valid=True
2026-05-29T19:00:10.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:00:10.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:00:10.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:00:10.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:00:10.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:00:10.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:00:10.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:00:10.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:00:10.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:00:10.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:00:10.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:00:10.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:00:10.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:00:10.783 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:00:11.076 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:00:11.427 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:00:11.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:00:11.527 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:00:11.528 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:00:11.715 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:00:11.715 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:00:41.744 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:00:41.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:00:41.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:00:42.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:00:42.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:00:42.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:00:42.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-05-29T19:00:42.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:00:42.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-05-29T19:00:42.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:00:42.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:00:42.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:00:42.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-05-29T19:00:44.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-05-29T19:00:44.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:00:44.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:00:44.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:00:44.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:00:44.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:00:44.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:00:44.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:00:44.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:00:44.680 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:00:44.680 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:00:44.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:00:44.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:00:44.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:00:44.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:00:44.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:00:44.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T19:00:44.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:00:44.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T19:00:44.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:00:44.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:00:44.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:00:44.929 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:00:44.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:00:42
2026-05-29T19:00:44.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72615, datetime.datetime(2026, 5, 29, 19, 0, 42), datetime.datetime(2026, 5, 29, 19, 0, 41), 'salt', 8.84, 77.42, None, 16.3, 55.74, 3.72, 832.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:00:44.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:00:44.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:00:44.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:00:41, diff=3.993844s, valid=True
2026-05-29T19:00:44.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:00:44.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T19:00:44.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:01:12, diff=-27.003258s, valid=True
2026-05-29T19:00:44.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:00:44.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:00:45.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:00:41, diff=4.003811s, valid=True
2026-05-29T19:00:45.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:00:45.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:00:45.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:00:45.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:00:45.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:00:45.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T19:00:45.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:01:12, diff=-26.99296s, valid=True
2026-05-29T19:00:45.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:00:45.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:00:45.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:00:45.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006687.007792s, valid=True
2026-05-29T19:00:45.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:00:45.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:00:45.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:00:45.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:00:45.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:00:45.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:00:45.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:00:45.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:00:45.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:00:45.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:00:45.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:00:45.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:00:45.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:00:45.418 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:00:45.635 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:00:45.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:00:46.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:00:46.087 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:00:46.087 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:00:46.285 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:00:46.285 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:01:16.315 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:01:16.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:01:16.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:01:16.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:01:16.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:01:17.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:01:17.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-05-29T19:01:17.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:01:17.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-05-29T19:01:17.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:01:17.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:01:17.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:01:17.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-05-29T19:01:19.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-05-29T19:01:19.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:01:19.427 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:01:19.427 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:01:19.435 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:01:19.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:01:19.447 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:01:19.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:01:19.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:01:19.448 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:01:19.448 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:01:19.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:01:19.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:01:19.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:01:19.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:01:19.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:01:19.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T19:01:19.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:01:19.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T19:01:19.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:01:19.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:01:19.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:01:19.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:01:19.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:01:12
2026-05-29T19:01:19.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72616, datetime.datetime(2026, 5, 29, 19, 1, 12), datetime.datetime(2026, 5, 29, 19, 1, 11), 'salt', 8.81, 78.51, None, 16.37, 50.6, 3.52, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:01:19.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:01:19.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:01:19.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:01:11, diff=8.784089s, valid=True
2026-05-29T19:01:19.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:01:19.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T19:01:19.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:01:12, diff=7.786933s, valid=True
2026-05-29T19:01:19.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:01:19.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:01:19.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:01:11, diff=8.793725s, valid=True
2026-05-29T19:01:19.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:01:19.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:01:19.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:01:19.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:01:19.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:01:19.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T19:01:19.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:01:12, diff=7.796806s, valid=True
2026-05-29T19:01:19.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:01:19.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:01:19.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:01:19.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006721.797469s, valid=True
2026-05-29T19:01:19.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:01:19.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:01:19.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:01:19.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:01:19.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:01:19.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:01:19.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:01:19.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:01:19.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:01:19.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:01:20.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:01:20.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:01:20.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:01:20.218 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:01:20.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:01:20.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:01:20.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:01:20.894 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:01:20.894 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:01:21.075 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:01:21.075 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:01:51.089 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:01:51.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:01:51.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:01:51.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:01:51.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:01:51.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:01:51.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-05-29T19:01:51.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:01:51.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-05-29T19:01:51.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:01:51.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:01:51.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:01:51.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-05-29T19:01:53.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-05-29T19:01:53.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:01:53.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:01:53.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:01:53.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:01:53.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:01:53.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:01:53.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:01:53.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:01:53.915 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:01:53.915 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:01:53.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:01:54.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:01:54.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:01:54.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:01:54.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:01:54.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T19:01:54.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:01:54.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T19:01:54.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:01:54.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:01:54.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:01:54.178 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:01:54.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:01:42
2026-05-29T19:01:54.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72617, datetime.datetime(2026, 5, 29, 19, 1, 42), datetime.datetime(2026, 5, 29, 19, 1, 41), 'salt', 8.78, 78.88, None, 14.43, 44.83, 3.46, 832.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:01:54.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:01:54.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:01:54.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:01:41, diff=13.249012s, valid=True
2026-05-29T19:01:54.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:01:54.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T19:01:54.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:02:12, diff=-17.748067s, valid=True
2026-05-29T19:01:54.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:01:54.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:01:54.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:01:41, diff=13.258693s, valid=True
2026-05-29T19:01:54.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:01:54.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:01:54.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:01:54.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:01:54.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:01:54.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T19:01:54.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:02:12, diff=-17.738206s, valid=True
2026-05-29T19:01:54.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:01:54.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:01:54.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:01:54.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006756.262456s, valid=True
2026-05-29T19:01:54.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:01:54.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:01:54.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:01:54.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:01:54.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:01:54.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:01:54.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:01:54.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:01:54.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:01:54.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:01:54.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:01:54.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:01:54.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:01:54.579 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:01:54.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:01:55.161 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:01:55.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:01:55.264 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:01:55.264 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:01:55.471 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:01:55.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:02:25.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:02:25.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:02:25.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:02:25.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:02:25.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:02:25.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:02:25.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-05-29T19:02:25.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:02:25.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-05-29T19:02:25.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:02:25.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:02:25.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:02:25.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-05-29T19:02:28.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:02:28.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:02:28.278 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:02:28.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:02:28.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:02:28.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:02:28.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:02:28.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:02:28.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:02:28.298 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:02:28.298 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:02:28.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:02:28.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:02:28.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:02:28.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:02:28.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:02:28.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T19:02:28.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:02:28.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T19:02:28.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:02:28.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:02:28.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:02:28.551 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:02:28.609 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:02:12
2026-05-29T19:02:28.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72618, datetime.datetime(2026, 5, 29, 19, 2, 12), datetime.datetime(2026, 5, 29, 19, 2, 11), 'salt', 8.81, 79.37, None, 15.35, 49.94, 3.37, 831.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:02:28.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:02:28.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:02:28.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:02:11, diff=17.616076s, valid=True
2026-05-29T19:02:28.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:02:28.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T19:02:28.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:02:12, diff=16.618888s, valid=True
2026-05-29T19:02:28.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:02:28.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:02:28.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:02:12, diff=16.625545s, valid=True
2026-05-29T19:02:28.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:02:28.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:02:28.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:02:28.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:02:28.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:02:28.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T19:02:28.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:02:12, diff=16.628559s, valid=True
2026-05-29T19:02:28.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:02:28.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:02:28.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:02:28.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006790.629231s, valid=True
2026-05-29T19:02:28.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:02:28.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:02:28.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:02:28.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:02:28.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:02:28.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:02:28.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:02:28.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:02:28.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:02:28.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:02:28.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:02:28.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:02:28.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:02:29.013 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:02:29.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:02:29.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:02:29.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:02:29.708 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:02:29.708 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:02:29.896 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:02:29.896 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:02:59.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:02:59.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:02:59.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:03:00.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:03:00.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:03:00.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:03:00.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-05-29T19:03:00.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:03:00.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-05-29T19:03:00.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:03:00.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:03:00.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:03:00.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-05-29T19:03:02.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-05-29T19:03:02.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:03:02.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:03:02.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:03:02.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:03:02.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:03:02.867 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:03:02.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:03:02.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:03:02.867 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:03:02.867 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:03:02.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:03:02.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:03:02.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:03:03.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:03:03.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:03:03.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T19:03:03.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:03:03.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T19:03:03.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:03:03.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:03:03.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:03:03.136 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:03:03.199 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:02:42
2026-05-29T19:03:03.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72619, datetime.datetime(2026, 5, 29, 19, 2, 42), datetime.datetime(2026, 5, 29, 19, 2, 42), 'salt', 8.68, 79.74, None, 14.4, 60.13, 3.3, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:03:03.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:03:03.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:03:03.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:02:42, diff=21.205952s, valid=True
2026-05-29T19:03:03.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:03:03.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T19:03:03.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:03:12, diff=-8.791246s, valid=True
2026-05-29T19:03:03.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:03:03.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:03:03.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:02:42, diff=21.215491s, valid=True
2026-05-29T19:03:03.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:03:03.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:03:03.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:03:03.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:03:03.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:03:03.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T19:03:03.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:03:12, diff=-8.781487s, valid=True
2026-05-29T19:03:03.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:03:03.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:03:03.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:03:03.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006825.219179s, valid=True
2026-05-29T19:03:03.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:03:03.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:03:03.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:03:03.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:03:03.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:03:03.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:03:03.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:03:03.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:03:03.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:03:03.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:03:03.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:03:03.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:03:03.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:03:03.562 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:03:03.795 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:03:04.173 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:03:04.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:03:04.281 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:03:04.281 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:03:04.469 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:03:04.469 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:03:34.499 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:03:34.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:03:34.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:03:35.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:03:35.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:03:35.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:03:35.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T19:03:35.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:03:35.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T19:03:35.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:03:35.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:03:35.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:03:35.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-05-29T19:03:38.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-05-29T19:03:38.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:03:38.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:03:38.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:03:38.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:03:38.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:03:38.125 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:03:38.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:03:38.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:03:38.125 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:03:38.125 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:03:38.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:03:38.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:03:38.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:03:38.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:03:38.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:03:38.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T19:03:38.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:03:38.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T19:03:38.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:03:38.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:03:38.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:03:38.450 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:03:38.508 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:03:13
2026-05-29T19:03:38.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72620, datetime.datetime(2026, 5, 29, 19, 3, 13), datetime.datetime(2026, 5, 29, 19, 3, 12), 'salt', 8.58, 80.34, None, 15.6, 45.84, 3.19, 831.8, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T19:03:38.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:03:38.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:03:38.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:03:12, diff=26.514281s, valid=True
2026-05-29T19:03:38.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:03:38.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T19:03:38.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:03:12, diff=26.517264s, valid=True
2026-05-29T19:03:38.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:03:38.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:03:38.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:03:12, diff=26.524658s, valid=True
2026-05-29T19:03:38.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:03:38.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:03:38.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:03:38.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:03:38.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:03:38.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T19:03:38.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:03:12, diff=26.528682s, valid=True
2026-05-29T19:03:38.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:03:38.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:03:38.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:03:38.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006860.52935s, valid=True
2026-05-29T19:03:38.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:03:38.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:03:38.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:03:38.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:03:38.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:03:38.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:03:38.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:03:38.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:03:38.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:03:38.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:03:38.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:03:38.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:03:38.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:03:38.848 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:03:39.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:03:39.420 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:03:39.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:03:39.540 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:03:39.540 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:03:39.821 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:03:39.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:04:09.851 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:04:09.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:04:09.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:04:10.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:04:10.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:04:10.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:04:10.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-05-29T19:04:10.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:04:10.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T19:04:10.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:04:10.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:04:10.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:04:10.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-05-29T19:04:12.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-05-29T19:04:12.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:04:12.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:04:12.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:04:12.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:04:12.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:04:12.791 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:04:12.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:04:12.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:04:12.791 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:04:12.791 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:04:12.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:04:12.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:04:12.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:04:12.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:04:12.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:04:13.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:04:13.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:04:13.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:04:13.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:04:13.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:04:13.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:04:13.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:04:13.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:03:43
2026-05-29T19:04:13.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72621, datetime.datetime(2026, 5, 29, 19, 3, 43), datetime.datetime(2026, 5, 29, 19, 3, 42), 'salt', 8.68, 80.07, None, 18.07, 45.93, 3.24, 831.8, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T19:04:13.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:04:13.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:04:13.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:03:42, diff=31.122025s, valid=True
2026-05-29T19:04:13.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:04:13.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:04:13.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:04:12, diff=1.124887s, valid=True
2026-05-29T19:04:13.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:04:13.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:04:13.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:03:43, diff=30.131658s, valid=True
2026-05-29T19:04:13.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:04:13.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:04:13.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:04:13.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:04:13.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:04:13.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:04:13.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:04:12, diff=1.134679s, valid=True
2026-05-29T19:04:13.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:04:13.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:04:13.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:04:13.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006895.135332s, valid=True
2026-05-29T19:04:13.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:04:13.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:04:13.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:04:13.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:04:13.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:04:13.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:04:13.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:04:13.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:04:13.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:04:13.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:04:13.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:04:13.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:04:13.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:04:13.451 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:04:13.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:04:14.020 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:04:14.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:04:14.123 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:04:14.124 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:04:14.212 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:04:14.212 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:04:44.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:04:44.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:04:44.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:04:44.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:04:44.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:04:44.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:04:44.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T19:04:44.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:04: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-05-29T19:04:44.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:04:44.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:04:44.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:04: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-05-29T19:04:48.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-05-29T19:04:48.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:04:48.170 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:04:48.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:04:48.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:04:48.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:04:48.199 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:04:48.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:04:48.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:04:48.200 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:04:48.200 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:04:48.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:04:48.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:04:48.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:04:48.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:04:48.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:04:48.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:04:48.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:04:48.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:04:48.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:04:48.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:04:48.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:04:48.456 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:04:48.528 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:04:43
2026-05-29T19:04:48.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72623, datetime.datetime(2026, 5, 29, 19, 4, 43), datetime.datetime(2026, 5, 29, 19, 4, 43), 'salt', 9.01, 78.28, None, 13.13, 46.68, 3.57, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:04:48.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:04:48.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:04:48.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:04:43, diff=5.534271s, valid=True
2026-05-29T19:04:48.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:04:48.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:04:48.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:05:12, diff=-23.462903s, valid=True
2026-05-29T19:04:48.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:04:48.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:04:48.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:04:43, diff=5.543766s, valid=True
2026-05-29T19:04:48.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:04:48.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:04:48.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:04:48.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:04:48.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:04:48.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:04:48.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:05:12, diff=-23.453195s, valid=True
2026-05-29T19:04:48.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:04:48.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:04:48.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:04:48.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006930.547454s, valid=True
2026-05-29T19:04:48.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:04:48.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:04:48.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:04:48.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:04:48.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:04:48.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:04:48.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:04:48.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:04:48.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:04:48.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:04:48.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:04:48.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:04:48.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:04:48.864 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:04:49.079 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:04:49.427 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:04:49.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:04:49.528 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:04:49.528 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:04:49.788 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:04:49.788 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:05:19.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:05:19.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:05:19.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:05:19.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:05:19.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:05:20.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:05:20.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-05-29T19:05:20.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:05:20.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-05-29T19:05:20.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:05:20.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:05:20.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:05:20.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-05-29T19:05:22.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-05-29T19:05:22.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:05:22.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:05:22.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:05:22.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:05:22.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:05:22.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:05:22.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:05:22.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:05:22.771 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:05:22.771 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:05:22.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:05:22.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:05:22.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:05:22.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:05:22.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:05:22.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:05:22.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:05:23.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:05:23.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:05:23.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:05:23.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:05:23.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:05:23.106 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:05:13
2026-05-29T19:05:23.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72624, datetime.datetime(2026, 5, 29, 19, 5, 13), datetime.datetime(2026, 5, 29, 19, 5, 13), 'salt', 9.04, 77.95, None, 15.81, 31.64, 3.63, 831.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:05:23.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:05:23.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:05:23.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:05:13, diff=10.113442s, valid=True
2026-05-29T19:05:23.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:05:23.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:05:23.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:05:12, diff=11.116477s, valid=True
2026-05-29T19:05:23.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:05:23.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:05:23.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:05:13, diff=10.12381s, valid=True
2026-05-29T19:05:23.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:05:23.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:05:23.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:05:23.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:05:23.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:05:23.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:05:23.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:05:12, diff=11.127164s, valid=True
2026-05-29T19:05:23.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:05:23.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:05:23.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:05:23.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006965.127879s, valid=True
2026-05-29T19:05:23.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:05:23.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:05:23.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:05:23.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:05:23.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:05:23.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:05:23.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:05:23.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:05:23.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:05:23.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:05:23.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:05:23.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:05:23.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:05:23.451 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:05:23.668 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:05:24.080 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:05:24.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:05:24.188 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:05:24.188 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:05:24.438 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:05:24.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:05:54.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:05:54.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:05:54.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:05:54.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:05:54.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:05:54.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:05:54.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T19:05:54.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:05:54.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-05-29T19:05:54.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:05:54.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:05:54.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:05:54.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-05-29T19:05:57.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-05-29T19:05:57.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:05:57.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:05:57.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:05:57.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:05:57.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:05:57.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:05:57.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:05:57.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:05:57.320 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:05:57.320 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:05:57.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:05:57.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:05:57.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:05:57.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:05:57.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:05:57.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:05:57.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:05:57.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:05:57.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:05:57.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:05:57.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:05:57.583 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:05:57.640 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:05:44
2026-05-29T19:05:57.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72625, datetime.datetime(2026, 5, 29, 19, 5, 44), datetime.datetime(2026, 5, 29, 19, 5, 43), 'salt', 9.08, 77.29, None, 13.76, 46.0, 3.76, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:05:57.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:05:57.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:05:57.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:05:43, diff=14.648063s, valid=True
2026-05-29T19:05:57.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:05:57.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:05:57.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:06:12, diff=-14.347744s, valid=True
2026-05-29T19:05:57.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:05:57.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:05:57.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:05:44, diff=13.662201s, valid=True
2026-05-29T19:05:57.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:05:57.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:05:57.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:05:57.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:05:57.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:05:57.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:05:57.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:06:12, diff=-14.333401s, valid=True
2026-05-29T19:05:57.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:05:57.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:05:57.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:05:57.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1006999.667353s, valid=True
2026-05-29T19:05:57.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:05:57.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:05:57.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:05:57.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:05:57.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:05:57.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:05:57.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:05:57.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:05:57.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:05:57.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:05:57.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:05:57.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:05:57.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:05:57.990 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:05:58.214 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:05:58.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:05:58.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:05:58.677 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:05:58.677 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:05:58.933 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:05:58.933 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:06:28.956 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:06:28.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:06:28.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:06:29.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:06:29.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:06:29.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:06:29.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-05-29T19:06:29.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:06:29.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T19:06:29.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:06:29.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:06:29.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:06:29.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-05-29T19:06:32.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:06:32.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:06:32.279 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:06:32.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:06:32.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:06:32.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:06:32.298 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:06:32.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:06:32.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:06:32.298 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:06:32.299 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:06:32.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:06:32.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:06:32.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:06:32.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:06:32.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:06:32.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:06:32.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:06:32.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:06:32.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:06:32.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:06:32.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:06:32.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:06:32.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:06:14
2026-05-29T19:06:32.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72626, datetime.datetime(2026, 5, 29, 19, 6, 14), datetime.datetime(2026, 5, 29, 19, 6, 14), 'salt', 9.18, 76.69, None, 14.79, 49.92, 3.87, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:06:32.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:06:32.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:06:32.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:06:14, diff=18.616417s, valid=True
2026-05-29T19:06:32.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:06:32.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:06:32.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:06:12, diff=20.619287s, valid=True
2026-05-29T19:06:32.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:06:32.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:06:32.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:06:14, diff=18.625955s, valid=True
2026-05-29T19:06:32.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:06:32.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:06:32.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:06:32.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:06:32.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:06:32.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:06:32.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:06:12, diff=20.629025s, valid=True
2026-05-29T19:06:32.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:06:32.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:06:32.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:06:32.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007034.629711s, valid=True
2026-05-29T19:06:32.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:06:32.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:06:32.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:06:32.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:06:32.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:06:32.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:06:32.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:06:32.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:06:32.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:06:32.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:06:32.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:06:32.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:06:32.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:06:32.947 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:06:33.236 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:06:33.580 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:06:33.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:06:33.677 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:06:33.677 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:06:33.872 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:06:33.872 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:07:03.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:07:03.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:07:03.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:07:04.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:07:04.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:07:04.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:07:04.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-05-29T19:07:04.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:07:04.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-05-29T19:07:04.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:07:04.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:07:04.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:07:04.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-05-29T19:07:06.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-05-29T19:07:06.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:07:06.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:07:06.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:07:06.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:07:06.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:07:06.732 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:07:06.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:07:06.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:07:06.732 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:07:06.732 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:07:06.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:07:06.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:07:06.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:07:06.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:07:06.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:07:06.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:07:06.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:07:06.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:07:06.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:07:06.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:07:06.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:07:06.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:07:07.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:06:44
2026-05-29T19:07:07.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72627, datetime.datetime(2026, 5, 29, 19, 6, 44), datetime.datetime(2026, 5, 29, 19, 6, 44), 'salt', 9.18, 76.92, None, 14.86, 49.97, 3.83, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:07:07.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:07:07.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:07:07.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:06:44, diff=23.06325s, valid=True
2026-05-29T19:07:07.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:07:07.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:07:07.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:07:12, diff=-4.933921s, valid=True
2026-05-29T19:07:07.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:07:07.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:07:07.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:06:44, diff=23.072821s, valid=True
2026-05-29T19:07:07.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:07:07.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:07:07.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:07:07.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:07:07.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:07:07.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:07:07.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:07:12, diff=-4.924171s, valid=True
2026-05-29T19:07:07.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:07:07.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:07:07.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:07:07.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007069.076506s, valid=True
2026-05-29T19:07:07.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:07:07.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:07:07.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:07:07.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:07:07.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:07:07.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:07:07.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:07:07.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:07:07.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:07:07.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:07:07.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:07:07.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:07:07.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:07:07.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:07:07.619 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:07:07.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:07:08.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:07: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-05-29T19:07: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-05-29T19:07:08.261 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:07:08.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:07:38.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:07:38.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:07:38.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:07:38.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:07:38.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:07:38.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:07:38.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-05-29T19:07:38.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:07:38.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-05-29T19:07:38.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:07:38.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:07:38.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:07:38.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-05-29T19:07:41.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-05-29T19:07:41.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:07:41.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:07:41.252 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:07:41.260 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:07:41.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:07:41.272 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:07:41.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:07:41.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:07:41.272 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:07:41.272 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:07:41.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:07:41.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:07:41.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:07:41.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:07:41.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:07:41.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:07:41.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:07:41.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:07:41.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:07:41.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:07:41.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:07:41.546 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:07:41.605 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:07:14
2026-05-29T19:07:41.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72628, datetime.datetime(2026, 5, 29, 19, 7, 14), datetime.datetime(2026, 5, 29, 19, 7, 14), 'salt', 8.91, 78.41, None, 15.14, 49.36, 3.54, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:07:41.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:07:41.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:07:41.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:07:14, diff=27.612164s, valid=True
2026-05-29T19:07:41.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:07:41.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:07:41.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:07:12, diff=29.615026s, valid=True
2026-05-29T19:07:41.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:07:41.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:07:41.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:07:12, diff=29.622019s, valid=True
2026-05-29T19:07:41.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:07:41.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:07:41.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:07:41.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:07:41.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:07:41.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:07:41.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:07:12, diff=29.625129s, valid=True
2026-05-29T19:07:41.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:07:41.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:07:41.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:07:41.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007103.625803s, valid=True
2026-05-29T19:07:41.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:07:41.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:07:41.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:07:41.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:07:41.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:07:41.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:07:41.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:07:41.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:07:41.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:07:41.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:07:41.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:07:41.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:07:41.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:07:42.023 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:07:42.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:07:42.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:07:42.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:07:42.705 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:07:42.705 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:07:42.865 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:07:42.865 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:08:12.895 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:08:12.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:08:12.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:08:13.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:08:13.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:08:13.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:08:13.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-05-29T19:08:13.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:08:13.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-05-29T19:08:13.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:08:13.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:08:13.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:08:13.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-05-29T19:08:16.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-05-29T19:08:16.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:08:16.124 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:08:16.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:08:16.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:08:16.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:08:16.145 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:08:16.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:08:16.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:08:16.145 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:08:16.145 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:08:16.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:08:16.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:08:16.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:08:16.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:08:16.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:08:16.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:08:16.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:08:16.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:08:16.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:08:16.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:08:16.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:08:16.416 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:08:16.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:08:15
2026-05-29T19:08:16.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72630, datetime.datetime(2026, 5, 29, 19, 8, 15), datetime.datetime(2026, 5, 29, 19, 8, 14), 'salt', 8.81, 79.84, None, 15.81, 50.39, 3.28, 832.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:08:16.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:08:16.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:08:16.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:08:14, diff=2.487763s, valid=True
2026-05-29T19:08:16.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:08:16.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:08:16.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:08:12, diff=4.49066s, valid=True
2026-05-29T19:08:16.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:08:16.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:08:16.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:08:06, diff=10.49765s, valid=True
2026-05-29T19:08:16.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:08:16.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:08:16.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:08:16.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:08:16.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:08:16.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:08:16.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:08:12, diff=4.50079s, valid=True
2026-05-29T19:08:16.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:08:16.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:08:16.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:08:16.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007138.501467s, valid=True
2026-05-29T19:08:16.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:08:16.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:08:16.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:08:16.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:08:16.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:08:16.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:08:16.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:08:16.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:08:16.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:08:16.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:08:16.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:08:16.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:08:16.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:08:16.821 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:08:17.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:08:17.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:08:17.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:08:17.516 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:08:17.516 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:08:18.043 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:08:18.043 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:08:48.073 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:08:48.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:08:48.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:08:48.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:08:48.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:08:48.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:08:48.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-05-29T19:08:48.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:08: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-05-29T19:08:48.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:08:48.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:08:48.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:08:48.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-05-29T19:08:51.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-05-29T19:08:51.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:08:51.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:08:51.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:08:51.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:08:51.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:08:51.334 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:08:51.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:08:51.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:08:51.335 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:08:51.335 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:08:51.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:08:51.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:08:51.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:08:51.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:08:51.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:08:51.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:08:51.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:08:51.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:08:51.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:08:51.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:08:51.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:08:51.590 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:08:51.659 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:08:45
2026-05-29T19:08:51.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72631, datetime.datetime(2026, 5, 29, 19, 8, 45), datetime.datetime(2026, 5, 29, 19, 8, 45), 'salt', 8.81, 80.01, None, 15.28, 42.67, 3.25, 831.81, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T19:08:51.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:08:51.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:08:51.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:08:45, diff=6.665322s, valid=True
2026-05-29T19:08:51.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:08:51.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:08:51.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:09:12, diff=-20.331774s, valid=True
2026-05-29T19:08:51.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:08:51.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:08:51.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:08:36, diff=15.674957s, valid=True
2026-05-29T19:08:51.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:08:51.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:08:51.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:08:51.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:08:51.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:08:51.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:08:51.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:09:12, diff=-20.321988s, valid=True
2026-05-29T19:08:51.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:08:51.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:08:51.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:08:51.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007173.6787s, valid=True
2026-05-29T19:08:51.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:08:51.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:08:51.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:08:51.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:08:51.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:08:51.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:08:51.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:08:51.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:08:51.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:08:51.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:08:51.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:08:51.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:08:52.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:08:52.065 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:08:52.282 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:08:52.634 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:08:52.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:08:52.736 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:08:52.736 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:08:52.988 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:08:52.988 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:09:23.018 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:09:23.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:09:23.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:09:23.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:09:23.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:09:23.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:09:23.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-05-29T19:09:23.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:09:23.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-05-29T19:09:23.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:09:23.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:09:23.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:09:23.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-05-29T19:09:26.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-05-29T19:09:26.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:09:26.135 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:09:26.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:09:26.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:09:26.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:09:26.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:09:26.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:09:26.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:09:26.156 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:09:26.156 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:09:26.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:09:26.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:09:26.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:09:26.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:09:26.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:09:26.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:09:26.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:09:26.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:09:26.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:09:26.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:09:26.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:09:26.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:09:26.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:09:15
2026-05-29T19:09:26.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72632, datetime.datetime(2026, 5, 29, 19, 9, 15), datetime.datetime(2026, 5, 29, 19, 9, 15), 'salt', 8.65, 80.57, None, 15.03, 62.62, 3.15, 831.81, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T19:09:26.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:09:26.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:09:26.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:09:15, diff=11.541562s, valid=True
2026-05-29T19:09:26.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:09:26.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:09:26.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:09:12, diff=14.544432s, valid=True
2026-05-29T19:09:26.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:09:26.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:09:26.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:09:07, diff=19.551145s, valid=True
2026-05-29T19:09:26.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:09:26.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:09:26.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:09:26.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:09:26.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:09:26.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:09:26.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:09:12, diff=14.554203s, valid=True
2026-05-29T19:09:26.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:09:26.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:09:26.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:09:26.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007208.554873s, valid=True
2026-05-29T19:09:26.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:09:26.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:09:26.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:09:26.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:09:26.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:09:26.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:09:26.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:09:26.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:09:26.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:09:26.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:09:26.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:09:26.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:09:26.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:09:26.871 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:09:27.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:09:27.445 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:09:27.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:09:27.547 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:09:27.547 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:09:28.946 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:09:28.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:09:58.975 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:09:58.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:09:58.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:09:59.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:09:59.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:09:59.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:09:59.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-05-29T19:09:59.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:09:59.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-05-29T19:09:59.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:09:59.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:09:59.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:09:59.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-05-29T19:10:01.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-05-29T19:10:01.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:10:01.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:10:01.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:10:01.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:10:01.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:10:01.687 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:10:01.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:10:01.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:10:01.687 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:10:01.687 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:10:01.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:10:01.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:10:01.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:10:01.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:10:01.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:10:02.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:10:02.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:10:02.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:10:02.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:10:02.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:10:02.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:10:02.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:10:02.130 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:09:45
2026-05-29T19:10:02.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72633, datetime.datetime(2026, 5, 29, 19, 9, 45), datetime.datetime(2026, 5, 29, 19, 9, 45), 'salt', 8.48, 80.9, None, 13.94, 63.72, 3.08, 831.87, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T19:10:02.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:10:02.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:10:02.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:09:45, diff=17.136521s, valid=True
2026-05-29T19:10:02.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:10:02.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:10:02.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:10:12, diff=-9.860542s, valid=True
2026-05-29T19:10:02.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:10:02.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:10:02.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:09:39, diff=23.146137s, valid=True
2026-05-29T19:10:02.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:10:02.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:10:02.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:10:02.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:10:02.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:10:02.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:10:02.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:10:12, diff=-9.850652s, valid=True
2026-05-29T19:10:02.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:10:02.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:10:02.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:10:02.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007244.15001s, valid=True
2026-05-29T19:10:02.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:10:02.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:10:02.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:10:02.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:10:02.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:10:02.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:10:02.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:10:02.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:10:02.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:10:02.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:10:02.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:10:02.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:10:02.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:10:02.478 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:10:02.695 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:10:03.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:10:03.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:10:03.172 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:10:03.172 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:10:03.362 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:10:03.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:10:33.376 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:10:33.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:10:33.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:10:33.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:10:33.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:10:33.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:10:33.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-05-29T19:10:33.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:10:33.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-05-29T19:10:34.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:10:34.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:10:34.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:10:34.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-05-29T19:10:36.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-05-29T19:10:36.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:10:36.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:10:36.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:10:36.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:10:36.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:10:36.459 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:10:36.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:10:36.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:10:36.460 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:10:36.460 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:10:36.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:10:36.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:10:36.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:10:36.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:10:36.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:10:36.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:10:36.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:10:36.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:10:36.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:10:36.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:10:36.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:10:36.723 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:10:36.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:10:16
2026-05-29T19:10:36.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72634, datetime.datetime(2026, 5, 29, 19, 10, 16), datetime.datetime(2026, 5, 29, 19, 10, 15), 'salt', 8.38, 81.87, None, 13.8, 61.91, 2.91, 831.81, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T19:10:36.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:10:36.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:10:36.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:10:15, diff=21.790903s, valid=True
2026-05-29T19:10:36.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:10:36.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:10:36.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:10:12, diff=24.793748s, valid=True
2026-05-29T19:10:36.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:10:36.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:10:36.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:10:10, diff=26.800456s, valid=True
2026-05-29T19:10:36.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:10:36.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:10:36.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:10:36.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:10:36.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:10:36.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:10:36.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:10:12, diff=24.803458s, valid=True
2026-05-29T19:10:36.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:10:36.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:10:36.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:10:36.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007278.804124s, valid=True
2026-05-29T19:10:36.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:10:36.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:10:36.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:10:36.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:10:36.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:10:36.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:10:36.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:10:36.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:10:36.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:10:36.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:10:36.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:10:37.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:10:37.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:10:37.119 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:10:37.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:10:37.694 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:10:37.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:10:37.793 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:10:37.793 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:10:37.981 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:10:37.982 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:11:08.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:11:08.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:11:08.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:11:08.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:11:08.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:11:08.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:11:08.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-05-29T19:11:08.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:11:08.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-05-29T19:11:08.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:11:08.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:11:08.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:11:08.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-05-29T19:11:11.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-05-29T19:11:11.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:11:11.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:11:11.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:11:11.357 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:11:11.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:11:11.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:11:11.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:11:11.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:11:11.369 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:11:11.369 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:11:11.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:11:11.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:11:11.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:11:11.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:11:11.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:11:11.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:11:11.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:11:11.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:11:11.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:11:11.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:11:11.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:11:11.636 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:11:11.717 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:10:46
2026-05-29T19:11:11.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72635, datetime.datetime(2026, 5, 29, 19, 10, 46), datetime.datetime(2026, 5, 29, 19, 10, 46), 'salt', 8.31, 82.76, None, 13.66, 51.31, 2.75, 831.99, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T19:11:11.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:11:11.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:11:11.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:10:46, diff=25.724576s, valid=True
2026-05-29T19:11:11.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:11:11.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:11:11.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:11:12, diff=-0.272407s, valid=True
2026-05-29T19:11:11.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:11:11.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:11:11.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:10:41, diff=30.734569s, valid=True
2026-05-29T19:11:11.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:11:11.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:11:11.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:11:11.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:11:11.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:11:11.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:11:11.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:11:12, diff=-0.262204s, valid=True
2026-05-29T19:11:11.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:11:11.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:11:11.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:11:11.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007313.738489s, valid=True
2026-05-29T19:11:11.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:11:11.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:11:11.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:11:11.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:11:11.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:11:11.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:11:11.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:11:11.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:11:11.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:11:11.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:11:11.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:11:11.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:11:12.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:11:12.058 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:11:12.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:11:12.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:11:12.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:11:12.735 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:11:12.735 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:11:12.978 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:11:12.978 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:11:43.007 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:11:43.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:11:43.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:11:43.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:11:43.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:11:43.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:11:43.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-05-29T19:11:43.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:11: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-05-29T19:11:43.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:11:43.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:11:43.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:11: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-05-29T19:11:46.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-05-29T19:11:46.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:11:46.209 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:11:46.209 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:11:46.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:11:46.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:11:46.228 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:11:46.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:11:46.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:11:46.229 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:11:46.229 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:11:46.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:11:46.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:11:46.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:11:46.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:11:46.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:11:46.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:11:46.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:11:46.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:11:46.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:11:46.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:11:46.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:11:46.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:11:46.551 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:11:16
2026-05-29T19:11:46.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72636, datetime.datetime(2026, 5, 29, 19, 11, 16), datetime.datetime(2026, 5, 29, 19, 11, 16), 'salt', 8.35, 83.19, None, 14.33, 50.25, 2.68, 831.99, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T19:11:46.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:11:46.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:11:46.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:11:16, diff=30.557164s, valid=True
2026-05-29T19:11:46.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:11:46.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:11:46.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:11:12, diff=34.560023s, valid=True
2026-05-29T19:11:46.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:11:46.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:11:46.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:11:13, diff=33.566664s, valid=True
2026-05-29T19:11:46.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:11:46.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:11:46.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:11:46.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:11:46.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:11:46.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:11:46.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:11:12, diff=34.569718s, valid=True
2026-05-29T19:11:46.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:11:46.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:11:46.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:11:46.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007348.570391s, valid=True
2026-05-29T19:11:46.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:11:46.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:11:46.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:11:46.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:11:46.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:11:46.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:11:46.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:11:46.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:11:46.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:11:46.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:11:46.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:11:46.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:11:46.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:11:46.889 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:11:47.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:11:47.476 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:11:47.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:11:47.634 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:11:47.634 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:11:47.822 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:11:47.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:12:17.826 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:12:17.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:12:17.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:12:18.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:12:18.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:12:18.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:12:18.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-05-29T19:12:18.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:12:18.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-05-29T19:12:18.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:12:18.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:12:18.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:12:18.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-05-29T19:12:20.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-05-29T19:12:20.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:12:20.914 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:12:20.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:12:20.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:12:20.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:12:20.935 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:12:20.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:12:20.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:12:20.935 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:12:20.935 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:12:20.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:12:21.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:12:21.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:12:21.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:12:21.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:12:21.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:12:21.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:12:21.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:12:21.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:12:21.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:12:21.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:12:21.186 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:12:21.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:12:17
2026-05-29T19:12:21.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72638, datetime.datetime(2026, 5, 29, 19, 12, 17), datetime.datetime(2026, 5, 29, 19, 12, 16), 'salt', 8.18, 84.09, None, 15.95, 52.11, 2.52, 831.81, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T19:12:21.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:12:21.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:12:21.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:12:16, diff=5.252267s, valid=True
2026-05-29T19:12:21.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:12:21.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:12:21.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:12:12, diff=9.255128s, valid=True
2026-05-29T19:12:21.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:12:21.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:12:21.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:12:16, diff=5.261886s, valid=True
2026-05-29T19:12:21.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:12:21.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:12:21.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:12:21.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:12:21.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:12:21.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:12:21.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:12:12, diff=9.264946s, valid=True
2026-05-29T19:12:21.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:12:21.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:12:21.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:12:21.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007383.265609s, valid=True
2026-05-29T19:12:21.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:12:21.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:12:21.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:12:21.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:12:21.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:12:21.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:12:21.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:12:21.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:12:21.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:12:21.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:12:21.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:12:21.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:12:21.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:12:21.582 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:12:21.812 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:12:22.166 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:12:22.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:12:22.267 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:12:22.267 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:12:22.480 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:12:22.480 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:12:52.510 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:12:52.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:12:52.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:12:52.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:12:52.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:12:53.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:12:53.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-05-29T19:12:53.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:12:53.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-05-29T19:12:53.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:12:53.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:12:53.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:12:53.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-05-29T19:12:55.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-05-29T19:12:55.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:12:55.725 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:12:55.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:12:55.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:12:55.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:12:55.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:12:55.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:12:55.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:12:55.746 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:12:55.746 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:12:55.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:12:55.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:12:55.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:12:55.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:12:55.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:12:55.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:12:55.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:12:56.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:12:56.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:12:56.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:12:56.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:12:56.019 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:12:56.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:12:47
2026-05-29T19:12:56.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72639, datetime.datetime(2026, 5, 29, 19, 12, 47), datetime.datetime(2026, 5, 29, 19, 12, 46), 'salt', 8.28, 84.65, None, 15.21, 48.4, 2.42, 831.81, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T19:12:56.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:12:56.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:12:56.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:12:46, diff=10.084616s, valid=True
2026-05-29T19:12:56.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:12:56.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:12:56.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:13:12, diff=-15.912539s, valid=True
2026-05-29T19:12:56.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:12:56.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:12:56.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:12:37, diff=19.094128s, valid=True
2026-05-29T19:12:56.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:12:56.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:12:56.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:12:56.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:12:56.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:12:56.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:12:56.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:13:12, diff=-15.902834s, valid=True
2026-05-29T19:12:56.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:12:56.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:12:56.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:12:56.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007418.097837s, valid=True
2026-05-29T19:12:56.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:12:56.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:12:56.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:12:56.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:12:56.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:12:56.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:12:56.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:12:56.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:12:56.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:12:56.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:12:56.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:12:56.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:12:56.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:12:56.426 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:12:56.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:12:57.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:12:57.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:12:57.194 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:12:57.194 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:12:57.444 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:12:57.444 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:13:27.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:13:27.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:13:27.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:13:27.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:13:27.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:13:28.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:13:28.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-05-29T19:13:28.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:13:28.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-05-29T19:13:28.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:13:28.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:13:28.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:13:28.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-05-29T19:13:30.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-05-29T19:13:30.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:13:30.529 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:13:30.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:13:30.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:13:30.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:13:30.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:13:30.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:13:30.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:13:30.550 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:13:30.550 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:13:30.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:13:30.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:13:30.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:13:30.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:13:30.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:13:30.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:13:30.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:13:30.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:13:30.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:13:30.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:13:30.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:13:30.812 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:13:30.872 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:13:17
2026-05-29T19:13:30.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72640, datetime.datetime(2026, 5, 29, 19, 13, 17), datetime.datetime(2026, 5, 29, 19, 13, 17), 'salt', 8.25, 84.65, None, 15.63, 47.04, 2.42, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T19:13:30.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:13:30.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:13:30.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:13:17, diff=13.87928s, valid=True
2026-05-29T19:13:30.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:13:30.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:13:30.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:13:12, diff=18.882473s, valid=True
2026-05-29T19:13:30.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:13:30.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:13:30.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:13:09, diff=21.889408s, valid=True
2026-05-29T19:13:30.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:13:30.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:13:30.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:13:30.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:13:30.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:13:30.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:13:30.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:13:12, diff=18.892634s, valid=True
2026-05-29T19:13:30.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:13:30.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:13:30.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:13:30.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007452.893304s, valid=True
2026-05-29T19:13:30.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:13:30.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:13:30.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:13:30.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:13:30.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:13:30.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:13:30.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:13:30.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:13:30.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:13:31.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:13:31.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:13:31.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:13:31.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:13:31.243 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:13:31.478 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:13:31.877 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:13:31.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:13:31.990 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:13:31.990 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:13:32.251 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:13:32.252 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:14:02.268 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:14:02.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:14:02.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:14:02.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:14:02.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:14:03.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:14:03.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-05-29T19:14:03.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:14:03.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-05-29T19:14:03.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:14:03.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:14:03.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:14:03.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-05-29T19:14:05.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:14:05.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:14:05.494 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:14:05.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:14:05.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:14:05.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:14:05.514 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:14:05.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:14:05.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:14:05.514 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:14:05.514 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:14:05.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:14:05.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:14:05.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:14:05.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:14:05.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:14:05.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:14:05.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:14:05.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:14:05.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:14:05.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:14:05.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:14:05.776 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:14:05.837 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:13:47
2026-05-29T19:14:05.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72641, datetime.datetime(2026, 5, 29, 19, 13, 47), datetime.datetime(2026, 5, 29, 19, 13, 47), 'salt', 8.28, 84.72, None, 15.7, 54.43, 2.41, 831.81, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T19:14:05.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:14:05.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:14:05.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:13:47, diff=18.843475s, valid=True
2026-05-29T19:14:05.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:14:05.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:14:05.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:14:12, diff=-6.153694s, valid=True
2026-05-29T19:14:05.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:14:05.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:14:05.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:13:40, diff=25.853001s, valid=True
2026-05-29T19:14:05.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:14:05.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:14:05.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:14:05.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:14:05.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:14:05.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:14:05.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:14:12, diff=-6.143964s, valid=True
2026-05-29T19:14:05.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:14:05.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:14:05.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:14:05.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007487.856706s, valid=True
2026-05-29T19:14:05.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:14:05.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:14:05.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:14:05.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:14:05.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:14:05.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:14:05.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:14:05.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:14:05.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:14:05.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:14:06.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:14:06.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:14:06.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:14:06.184 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:14:06.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:14:06.841 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:14:06.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:14:06.942 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:14:06.942 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:14:07.125 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:14:07.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:14:37.156 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:14:37.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:14:37.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:14:37.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:14:37.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:14:37.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:14:37.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T19:14:37.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:14:37.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T19:14:37.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:14:37.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:14:37.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:14:37.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-05-29T19:14:40.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:14:40.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:14:40.126 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:14:40.126 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:14:40.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:14:40.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:14:40.146 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:14:40.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:14:40.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:14:40.147 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:14:40.147 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:14:40.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:14:40.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:14:40.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:14:40.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:14:40.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:14:40.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:14:40.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:14:40.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:14:40.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:14:40.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:14:40.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:14:40.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:14:40.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:14:17
2026-05-29T19:14:40.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72642, datetime.datetime(2026, 5, 29, 19, 14, 17), datetime.datetime(2026, 5, 29, 19, 14, 17), 'salt', 8.18, 84.52, None, 15.95, 56.35, 2.44, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T19:14:40.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:14:40.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:14:40.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:14:17, diff=23.475005s, valid=True
2026-05-29T19:14:40.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:14:40.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:14:40.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:14:12, diff=28.477867s, valid=True
2026-05-29T19:14:40.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:14:40.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:14:40.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:14:11, diff=29.4846s, valid=True
2026-05-29T19:14:40.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:14:40.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:14:40.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:14:40.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:14:40.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:14:40.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:14:40.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:14:12, diff=28.487718s, valid=True
2026-05-29T19:14:40.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:14:40.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:14:40.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:14:40.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007522.488381s, valid=True
2026-05-29T19:14:40.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:14:40.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:14:40.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:14:40.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:14:40.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:14:40.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:14:40.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:14:40.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:14:40.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:14:40.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:14:40.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:14:40.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:14:40.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:14:40.805 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:14:41.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:14:41.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:14:41.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:14:41.476 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:14:41.476 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:14:41.719 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:14:41.720 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:15:11.750 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:15:11.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:15:11.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:15:12.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:15:12.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:15:12.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:15:12.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-05-29T19:15:12.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:15:12.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-05-29T19:15:12.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:15:12.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:15:12.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:15:12.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-05-29T19:15:14.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:15:14.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:15:14.538 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:15:14.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:15:14.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:15:14.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:15:14.560 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:15:14.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:15:14.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:15:14.560 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:15:14.560 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:15:14.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:15:14.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:15:14.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:15:14.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:15:14.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:15:14.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:15:14.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:15:14.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:15:14.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:15:14.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:15:14.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:15:14.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:15:14.867 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:14:48
2026-05-29T19:15:14.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72643, datetime.datetime(2026, 5, 29, 19, 14, 48), datetime.datetime(2026, 5, 29, 19, 14, 47), 'salt', 8.48, 83.49, None, 16.44, 48.19, 2.63, 831.99, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T19:15:14.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:15:14.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:15:14.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:14:47, diff=27.87359s, valid=True
2026-05-29T19:15:14.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:15:14.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:15:14.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:15:12, diff=2.876453s, valid=True
2026-05-29T19:15:14.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:15:14.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:15:14.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:14:43, diff=31.883164s, valid=True
2026-05-29T19:15:14.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:15:14.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:15:14.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:15:14.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:15:14.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:15:14.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:15:14.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:15:12, diff=2.88626s, valid=True
2026-05-29T19:15:14.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:15:14.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:15:14.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:15:14.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007556.886938s, valid=True
2026-05-29T19:15:14.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:15:14.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:15:14.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:15:14.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:15:14.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:15:14.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:15:14.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:15:14.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:15:14.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:15:15.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:15:15.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:15:15.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:15:15.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:15:15.205 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:15:15.514 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:15:15.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:15:15.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:15:15.967 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:15:15.967 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:15:16.156 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:15:16.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:15:46.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:15:46.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:15:46.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:15:46.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:15:46.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:15:46.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:15:46.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-05-29T19:15:46.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:15:46.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T19:15:46.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:15:46.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:15:46.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:15:46.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-05-29T19:15:49.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-05-29T19:15:49.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:15:49.004 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:15:49.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:15:49.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:15:49.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:15:49.023 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:15:49.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:15:49.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:15:49.024 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:15:49.024 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:15:49.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:15:49.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:15:49.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:15:49.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:15:49.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:15:49.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:15:49.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:15:49.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:15:49.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:15:49.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:15:49.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:15:49.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:15:49.350 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:15:48
2026-05-29T19:15:49.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72645, datetime.datetime(2026, 5, 29, 19, 15, 48), datetime.datetime(2026, 5, 29, 19, 15, 48), 'salt', 8.71, 81.27, None, 17.36, 49.97, 3.02, 831.81, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T19:15:49.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:15:49.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:15:49.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:15:48, diff=1.35626s, valid=True
2026-05-29T19:15:49.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:15:49.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:15:49.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:16:12, diff=-22.640799s, valid=True
2026-05-29T19:15:49.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:15:49.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:15:49.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:15:46, diff=3.366006s, valid=True
2026-05-29T19:15:49.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:15:49.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:15:49.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:15:49.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:15:49.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:15:49.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:15:49.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:16:12, diff=-22.630868s, valid=True
2026-05-29T19:15:49.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:15:49.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:15:49.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:15:49.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007591.369813s, valid=True
2026-05-29T19:15:49.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:15:49.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:15:49.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:15:49.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:15:49.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:15:49.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:15:49.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:15:49.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:15:49.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:15:49.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:15:49.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:15:49.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:15:49.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:15:49.684 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:15:49.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:15:50.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:15:50.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:15:50.377 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:15:50.377 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:15:50.626 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:15:50.626 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:16:20.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:16:20.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:16:20.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:16:20.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:16:20.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:16:21.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:16:21.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-05-29T19:16:21.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:16:21.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-05-29T19:16:21.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:16:21.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:16:21.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:16:21.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-05-29T19:16:23.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-05-29T19:16:23.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:16:23.479 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:16:23.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:16:23.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:16:23.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:16:23.500 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:16:23.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:16:23.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:16:23.500 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:16:23.500 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:16:23.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:16:23.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:16:23.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:16:23.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:16:23.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:16:23.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:16:23.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:16:23.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:16:23.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:16:23.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:16:23.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:16:23.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:16:23.820 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:16:18
2026-05-29T19:16:23.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72646, datetime.datetime(2026, 5, 29, 19, 16, 18), datetime.datetime(2026, 5, 29, 19, 16, 18), 'salt', 8.85, 80.47, None, 17.22, 51.43, 3.17, 832.06, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T19:16:23.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:16:23.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:16:23.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:16:18, diff=5.827081s, valid=True
2026-05-29T19:16:23.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:16:23.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:16:23.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:16:12, diff=11.829888s, valid=True
2026-05-29T19:16:23.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:16:23.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:16:23.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:16:18, diff=5.836514s, valid=True
2026-05-29T19:16:23.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:16:23.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:16:23.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:16:23.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:16:23.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:16:23.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:16:23.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:16:12, diff=11.83956s, valid=True
2026-05-29T19:16:23.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:16:23.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:16:23.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:16:23.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007625.84022s, valid=True
2026-05-29T19:16:23.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:16:23.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:16:23.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:16:23.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:16:23.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:16:23.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:16:23.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:16:23.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:16:23.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:16:23.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:16:24.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:16:24.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:16:24.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:16:24.227 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:16:24.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:16:24.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:16:24.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:16:24.891 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:16:24.891 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:16:24.979 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:16:24.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:16:55.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:16:55.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:16:55.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:16:55.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:16:55.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:16:55.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:16:55.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-05-29T19:16:55.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:16:55.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-05-29T19:16:55.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:16:55.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:16:55.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:16:55.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-05-29T19:16:57.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-05-29T19:16:57.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:16:57.822 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:16:57.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:16:57.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:16:57.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:16:57.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:16:57.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:16:57.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:16:57.844 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:16:57.844 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:16:57.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:16:57.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:16:57.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:16:58.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:16:58.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:16:58.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:16:58.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:16:58.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:16:58.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:16:58.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:16:58.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:16:58.104 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:16:58.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:16:49
2026-05-29T19:16:58.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72647, datetime.datetime(2026, 5, 29, 19, 16, 49), datetime.datetime(2026, 5, 29, 19, 16, 48), 'salt', 8.98, 78.78, None, 17.15, 50.93, 3.48, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:16:58.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:16:58.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:16:58.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:16:48, diff=10.178109s, valid=True
2026-05-29T19:16:58.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:16:58.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:16:58.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:17:12, diff=-13.819022s, valid=True
2026-05-29T19:16:58.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:16:58.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:16:58.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:16:41, diff=17.187864s, valid=True
2026-05-29T19:16:58.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:16:58.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:16:58.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:16:58.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:16:58.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:16:58.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:16:58.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:17:12, diff=-13.808819s, valid=True
2026-05-29T19:16:58.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:16:58.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:16:58.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:16:58.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007660.191853s, valid=True
2026-05-29T19:16:58.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:16:58.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:16:58.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:16:58.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:16:58.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:16:58.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:16:58.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:16:58.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:16:58.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:16:58.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:16:58.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:16:58.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:16:58.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:16:58.523 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:16:58.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:16:59.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:16:59.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:16:59.216 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:16:59.216 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:16:59.437 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:16:59.437 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:17:29.467 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:17:29.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:17:29.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:17:29.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:17:29.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:17:29.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:17:29.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-05-29T19:17:29.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:17:29.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-05-29T19:17:29.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:17:29.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:17:29.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:17:29.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-05-29T19:17:32.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-05-29T19:17:32.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:17:32.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:17:32.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:17:32.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:17:32.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:17:32.336 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:17:32.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:17:32.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:17:32.336 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:17:32.337 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:17:32.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:17:32.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:17:32.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:17:32.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:17:32.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:17:32.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:17:32.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:17:32.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:17:32.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:17:32.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:17:32.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:17:32.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:17:32.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:17:19
2026-05-29T19:17:32.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72648, datetime.datetime(2026, 5, 29, 19, 17, 19), datetime.datetime(2026, 5, 29, 19, 17, 19), 'salt', 8.98, 77.99, None, 17.4, 52.98, 3.62, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:17:32.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:17:32.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:17:32.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:17:19, diff=13.654522s, valid=True
2026-05-29T19:17:32.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:17:32.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:17:32.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:17:12, diff=20.65744s, valid=True
2026-05-29T19:17:32.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:17:32.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:17:32.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:17:11, diff=21.66418s, valid=True
2026-05-29T19:17:32.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:17:32.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:17:32.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:17:32.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:17:32.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:17:32.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:17:32.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:17:12, diff=20.667307s, valid=True
2026-05-29T19:17:32.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:17:32.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:17:32.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:17:32.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007694.668003s, valid=True
2026-05-29T19:17:32.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:17:32.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:17:32.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:17:32.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:17:32.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:17:32.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:17:32.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:17:32.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:17:32.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:17:32.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:17:32.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:17:32.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:17:33.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:17:33.056 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:17:33.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:17:33.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:17:33.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:17:33.732 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:17:33.732 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:17:34.168 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:17:34.168 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:18:04.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:18:04.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:18:04.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:18:04.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:18:04.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:18:04.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:18:04.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T19:18:04.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:18: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-05-29T19:18:04.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:18:04.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:18:04.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:18:04.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-05-29T19:18:07.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:18:07.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:18:07.163 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:18:07.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:18:07.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:18:07.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:18:07.185 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:18:07.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:18:07.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:18:07.186 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:18:07.186 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:18:07.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:18:07.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:18:07.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:18:07.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:18:07.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:18:07.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:18:07.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:18:07.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:18:07.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:18:07.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:18:07.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:18:07.442 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:18:07.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:17:49
2026-05-29T19:18:07.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72649, datetime.datetime(2026, 5, 29, 19, 17, 49), datetime.datetime(2026, 5, 29, 19, 17, 49), 'salt', 9.05, 76.69, None, 16.09, 51.1, 3.87, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:18:07.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:18:07.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:18:07.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:17:49, diff=18.508118s, valid=True
2026-05-29T19:18:07.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:18:07.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:18:07.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:18:12, diff=-4.488713s, valid=True
2026-05-29T19:18:07.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:18:07.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:18:07.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:17:41, diff=26.518261s, valid=True
2026-05-29T19:18:07.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:18:07.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:18:07.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:18:07.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:18:07.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:18:07.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:18:07.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:18:12, diff=-4.47846s, valid=True
2026-05-29T19:18:07.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:18:07.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:18:07.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:18:07.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007729.522258s, valid=True
2026-05-29T19:18:07.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:18:07.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:18:07.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:18:07.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:18:07.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:18:07.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:18:07.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:18:07.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:18:07.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:18:07.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:18:07.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:18:07.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:18:07.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:18:07.964 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:18:08.182 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:18:08.533 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:18:08.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:18:08.635 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:18:08.635 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:18:08.818 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:18:08.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:18:38.849 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:18:38.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:18:38.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:18:39.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:18:39.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:18:39.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:18:39.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-05-29T19:18:39.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:18:39.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-05-29T19:18:39.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:18:39.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:18:39.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:18:39.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-05-29T19:18:41.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-05-29T19:18:41.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:18:41.740 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:18:41.740 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:18:41.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:18:41.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:18:41.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:18:41.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:18:41.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:18:41.761 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:18:41.761 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:18:41.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:18:41.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:18:41.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:18:41.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:18:41.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:18:42.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:18:42.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:18:42.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:18:42.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:18:42.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:18:42.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:18:42.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:18:42.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:18:20
2026-05-29T19:18:42.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72650, datetime.datetime(2026, 5, 29, 19, 18, 20), datetime.datetime(2026, 5, 29, 19, 18, 19), 'salt', 9.05, 76.19, None, 17.61, 51.83, 3.96, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:18:42.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:18:42.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:18:42.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:18:19, diff=23.188611s, valid=True
2026-05-29T19:18:42.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:18:42.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:18:42.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:18:12, diff=30.191485s, valid=True
2026-05-29T19:18:42.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:18:42.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:18:42.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:18:13, diff=29.198097s, valid=True
2026-05-29T19:18:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:18:42.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:18:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:18:42.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:18:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:18:42.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:18:42.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:18:12, diff=30.201143s, valid=True
2026-05-29T19:18:42.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:18:42.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:18:42.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:18:42.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007764.201801s, valid=True
2026-05-29T19:18:42.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:18:42.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:18:42.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:18:42.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:18:42.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:18:42.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:18:42.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:18:42.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:18:42.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:18:42.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:18:42.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:18:42.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:18:42.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:18:42.517 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:18:42.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:18:43.082 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:18:43.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:18:43.183 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:18:43.183 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:18:43.426 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:18:43.426 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:19:13.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:19:13.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:19:13.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:19:13.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:19:13.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:19:13.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:19: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-05-29T19:19:13.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:19:13.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-05-29T19:19:13.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:19:13.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:19:13.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:19:13.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-05-29T19:19:16.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-05-29T19:19:16.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:19:16.256 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:19:16.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:19:16.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:19:16.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:19:16.278 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:19:16.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:19:16.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:19:16.278 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:19:16.278 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:19:16.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:19:16.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:19:16.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:19:16.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:19:16.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:19:16.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:19:16.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:19:16.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:19:16.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:19:16.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:19:16.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:19:16.536 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:19:16.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:18:50
2026-05-29T19:19:16.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72651, datetime.datetime(2026, 5, 29, 19, 18, 50), datetime.datetime(2026, 5, 29, 19, 18, 49), 'salt', 9.31, 75.27, None, 16.94, 50.86, 4.14, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:19:16.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:19:16.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:19:16.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:18:49, diff=27.600844s, valid=True
2026-05-29T19:19:16.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:19:16.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:19:16.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:19:12, diff=4.603687s, valid=True
2026-05-29T19:19:16.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:19:16.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:19:16.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:18:44, diff=32.610499s, valid=True
2026-05-29T19:19:16.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:19:16.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:19:16.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:19:16.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:19:16.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:19:16.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:19:16.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:19:12, diff=4.613521s, valid=True
2026-05-29T19:19:16.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:19:16.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:19:16.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:19:16.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007798.614197s, valid=True
2026-05-29T19:19:16.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:19:16.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:19:16.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:19:16.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:19:16.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:19:16.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:19:16.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:19:16.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:19:16.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:19:16.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:19:16.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:19:16.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:19:16.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:19:16.930 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:19:17.146 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:19:17.498 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:19:17.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:19:17.599 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:19:17.599 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:19:17.782 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:19:17.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:19:47.789 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:19:47.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:19:47.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:19:48.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:19:48.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:19:48.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:19:48.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-05-29T19:19:48.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:19:48.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-05-29T19:19:48.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:19:48.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:19:48.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:19:48.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-05-29T19:19:50.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-05-29T19:19:50.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:19:50.684 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:19:50.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:19:50.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:19:50.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:19:50.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:19:50.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:19:50.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:19:50.704 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:19:50.705 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:19:50.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:19:50.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:19:50.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:19:50.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:19:50.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:19:50.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:19:50.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:19:50.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:19:50.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:19:50.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:19:50.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:19:50.963 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:19:51.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:19:50
2026-05-29T19:19:51.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72653, datetime.datetime(2026, 5, 29, 19, 19, 50), datetime.datetime(2026, 5, 29, 19, 19, 50), 'salt', 9.38, 73.94, None, 16.8, 52.58, 4.4, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:19:51.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:19:51.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:19:51.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:19:50, diff=1.028341s, valid=True
2026-05-29T19:19:51.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:19:51.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:19:51.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:20:12, diff=-20.968821s, valid=True
2026-05-29T19:19:51.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:19:51.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:19:51.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:19:47, diff=4.037776s, valid=True
2026-05-29T19:19:51.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:19:51.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:19:51.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:19:51.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:19:51.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:19:51.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:19:51.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:20:12, diff=-20.959193s, valid=True
2026-05-29T19:19:51.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:19:51.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:19:51.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:19:51.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007833.041467s, valid=True
2026-05-29T19:19:51.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:19:51.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:19:51.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:19:51.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:19:51.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:19:51.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:19:51.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:19:51.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:19:51.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:19:51.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:19:51.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:19:51.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:19:51.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:19:51.367 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:19:51.594 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:19:51.959 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:19:52.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:19:52.068 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:19:52.069 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:19:52.246 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:19:52.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:20:22.262 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:20:22.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:20:22.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:20:22.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:20:22.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:20:23.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:20:23.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-05-29T19:20:23.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:20: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-05-29T19:20:23.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:20:23.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:20:23.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:20: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-05-29T19:20:25.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-05-29T19:20:25.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:20:25.491 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:20:25.491 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:20:25.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:20:25.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:20:25.512 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:20:25.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:20:25.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:20:25.512 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:20:25.512 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:20:25.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:20:25.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:20:25.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:20:25.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:20:25.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:20:25.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:20:25.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:20:25.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:20:25.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:20:25.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:20:25.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:20:25.765 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:20:25.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:20:20
2026-05-29T19:20:25.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72654, datetime.datetime(2026, 5, 29, 19, 20, 20), datetime.datetime(2026, 5, 29, 19, 20, 20), 'salt', 9.44, 73.71, None, 16.94, 52.3, 4.44, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:20:25.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:20:25.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:20:25.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:20:20, diff=5.829799s, valid=True
2026-05-29T19:20:25.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:20:25.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:20:25.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:20:12, diff=13.832626s, valid=True
2026-05-29T19:20:25.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:20:25.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:20:25.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:20:18, diff=7.839294s, valid=True
2026-05-29T19:20:25.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:20:25.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:20:25.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:20:25.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:20:25.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:20:25.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:20:25.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:20:12, diff=13.842309s, valid=True
2026-05-29T19:20:25.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:20:25.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:20:25.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:20:25.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007867.842978s, valid=True
2026-05-29T19:20:25.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:20:25.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:20:25.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:20:25.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:20:25.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:20:25.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:20:25.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:20:25.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:20:25.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:20:25.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:20:26.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:20:26.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:20:26.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:20:26.158 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:20:26.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:20:26.781 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:20:26.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:20:26.882 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:20:26.882 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:20:27.061 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:20:27.061 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:20:57.091 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:20:57.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:20:57.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:20:57.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:20:57.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:20:57.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:20:57.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-05-29T19:20:57.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:20:57.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-05-29T19:20:57.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:20:57.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:20:57.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:20:57.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T19:21:00.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:21:00.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:21:00.063 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:21:00.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:21:00.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:21:00.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:21:00.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:21:00.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:21:00.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:21:00.085 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:21:00.085 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:21:00.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:21:00.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:21:00.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:21:00.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:21:00.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:21:00.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:21:00.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:21:00.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:21:00.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:21:00.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:21:00.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:21:00.348 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:21:00.407 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:20:51
2026-05-29T19:21:00.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72655, datetime.datetime(2026, 5, 29, 19, 20, 51), datetime.datetime(2026, 5, 29, 19, 20, 50), 'salt', 9.44, 73.28, None, 17.89, 49.46, 4.53, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:21:00.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:21:00.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:21:00.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:20:50, diff=10.413697s, valid=True
2026-05-29T19:21:00.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:21:00.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:21:00.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:21:12, diff=-11.583477s, valid=True
2026-05-29T19:21:00.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:21:00.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:21:00.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:20:50, diff=10.423211s, valid=True
2026-05-29T19:21:00.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:21:00.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:21:00.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:21:00.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:21:00.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:21:00.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:21:00.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:21:12, diff=-11.573775s, valid=True
2026-05-29T19:21:00.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:21:00.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:21:00.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:21:00.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007902.426884s, valid=True
2026-05-29T19:21:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:21:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:21:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:21:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:21:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:21:00.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:21:00.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:21:00.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:21:00.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:21:00.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:21:00.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:21:00.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:21:00.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:21:00.754 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:21:00.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:21:01.355 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:21:01.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:21:01.459 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:21:01.459 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:21:01.632 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:21:01.632 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:21:31.662 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:21:31.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:21:31.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:21:31.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:21:31.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:21:32.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:21:32.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-05-29T19:21:32.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:21:32.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-05-29T19:21:32.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:21:32.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:21:32.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:21:32.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-05-29T19:21:34.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-05-29T19:21:34.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:21:34.789 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:21:34.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:21:34.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:21:34.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:21:34.809 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:21:34.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:21:34.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:21:34.810 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:21:34.810 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:21:34.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:21:34.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:21:34.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:21:34.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:21:34.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:21:35.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:21:35.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:21:35.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:21:35.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:21:35.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:21:35.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:21:35.069 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:21:35.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:21:21
2026-05-29T19:21:35.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72656, datetime.datetime(2026, 5, 29, 19, 21, 21), datetime.datetime(2026, 5, 29, 19, 21, 20), 'salt', 9.51, 72.98, None, 17.75, 51.08, 4.59, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:21:35.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:21:35.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:21:35.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:21:20, diff=15.137534s, valid=True
2026-05-29T19:21:35.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:21:35.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:21:35.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:21:12, diff=23.14035s, valid=True
2026-05-29T19:21:35.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:21:35.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:21:35.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:21:13, diff=22.146932s, valid=True
2026-05-29T19:21:35.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:21:35.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:21:35.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:21:35.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:21:35.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:21:35.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:21:35.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:21:12, diff=23.149956s, valid=True
2026-05-29T19:21:35.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:21:35.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:21:35.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:21:35.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007937.15064s, valid=True
2026-05-29T19:21:35.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:21:35.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:21:35.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:21:35.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:21:35.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:21:35.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:21:35.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:21:35.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:21:35.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:21:35.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:21:35.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:21:35.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:21:35.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:21:35.464 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:21:35.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:21:36.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:21:36.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:21:36.207 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:21:36.207 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:21:36.393 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:21:36.393 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:22:06.423 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:22:06.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:22:06.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:22:06.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:22:06.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:22:06.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:22:06.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-05-29T19:22:06.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:22:06.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-05-29T19:22:06.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:22:06.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:22:06.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:22:06.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-05-29T19:22:09.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-05-29T19:22:09.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:22:09.286 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:22:09.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:22:09.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:22:09.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:22:09.307 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:22:09.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:22:09.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:22:09.307 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:22:09.307 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:22:09.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:22:09.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:22:09.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:22:09.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:22:09.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:22:09.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:22:09.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:22:09.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:22:09.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:22:09.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:22:09.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:22:09.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:22:09.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:21:51
2026-05-29T19:22:09.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72657, datetime.datetime(2026, 5, 29, 19, 21, 51), datetime.datetime(2026, 5, 29, 19, 21, 51), 'salt', 9.48, 72.55, None, 17.11, 52.69, 4.68, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:22:09.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:22:09.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:22:09.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:21:51, diff=18.633054s, valid=True
2026-05-29T19:22:09.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:22:09.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:22:09.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:22:12, diff=-2.364103s, valid=True
2026-05-29T19:22:09.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:22:09.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:22:09.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:21:44, diff=25.642672s, valid=True
2026-05-29T19:22:09.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:22:09.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:22:09.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:22:09.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:22:09.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:22:09.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:22:09.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:22:12, diff=-2.35427s, valid=True
2026-05-29T19:22:09.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:22:09.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:22:09.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:22:09.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1007971.64641s, valid=True
2026-05-29T19:22:09.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:22:09.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:22:09.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:22:09.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:22:09.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:22:09.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:22:09.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:22:09.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:22:09.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:22:09.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:22:09.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:22:09.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:22:09.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:22:09.979 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:22:10.205 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:22:10.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:22:10.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:22:10.658 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:22:10.658 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:22:10.842 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:22:10.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:22:40.870 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:22:40.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:22:40.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:22:41.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:22:41.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:22:41.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:22:41.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-05-29T19:22:41.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:22:41.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-05-29T19:22:41.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:22:41.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:22:41.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:22:41.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-05-29T19:22:43.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-05-29T19:22:43.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:22:43.648 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:22:43.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:22:43.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:22:43.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:22:43.678 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:22:43.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:22:43.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:22:43.678 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:22:43.678 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:22:43.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:22:43.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:22:43.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:22:43.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:22:43.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:22:43.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:22:43.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:22:43.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:22:43.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:22:43.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:22:43.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:22:43.929 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:22:43.988 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:22:21
2026-05-29T19:22:43.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72658, datetime.datetime(2026, 5, 29, 19, 22, 21), datetime.datetime(2026, 5, 29, 19, 22, 21), 'salt', 9.64, 72.32, None, 15.6, 57.72, 4.73, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:22:43.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:22:43.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:22:43.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:22:21, diff=22.994303s, valid=True
2026-05-29T19:22:43.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:22:43.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:22:43.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:22:12, diff=31.997133s, valid=True
2026-05-29T19:22:43.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:22:43.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:22:44.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:22:14, diff=30.003814s, valid=True
2026-05-29T19:22:44.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:22:44.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:22:44.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:22:44.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:22:44.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:22:44.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:22:44.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:22:12, diff=32.006845s, valid=True
2026-05-29T19:22:44.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:22:44.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:22:44.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:22:44.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008006.007502s, valid=True
2026-05-29T19:22:44.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:22:44.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:22:44.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:22:44.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:22:44.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:22:44.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:22:44.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:22:44.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:22:44.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:22:44.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:22:44.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:22:44.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:22:44.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:22:44.396 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:22:44.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:22:44.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:22:45.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:22:45.069 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:22:45.069 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:22:45.224 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:22:45.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:23:15.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:23:15.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:23:15.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:23:15.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:23:15.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:23:15.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:23:15.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-05-29T19:23:15.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:23:15.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-05-29T19:23:15.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:23:15.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:23:15.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:23:15.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-05-29T19:23:17.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-05-29T19:23:17.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:23:17.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:23:17.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:23:17.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:23:17.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:23:17.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:23:17.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:23:17.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:23:17.965 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:23:17.966 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:23:17.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:23:18.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:23:18.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:23:18.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:23:18.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:23:18.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:23:18.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:23:18.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:23:18.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:23:18.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:23:18.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:23:18.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:23:18.300 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:22:52
2026-05-29T19:23:18.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72659, datetime.datetime(2026, 5, 29, 19, 22, 52), datetime.datetime(2026, 5, 29, 19, 22, 51), 'salt', 9.64, 72.18, None, 17.22, 57.13, 4.75, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:23:18.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:23:18.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:23:18.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:22:51, diff=27.306409s, valid=True
2026-05-29T19:23:18.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:23:18.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:23:18.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:23:12, diff=6.309243s, valid=True
2026-05-29T19:23:18.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:23:18.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:23:18.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:22:45, diff=33.315844s, valid=True
2026-05-29T19:23:18.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:23:18.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:23:18.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:23:18.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:23:18.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:23:18.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:23:18.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:23:12, diff=6.318888s, valid=True
2026-05-29T19:23:18.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:23:18.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:23:18.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:23:18.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008040.319543s, valid=True
2026-05-29T19:23:18.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:23:18.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:23:18.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:23:18.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:23:18.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:23:18.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:23:18.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:23:18.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:23:18.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:23:18.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:23:18.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:23:18.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:23:18.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:23:18.637 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:23:18.857 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:23:19.213 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:23:19.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:23:19.316 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:23:19.316 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:23:19.400 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:23:19.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:23:49.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:23:49.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:23:49.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:23:49.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:23:49.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:23:49.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:23:49.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-05-29T19:23:50.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:23:50.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-05-29T19:23:50.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:23:50.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:23:50.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:23:50.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T19:23:52.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-05-29T19:23:52.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:23:52.572 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:23:52.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:23:52.582 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:23:52.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:23:52.594 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:23:52.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:23:52.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:23:52.595 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:23:52.595 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:23:52.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:23:52.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:23:52.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:23:52.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:23:52.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:23:52.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:23:52.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:23:52.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:23:52.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:23:52.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:23:52.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:23:52.847 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:23:52.905 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:23:52
2026-05-29T19:23:52.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72661, datetime.datetime(2026, 5, 29, 19, 23, 52), datetime.datetime(2026, 5, 29, 19, 23, 51), 'salt', 9.55, 71.92, None, 17.86, 51.85, 4.81, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:23:52.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:23:52.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:23:52.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:23:51, diff=1.911338s, valid=True
2026-05-29T19:23:52.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:23:52.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:23:52.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:24:12, diff=-19.08579s, valid=True
2026-05-29T19:23:52.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:23:52.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:23:52.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:23:48, diff=4.920959s, valid=True
2026-05-29T19:23:52.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:23:52.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:23:52.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:23:52.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:23:52.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:23:52.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:23:52.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:24:12, diff=-19.075991s, valid=True
2026-05-29T19:23:52.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:23:52.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:23:52.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:23:52.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008074.924679s, valid=True
2026-05-29T19:23:52.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:23:52.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:23:52.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:23:52.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:23:52.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:23:52.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:23:52.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:23:52.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:23:53.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:23:53.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:23:53.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:23:53.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:23:53.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:23:53.307 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:23:53.523 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:23:53.871 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:23:53.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:23:53.971 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:23:53.971 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:23:54.155 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:23:54.155 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:24:24.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:24:24.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:24:24.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:24:24.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:24:24.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:24:24.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:24:24.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-05-29T19:24:24.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:24:24.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-05-29T19:24:24.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:24:24.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:24:24.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:24:24.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-05-29T19:24:26.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:24:26.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:24:26.966 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:24:26.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:24:26.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:24:26.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:24:26.986 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:24:26.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:24:26.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:24:26.986 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:24:26.986 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:24:26.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:24:27.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:24:27.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:24:27.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:24:27.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:24:27.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:24:27.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:24:27.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:24:27.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:24:27.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:24:27.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:24:27.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:24:27.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:24:22
2026-05-29T19:24:27.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72662, datetime.datetime(2026, 5, 29, 19, 24, 22), datetime.datetime(2026, 5, 29, 19, 24, 21), 'salt', 9.48, 71.69, None, 15.21, 49.41, 4.85, 831.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:24:27.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:24:27.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:24:27.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:24:21, diff=6.398823s, valid=True
2026-05-29T19:24:27.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:24:27.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:24:27.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:24:12, diff=15.401684s, valid=True
2026-05-29T19:24:27.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:24:27.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:24:27.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:24:19, diff=8.408319s, valid=True
2026-05-29T19:24:27.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:24:27.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:24:27.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:24:27.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:24:27.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:24:27.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:24:27.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:24:12, diff=15.411396s, valid=True
2026-05-29T19:24:27.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:24:27.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:24:27.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:24:27.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008109.412091s, valid=True
2026-05-29T19:24:27.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:24:27.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:24:27.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:24:27.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:24:27.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:24:27.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:24:27.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:24:27.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:24:27.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:24:27.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:24:27.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:24:27.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:24:27.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:24:27.728 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:24:27.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:24:28.300 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:24:28.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:24:28.401 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:24:28.401 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:24:28.581 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:24:28.581 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:24:58.611 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:24:58.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:24:58.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:24:59.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:24:59.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:24:59.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:24:59.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-05-29T19:24:59.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:24: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-05-29T19:24:59.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:24:59.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:24:59.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:24:59.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-05-29T19:25:01.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-05-29T19:25:01.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:25:01.569 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:25:01.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:25:01.582 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:25:01.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:25:01.594 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:25:01.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:25:01.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:25:01.594 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:25:01.594 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:25:01.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:25:01.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:25:01.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:25:01.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:25:01.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:25:01.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:25:01.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:25:01.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:25:01.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:25:01.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:25:01.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:25:01.985 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:25:02.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:24:52
2026-05-29T19:25:02.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72663, datetime.datetime(2026, 5, 29, 19, 24, 52), datetime.datetime(2026, 5, 29, 19, 24, 52), 'salt', 9.71, 71.12, None, 15.88, 56.59, 4.97, 831.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:25:02.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:25:02.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:25:02.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:24:52, diff=10.060221s, valid=True
2026-05-29T19:25:02.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:25:02.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:25:02.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:25:12, diff=-9.936883s, valid=True
2026-05-29T19:25:02.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:25:02.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:25:02.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:24:51, diff=11.069868s, valid=True
2026-05-29T19:25:02.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:25:02.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:25:02.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:25:02.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:25:02.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:25:02.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:25:02.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:25:12, diff=-9.927055s, valid=True
2026-05-29T19:25:02.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:25:02.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:25:02.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:25:02.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008144.073594s, valid=True
2026-05-29T19:25:02.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:25:02.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:25:02.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:25:02.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:25:02.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:25:02.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:25:02.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:25:02.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:25:02.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:25:02.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:25:02.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:25:02.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:25:02.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:25:02.392 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:25:02.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:25:02.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:25:03.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:25: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-05-29T19:25: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-05-29T19:25:03.317 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:25:03.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:25:33.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:25:33.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:25:33.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:25:33.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:25:33.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:25:33.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:25:33.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-05-29T19:25:33.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:25:33.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-05-29T19:25:33.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:25:33.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:25:33.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:25:33.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-05-29T19:25:36.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-05-29T19:25:36.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:25:36.246 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:25:36.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:25:36.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:25:36.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:25:36.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:25:36.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:25:36.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:25:36.268 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:25:36.268 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:25:36.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:25:36.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:25:36.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:25:36.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:25:36.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:25:36.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:25:36.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:25:36.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:25:36.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:25:36.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:25:36.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:25:36.534 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:25:36.593 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:25:23
2026-05-29T19:25:36.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72664, datetime.datetime(2026, 5, 29, 19, 25, 23), datetime.datetime(2026, 5, 29, 19, 25, 22), 'salt', 9.81, 70.89, None, 16.44, 52.67, 5.02, 831.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:25:36.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:25:36.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:25:36.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:25:22, diff=14.60009s, valid=True
2026-05-29T19:25:36.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:25:36.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:25:36.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:25:12, diff=24.602939s, valid=True
2026-05-29T19:25:36.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:25:36.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:25:36.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:25:22, diff=14.609607s, valid=True
2026-05-29T19:25:36.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:25:36.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:25:36.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:25:36.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:25:36.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:25:36.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:25:36.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:25:12, diff=24.612629s, valid=True
2026-05-29T19:25:36.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:25:36.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:25:36.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:25:36.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008178.613284s, valid=True
2026-05-29T19:25:36.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:25:36.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:25:36.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:25:36.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:25:36.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:25:36.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:25:36.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:25:36.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:25:36.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:25:36.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:25:36.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:25:36.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:25:36.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:25:36.929 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:25:37.146 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:25:37.498 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:25:37.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:25:37.599 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:25:37.599 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:25:37.778 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:25:37.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:26:07.805 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:26:07.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:26:07.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:26:08.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:26:08.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:26:08.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:26:08.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-05-29T19:26:08.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:26:08.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-05-29T19:26:08.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:26:08.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:26:08.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:26:08.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-05-29T19:26:11.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:26:11.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:26:11.022 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:26:11.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:26:11.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:26:11.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:26:11.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:26:11.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:26:11.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:26:11.045 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:26:11.045 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:26:11.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:26:11.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:26:11.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:26:11.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:26:11.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:26:11.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:26:11.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:26:11.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:26:11.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:26:11.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:26:11.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:26:11.320 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:26:11.382 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:25:53
2026-05-29T19:26:11.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72665, datetime.datetime(2026, 5, 29, 19, 25, 53), datetime.datetime(2026, 5, 29, 19, 25, 53), 'salt', 9.68, 70.69, None, 16.66, 48.47, 5.06, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:26:11.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:26:11.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:26:11.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:25:53, diff=18.389199s, valid=True
2026-05-29T19:26:11.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:26:11.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:26:11.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:26:12, diff=-0.607512s, valid=True
2026-05-29T19:26:11.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:26:11.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:26:11.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:25:46, diff=25.399525s, valid=True
2026-05-29T19:26:11.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:26:11.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:26:11.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:26:11.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:26:11.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:26:11.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:26:11.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:26:12, diff=-0.597233s, valid=True
2026-05-29T19:26:11.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:26:11.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:26:11.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:26:11.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008213.403449s, valid=True
2026-05-29T19:26:11.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:26:11.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:26:11.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:26:11.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:26:11.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:26:11.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:26:11.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:26:11.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:26:11.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:26:11.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:26:11.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:26:11.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:26:11.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:26:11.785 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:26:12.052 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:26:12.480 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:26:12.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:26:12.595 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:26:12.595 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:26:12.773 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:26:12.774 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:26:42.776 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:26:42.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:26:42.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:26:43.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:26:43.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:26:43.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:26:43.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T19:26:43.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:26:43.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-05-29T19:26:43.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:26:43.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:26:43.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:26: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-05-29T19:26:45.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-05-29T19:26:45.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:26:45.873 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:26:45.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:26:45.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:26:45.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:26:45.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:26:45.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:26:45.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:26:45.895 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:26:45.895 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:26:45.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:26:45.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:26:45.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:26:46.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:26:46.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:26:46.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:26:46.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:26:46.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:26:46.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:26:46.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:26:46.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:26:46.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:26:46.227 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:26:23
2026-05-29T19:26:46.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72666, datetime.datetime(2026, 5, 29, 19, 26, 23), datetime.datetime(2026, 5, 29, 19, 26, 23), 'salt', 9.58, 70.53, None, 17.86, 48.52, 5.09, 832.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:26:46.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:26:46.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:26:46.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:26:23, diff=23.234072s, valid=True
2026-05-29T19:26:46.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:26:46.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:26:46.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:26:12, diff=34.236939s, valid=True
2026-05-29T19:26:46.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:26:46.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:26:46.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:26:16, diff=30.243677s, valid=True
2026-05-29T19:26:46.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:26:46.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:26:46.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:26:46.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:26:46.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:26:46.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:26:46.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:26:12, diff=34.246737s, valid=True
2026-05-29T19:26:46.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:26:46.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:26:46.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:26:46.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008248.247404s, valid=True
2026-05-29T19:26:46.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:26:46.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:26:46.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:26:46.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:26:46.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:26:46.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:26:46.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:26:46.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:26:46.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:26:46.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:26:46.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:26:46.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:26:46.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:26:46.565 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:26:46.782 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:26:47.195 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:26:47.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:26:47.296 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:26:47.296 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:26:47.472 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:26:47.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:27:17.489 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:27:17.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:27:17.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:27:17.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:27:17.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:27:17.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:27:17.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-05-29T19:27:17.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:27:17.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-05-29T19:27:17.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:27:17.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:27:17.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:27:17.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-05-29T19:27: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-05-29T19:27:20.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:27:20.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:27:20.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:27:20.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:27:20.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:27:20.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:27:20.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:27:20.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:27:20.316 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:27:20.316 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:27:20.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:27:20.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:27:20.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:27:20.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:27:20.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:27:20.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:27:20.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:27:20.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:27:20.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:27:20.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:27:20.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:27:20.592 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:27:20.662 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:26:53
2026-05-29T19:27:20.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72667, datetime.datetime(2026, 5, 29, 19, 26, 53), datetime.datetime(2026, 5, 29, 19, 26, 53), 'salt', 9.61, 70.13, None, 18.1, 52.84, 5.16, 831.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:27:20.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:27:20.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:27:20.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:26:53, diff=27.668755s, valid=True
2026-05-29T19:27:20.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:27:20.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:27:20.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:27:12, diff=8.671689s, valid=True
2026-05-29T19:27:20.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:27:20.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:27:20.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:26:46, diff=34.678534s, valid=True
2026-05-29T19:27:20.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:27:20.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:27:20.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:27:20.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:27:20.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:27:20.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:27:20.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:27:12, diff=8.681722s, valid=True
2026-05-29T19:27:20.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:27:20.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:27:20.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:27:20.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008282.682391s, valid=True
2026-05-29T19:27:20.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:27:20.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:27:20.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:27:20.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:27:20.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:27:20.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:27:20.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:27:20.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:27:20.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:27:20.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:27:20.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:27:20.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:27:20.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:27:21.023 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:27:21.243 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:27:21.644 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:27:21.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:27:21.784 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:27:21.784 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:27:24.708 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:27:24.708 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:27:54.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:27:54.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:27:54.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:27:54.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:27:55.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:27:55.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:27:55.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-05-29T19:27:55.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:27:55.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-05-29T19:27:55.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:27:55.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:27:55.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:27:55.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-05-29T19:27:57.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-05-29T19:27:57.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:27:57.780 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:27:57.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:27:57.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:27:57.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:27:57.801 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:27:57.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:27:57.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:27:57.802 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:27:57.802 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:27:57.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:27:57.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:27:57.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:27:57.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:27:57.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:27:58.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:27:58.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:27:58.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:27:58.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:27:58.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:27:58.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:27:58.069 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:27:58.132 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:27:54
2026-05-29T19:27:58.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72669, datetime.datetime(2026, 5, 29, 19, 27, 54), datetime.datetime(2026, 5, 29, 19, 27, 54), 'salt', 9.81, 69.43, None, 16.69, 46.34, 5.32, 831.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:27:58.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:27:58.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:27:58.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:27:54, diff=4.138182s, valid=True
2026-05-29T19:27:58.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:27:58.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:27:58.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:28:12, diff=-13.858509s, valid=True
2026-05-29T19:27:58.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:27:58.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:27:58.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:27:49, diff=9.148395s, valid=True
2026-05-29T19:27:58.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:27:58.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:27:58.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:27:58.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:27:58.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:27:58.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:27:58.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:28:12, diff=-13.848538s, valid=True
2026-05-29T19:27:58.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:27:58.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:27:58.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:27:58.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008320.152126s, valid=True
2026-05-29T19:27:58.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:27:58.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:27:58.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:27:58.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:27:58.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:27:58.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:27:58.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:27:58.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:27:58.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:27:58.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:27:58.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:27:58.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:27:58.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:27:58.464 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:27:58.764 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:27:59.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:27:59.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:27:59.210 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:27:59.210 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:27:59.470 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:27:59.470 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:28:29.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:28:29.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:28:29.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:28:29.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:28:29.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:28:29.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:28:29.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-05-29T19:28:29.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:28:29.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-05-29T19:28:29.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:28:29.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:28:29.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:28:29.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-05-29T19:28:32.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-05-29T19:28:32.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:28:32.322 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:28:32.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:28:32.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:28:32.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:28:32.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:28:32.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:28:32.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:28:32.345 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:28:32.345 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:28:32.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:28:32.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:28:32.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:28:32.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:28:32.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:28:32.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:28:32.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:28:32.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:28:32.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:28:32.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:28:32.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:28:32.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:28:32.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:28:24
2026-05-29T19:28:32.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72670, datetime.datetime(2026, 5, 29, 19, 28, 24), datetime.datetime(2026, 5, 29, 19, 28, 24), 'salt', 9.91, 69.37, None, 15.95, 47.6, 5.33, 832.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:28:32.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:28:32.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:28:32.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:28:24, diff=8.681829s, valid=True
2026-05-29T19:28:32.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:28:32.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:28:32.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:28:12, diff=20.684715s, valid=True
2026-05-29T19:28:32.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:28:32.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:28:32.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:28:20, diff=12.691494s, valid=True
2026-05-29T19:28:32.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:28:32.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:28:32.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:28:32.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:28:32.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:28:32.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:28:32.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:28:12, diff=20.694634s, valid=True
2026-05-29T19:28:32.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:28:32.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:28:32.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:28:32.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008354.695294s, valid=True
2026-05-29T19:28:32.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:28:32.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:28:32.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:28:32.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:28:32.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:28:32.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:28:32.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:28:32.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:28:32.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:28:32.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:28:32.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:28:32.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:28:32.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:28:33.020 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:28:33.239 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:28:33.597 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:28:33.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:28:33.698 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:28:33.698 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:28:33.902 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:28:33.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:29:03.932 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:29:03.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:29:03.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:29:04.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:29:04.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:29:04.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:29:04.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-05-29T19:29:04.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:29:04.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-05-29T19:29:04.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:29:04.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:29:04.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:29:04.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-05-29T19:29:06.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-05-29T19:29:06.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:29:06.813 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:29:06.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:29:06.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:29:06.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:29:06.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:29:06.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:29:06.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:29:06.834 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:29:06.834 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:29:06.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:29:06.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:29:06.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:29:07.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:29:07.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:29:07.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:29:07.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:29:07.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:29:07.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:29:07.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:29:07.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:29:07.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:29:07.172 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:28:54
2026-05-29T19:29:07.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72671, datetime.datetime(2026, 5, 29, 19, 28, 54), datetime.datetime(2026, 5, 29, 19, 28, 54), 'salt', 9.88, 69.2, None, 16.62, 47.06, 5.37, 831.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:29:07.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:29:07.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:29:07.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:28:54, diff=13.17866s, valid=True
2026-05-29T19:29:07.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:29:07.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:29:07.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:29:12, diff=-4.818534s, valid=True
2026-05-29T19:29:07.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:29:07.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:29:07.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:28:52, diff=15.188261s, valid=True
2026-05-29T19:29:07.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:29:07.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:29:07.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:29:07.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:29:07.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:29:07.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:29:07.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:29:12, diff=-4.808702s, valid=True
2026-05-29T19:29:07.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:29:07.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:29:07.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:29:07.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008389.191975s, valid=True
2026-05-29T19:29:07.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:29:07.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:29:07.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:29:07.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:29:07.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:29:07.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:29:07.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:29:07.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:29:07.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:29:07.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:29:07.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:29:07.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:29:07.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:29:07.578 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:29:07.794 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:29:08.151 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:29:08.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:29:08.253 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:29:08.253 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:29:08.443 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:29:08.444 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:29:38.474 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:29:38.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:29:38.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:29:38.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:29:38.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:29:38.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:29:38.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-05-29T19:29:38.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:29:38.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-05-29T19:29:38.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:29:38.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:29:38.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:29:38.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-05-29T19:29:41.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-05-29T19:29:41.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:29:41.276 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:29:41.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:29:41.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:29:41.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:29:41.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:29:41.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:29:41.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:29:41.297 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:29:41.297 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:29:41.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:29:41.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:29:41.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:29:41.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:29:41.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:29:41.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:29:41.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:29:41.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:29:41.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:29:41.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:29:41.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:29:41.586 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:29:41.657 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:29:25
2026-05-29T19:29:41.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72672, datetime.datetime(2026, 5, 29, 19, 29, 25), datetime.datetime(2026, 5, 29, 19, 29, 24), 'salt', 9.81, 69.33, None, 17.15, 51.31, 5.34, 831.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:29:41.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:29:41.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:29:41.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:29:24, diff=17.664801s, valid=True
2026-05-29T19:29:41.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:29:41.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:29:41.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:29:12, diff=29.668186s, valid=True
2026-05-29T19:29:41.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:29:41.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:29:41.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:29:23, diff=18.676297s, valid=True
2026-05-29T19:29:41.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:29:41.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:29:41.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:29:41.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:29:41.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:29:41.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:29:41.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:29:12, diff=29.679928s, valid=True
2026-05-29T19:29:41.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:29:41.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:29:41.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:29:41.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008423.68079s, valid=True
2026-05-29T19:29:41.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:29:41.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:29:41.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:29:41.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:29:41.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:29:41.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:29:41.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:29:41.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:29:41.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:29:41.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:29:41.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:29:41.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:29:41.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:29:42.007 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:29:42.243 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:29:42.654 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:29:42.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:29:42.788 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:29:42.788 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:29:43.023 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:29:43.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:30:13.052 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:30:13.052 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:30:13.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:30:13.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:30:13.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:30:13.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:30:13.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-05-29T19:30:13.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:30:13.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-05-29T19:30:13.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:30:13.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:30:13.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:30:13.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-05-29T19:30:15.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:30:15.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:30:15.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:30:15.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:30:15.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:30:15.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:30:15.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:30:15.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:30:15.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:30:15.908 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:30:15.908 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:30:15.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:30:15.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:30:15.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:30:16.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:30:16.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:30:16.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:30:16.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:30:16.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:30:16.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:30:16.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:30:16.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:30:16.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:30:16.235 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:29:55
2026-05-29T19:30:16.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72673, datetime.datetime(2026, 5, 29, 19, 29, 55), datetime.datetime(2026, 5, 29, 19, 29, 54), 'salt', 9.85, 69.67, None, 17.68, 47.23, 5.28, 831.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:30:16.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:30:16.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:30:16.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:29:54, diff=22.242111s, valid=True
2026-05-29T19:30:16.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:30:16.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:30:16.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:30:12, diff=4.245014s, valid=True
2026-05-29T19:30:16.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:30:16.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:30:16.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:29:55, diff=21.251753s, valid=True
2026-05-29T19:30:16.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:30:16.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:30:16.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:30:16.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:30:16.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:30:16.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:30:16.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:30:12, diff=4.254813s, valid=True
2026-05-29T19:30:16.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:30:16.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:30:16.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:30:16.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008458.255466s, valid=True
2026-05-29T19:30:16.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:30:16.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:30:16.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:30:16.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:30:16.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:30:16.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:30:16.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:30:16.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:30:16.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:30:16.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:30:16.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:30:16.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:30:16.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:30:16.638 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:30:16.879 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:30:17.234 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:30:17.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:30:17.338 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:30:17.338 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:30:17.545 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:30:17.545 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:30:47.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:30:47.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:30:47.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:30:48.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:30:48.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:30:48.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:30:48.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-05-29T19:30:48.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:30:48.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-05-29T19:30:48.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:30:48.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:30:48.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:30:48.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-05-29T19:30:51.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-05-29T19:30:51.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:30:51.466 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:30:51.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:30:51.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:30:51.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:30:51.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:30:51.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:30:51.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:30:51.489 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:30:51.489 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:30:51.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:30:51.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:30:51.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:30:51.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:30:51.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:30:51.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:30:51.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:30:51.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:30:51.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:30:51.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:30:51.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:30:51.791 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:30:51.852 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:30:25
2026-05-29T19:30:51.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72674, datetime.datetime(2026, 5, 29, 19, 30, 25), datetime.datetime(2026, 5, 29, 19, 30, 25), 'salt', 9.75, 69.8, None, 15.17, 48.8, 5.24, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:30:51.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:30:51.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:30:51.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:30:25, diff=26.858973s, valid=True
2026-05-29T19:30:51.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:30:51.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:30:51.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:30:12, diff=39.861808s, valid=True
2026-05-29T19:30:51.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:30:51.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:30:51.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:30:18, diff=33.868992s, valid=True
2026-05-29T19:30:51.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:30:51.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:30:51.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:30:51.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:30:51.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:30:51.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:30:51.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:30:12, diff=39.872144s, valid=True
2026-05-29T19:30:51.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:30:51.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:30:51.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:30:51.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008493.872853s, valid=True
2026-05-29T19:30:51.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:30:51.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:30:51.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:30:51.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:30:51.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:30:51.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:30:51.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:30:51.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:30:51.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:30:52.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:30:52.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:30:52.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:30:52.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:30:52.261 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:30:52.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:30:53.018 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:30:53.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:30:53.132 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:30:53.132 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:30:53.320 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:30:53.320 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:31:23.350 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:31:23.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:31:23.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:31:23.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:31:23.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:31:23.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:31:23.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-05-29T19:31:23.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:31: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-05-29T19:31:23.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:31:23.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:31:23.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:31:23.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-05-29T19:31:26.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-05-29T19:31:26.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:31:26.152 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:31:26.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:31:26.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:31:26.173 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:31:26.173 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:31:26.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:31:26.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:31:26.173 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:31:26.173 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:31:26.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:31:26.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:31:26.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:31:26.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:31:26.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:31:26.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:31:26.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:31:26.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:31:26.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:31:26.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:31:26.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:31:26.502 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:31:26.560 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:31:25
2026-05-29T19:31:26.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72676, datetime.datetime(2026, 5, 29, 19, 31, 25), datetime.datetime(2026, 5, 29, 19, 31, 25), 'salt', 9.68, 70.43, None, 16.9, 50.94, 5.11, 831.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:31:26.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:31:26.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:31:26.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:31:25, diff=1.56628s, valid=True
2026-05-29T19:31:26.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:31:26.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:31:26.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:31:12, diff=14.569157s, valid=True
2026-05-29T19:31:26.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:31:26.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:31:26.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:31:19, diff=7.575803s, valid=True
2026-05-29T19:31:26.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:31:26.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:31:26.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:31:26.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:31:26.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:31:26.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:31:26.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:31:12, diff=14.578812s, valid=True
2026-05-29T19:31:26.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:31:26.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:31:26.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:31:26.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008528.579462s, valid=True
2026-05-29T19:31:26.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:31:26.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:31:26.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:31:26.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:31:26.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:31:26.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:31:26.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:31:26.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:31:26.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:31:26.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:31:26.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:31:26.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:31:26.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:31:26.891 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:31:27.104 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:31:27.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:31:27.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:31:27.551 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:31:27.551 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:31:27.801 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:31:27.802 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:31:57.832 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:31:57.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:31:57.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:31:58.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:31:58.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:31:58.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:31:58.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-05-29T19:31:58.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:31:58.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-05-29T19:31:58.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:31:58.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:31:58.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:31:58.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-05-29T19:32:00.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-05-29T19:32:00.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:32:00.627 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:32:00.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:32:00.638 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:32:00.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:32:00.650 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:32:00.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:32:00.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:32:00.650 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:32:00.650 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:32:00.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:32:00.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:32:00.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:32:00.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:32:00.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:32:00.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:32:00.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:32:00.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:32:00.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:32:00.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:32:00.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:32:00.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:32:00.971 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:31:56
2026-05-29T19:32:00.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72677, datetime.datetime(2026, 5, 29, 19, 31, 56), datetime.datetime(2026, 5, 29, 19, 31, 55), 'salt', 9.71, 70.73, None, 15.67, 46.24, 5.05, 831.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:32:00.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:32:00.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:32:00.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:31:55, diff=5.977706s, valid=True
2026-05-29T19:32:00.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:32:00.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:32:00.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:32:12, diff=-11.019324s, valid=True
2026-05-29T19:32:00.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:32:00.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:32:00.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:31:50, diff=10.98734s, valid=True
2026-05-29T19:32:00.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:32:00.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:32:00.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:32:00.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:32:00.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:32:00.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:32:00.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:32:12, diff=-11.009441s, valid=True
2026-05-29T19:32:00.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:32:00.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:32:00.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:32:00.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008562.991317s, valid=True
2026-05-29T19:32:00.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:32:00.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:32:00.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:32:00.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:32:00.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:32:01.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:32:01.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:32:01.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:32:01.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:32:01.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:32:01.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:32:01.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:32:01.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:32:01.320 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:32:01.543 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:32:01.939 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:32:02.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:32:02.046 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:32:02.046 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:32:02.229 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:32:02.229 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:32:32.259 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:32:32.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:32:32.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:32:32.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:32:32.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:32:32.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:32:32.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T19:32:32.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:32:32.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-05-29T19:32:32.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:32:32.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:32:32.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:32:32.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-05-29T19:32:35.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-05-29T19:32:35.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:32:35.133 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:32:35.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:32:35.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:32:35.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:32:35.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:32:35.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:32:35.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:32:35.155 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:32:35.155 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:32:35.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:32:35.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:32:35.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:32:35.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:32:35.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:32:35.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:32:35.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:32:35.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:32:35.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:32:35.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:32:35.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:32:35.401 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:32:35.461 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:32:26
2026-05-29T19:32:35.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72678, datetime.datetime(2026, 5, 29, 19, 32, 26), datetime.datetime(2026, 5, 29, 19, 32, 26), 'salt', 9.65, 70.66, None, 15.95, 44.22, 5.06, 831.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:32:35.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:32:35.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:32:35.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:32:26, diff=9.467099s, valid=True
2026-05-29T19:32:35.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:32:35.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:32:35.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:32:12, diff=23.469903s, valid=True
2026-05-29T19:32:35.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:32:35.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:32:35.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:32:21, diff=14.476419s, valid=True
2026-05-29T19:32:35.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:32:35.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:32:35.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:32:35.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:32:35.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:32:35.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:32:35.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:32:12, diff=23.47944s, valid=True
2026-05-29T19:32:35.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:32:35.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:32:35.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:32:35.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008597.480119s, valid=True
2026-05-29T19:32:35.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:32:35.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:32:35.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:32:35.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:32:35.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:32:35.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:32:35.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:32:35.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:32:35.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:32:35.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:32:35.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:32:35.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:32:35.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:32:35.793 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:32:36.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:32:36.380 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:32:36.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:32:36.482 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:32:36.482 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:32:36.667 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:32:36.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:33:06.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:33:06.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:33:06.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:33:06.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:33:06.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:33:07.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:33:07.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-05-29T19:33:07.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:33:07.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-05-29T19:33:07.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:33:07.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:33:07.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:33:07.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-05-29T19:33:09.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-05-29T19:33:09.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:33:09.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:33:09.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:33:09.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:33:09.609 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:33:09.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:33:09.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:33:09.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:33:09.610 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:33:09.610 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:33:09.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:33:09.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:33:09.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:33:09.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:33:09.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:33:09.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:33:09.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:33:09.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:33:09.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:33:09.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:33:09.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:33:09.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:33:09.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:32:56
2026-05-29T19:33:09.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72679, datetime.datetime(2026, 5, 29, 19, 32, 56), datetime.datetime(2026, 5, 29, 19, 32, 56), 'salt', 9.61, 70.59, None, 16.48, 46.5, 5.07, 831.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:33:09.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:33:09.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:33:09.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:32:56, diff=13.934473s, valid=True
2026-05-29T19:33:09.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:33:09.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:33:09.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:33:12, diff=-2.062483s, valid=True
2026-05-29T19:33:09.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:33:09.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:33:09.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:32:52, diff=17.945017s, valid=True
2026-05-29T19:33:09.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:33:09.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:33:09.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:33:09.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:33:09.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:33:09.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:33:09.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:33:12, diff=-2.051103s, valid=True
2026-05-29T19:33:09.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:33:09.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:33:09.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:33:09.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008631.949732s, valid=True
2026-05-29T19:33:09.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:33:09.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:33:09.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:33:09.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:33:09.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:33:10.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:33:10.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:33:10.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:33:10.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:33:10.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:33:10.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:33:10.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:33:10.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:33:10.282 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:33:10.499 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:33:10.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:33:11.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:33:11.010 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:33:11.010 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:33:11.221 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:33:11.221 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:33:41.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:33:41.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:33:41.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:33:41.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:33:41.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:33:42.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:33:42.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T19:33:42.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:33:42.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-05-29T19:33:42.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:33:42.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:33:42.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:33:42.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T19:33:44.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-05-29T19:33:44.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:33:44.449 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:33:44.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:33:44.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:33:44.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:33:44.469 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:33:44.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:33:44.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:33:44.469 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:33:44.469 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:33:44.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:33:44.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:33:44.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:33:44.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:33:44.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:33:44.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:33:44.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:33:44.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:33:44.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:33:44.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:33:44.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:33:44.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:33:44.783 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:33:26
2026-05-29T19:33:44.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72680, datetime.datetime(2026, 5, 29, 19, 33, 26), datetime.datetime(2026, 5, 29, 19, 33, 26), 'salt', 9.71, 70.5, None, 15.95, 49.11, 5.09, 832.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:33:44.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:33:44.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:33:44.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:33:26, diff=18.789219s, valid=True
2026-05-29T19:33:44.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:33:44.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:33:44.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:33:12, diff=32.79208s, valid=True
2026-05-29T19:33:44.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:33:44.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:33:44.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:33:24, diff=20.798928s, valid=True
2026-05-29T19:33:44.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:33:44.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:33:44.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:33:44.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:33:44.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:33:44.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:33:44.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:33:12, diff=32.801952s, valid=True
2026-05-29T19:33:44.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:33:44.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:33:44.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:33:44.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008666.802611s, valid=True
2026-05-29T19:33:44.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:33:44.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:33:44.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:33:44.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:33:44.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:33:44.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:33:44.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:33:44.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:33:44.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:33:44.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:33:45.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:33:45.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:33:45.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:33:45.124 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:33:45.342 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:33:45.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:33:45.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:33:45.795 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:33:45.795 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:33:46.331 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:33:46.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:34:16.350 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:34:16.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:34:16.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:34:16.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:34:16.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:34:16.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:34:16.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-05-29T19:34:16.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:34:16.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-05-29T19:34:16.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:34:16.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:34:16.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:34:16.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-05-29T19:34:19.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-05-29T19:34:19.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:34:19.165 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:34:19.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:34:19.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:34:19.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:34:19.188 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:34:19.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:34:19.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:34:19.188 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:34:19.188 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:34:19.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:34:19.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:34:19.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:34:19.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:34:19.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:34:19.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:34:19.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:34:19.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:34:19.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:34:19.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:34:19.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:34:19.446 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:34:19.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:33:57
2026-05-29T19:34:19.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72681, datetime.datetime(2026, 5, 29, 19, 33, 57), datetime.datetime(2026, 5, 29, 19, 33, 56), 'salt', 9.75, 70.53, None, 17.33, 46.62, 5.09, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:34:19.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:34:19.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:34:19.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:33:56, diff=23.510244s, valid=True
2026-05-29T19:34:19.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:34:19.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:34:19.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:34:12, diff=7.513079s, valid=True
2026-05-29T19:34:19.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:34:19.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:34:19.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:33:55, diff=24.519673s, valid=True
2026-05-29T19:34:19.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:34:19.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:34:19.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:34:19.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:34:19.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:34:19.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:34:19.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:34:12, diff=7.522706s, valid=True
2026-05-29T19:34:19.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:34:19.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:34:19.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:34:19.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008701.523356s, valid=True
2026-05-29T19:34:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:34:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:34:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:34:19.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:34:19.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:34:19.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:34:19.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:34:19.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:34:19.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:34:19.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:34:19.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:34:19.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:34:19.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:34:19.837 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:34:20.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:34:20.516 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:34:20.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:34:20.617 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:34:20.617 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:34:20.813 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:34:20.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:34:50.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:34:50.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:34:50.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:34:51.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:34:51.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:34:51.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:34:51.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-05-29T19:34:51.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:34: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-05-29T19:34:51.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:34:51.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:34:51.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:34:51.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-05-29T19:34:53.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:34:53.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:34:53.875 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:34:53.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:34:53.884 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:34:53.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:34:53.897 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:34:53.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:34:53.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:34:53.897 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:34:53.897 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:34:53.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:34:53.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:34:53.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:34:54.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:34:54.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:34:54.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:34:54.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:34:54.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:34:54.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:34:54.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:34:54.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:34:54.156 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:34:54.215 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:34:27
2026-05-29T19:34:54.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72682, datetime.datetime(2026, 5, 29, 19, 34, 27), datetime.datetime(2026, 5, 29, 19, 34, 26), 'salt', 9.65, 70.73, None, 15.88, 51.15, 5.05, 831.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:34:54.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:34:54.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:34:54.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:34:26, diff=28.221382s, valid=True
2026-05-29T19:34:54.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:34:54.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:34:54.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:34:12, diff=42.224447s, valid=True
2026-05-29T19:34:54.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:34:54.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:34:54.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:34:20, diff=34.231396s, valid=True
2026-05-29T19:34:54.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:34:54.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:34:54.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:34:54.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:34:54.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:34:54.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:34:54.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:34:12, diff=42.234528s, valid=True
2026-05-29T19:34:54.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:34:54.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:34:54.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:34:54.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008736.235231s, valid=True
2026-05-29T19:34:54.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:34:54.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:34:54.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:34:54.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:34:54.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:34:54.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:34:54.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:34:54.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:34:54.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:34:54.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:34:54.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:34:54.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:34:54.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:34:54.645 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:34:54.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:34:55.213 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:34:55.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:34:55.314 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:34:55.314 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:34:55.505 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:34:55.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:35:25.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:35:25.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:35:25.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:35:26.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:35:26.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:35:26.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:35:26.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-05-29T19:35:26.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:35:26.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-05-29T19:35:26.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:35:26.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:35:26.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:35:26.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-05-29T19:35:28.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-05-29T19:35:28.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:35:28.570 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:35:28.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:35:28.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:35:28.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:35:28.590 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:35:28.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:35:28.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:35:28.591 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:35:28.591 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:35:28.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:35:28.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:35:28.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:35:28.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:35:28.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:35:28.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:35:28.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:35:28.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:35:28.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:35:28.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:35:28.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:35:28.850 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:35:28.910 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:35:27
2026-05-29T19:35:28.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72684, datetime.datetime(2026, 5, 29, 19, 35, 27), datetime.datetime(2026, 5, 29, 19, 35, 27), 'salt', 9.65, 70.89, None, 16.44, 44.69, 5.02, 831.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:35:28.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:35:28.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:35:28.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:35:27, diff=1.916332s, valid=True
2026-05-29T19:35:28.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:35:28.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:35:28.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:35:12, diff=16.919211s, valid=True
2026-05-29T19:35:28.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:35:28.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:35:28.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:35:21, diff=7.92596s, valid=True
2026-05-29T19:35:28.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:35:28.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:35:28.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:35:28.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:35:28.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:35:28.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:35:28.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:35:12, diff=16.929052s, valid=True
2026-05-29T19:35:28.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:35:28.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:35:28.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:35:28.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008770.929713s, valid=True
2026-05-29T19:35:28.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:35:28.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:35:28.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:35:28.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:35:28.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:35:28.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:35:28.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:35:28.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:35:29.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:35:29.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:35:29.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:35:29.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:35:29.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:35:29.314 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:35:29.546 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:35:29.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:35:30.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:35:30.020 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:35:30.020 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:35:30.205 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:35:30.205 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:36:00.235 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:36:00.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:36:00.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:36:00.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:36:00.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:36:00.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:36:00.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-05-29T19:36:00.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:36:00.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-05-29T19:36:00.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:36:00.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:36:00.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:36:00.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-05-29T19:36:03.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-05-29T19:36:03.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:36:03.303 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:36:03.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:36:03.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:36:03.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:36:03.323 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:36:03.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:36:03.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:36:03.324 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:36:03.324 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:36:03.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:36:03.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:36:03.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:36:03.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:36:03.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:36:03.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:36:03.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:36:03.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:36:03.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:36:03.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:36:03.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:36:03.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:36:03.660 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:35:57
2026-05-29T19:36:03.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72685, datetime.datetime(2026, 5, 29, 19, 35, 57), datetime.datetime(2026, 5, 29, 19, 35, 57), 'salt', 9.65, 71.03, None, 16.44, 44.81, 4.99, 831.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:36:03.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:36:03.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:36:03.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:35:57, diff=6.666936s, valid=True
2026-05-29T19:36:03.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:36:03.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:36:03.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:36:12, diff=-8.329866s, valid=True
2026-05-29T19:36:03.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:36:03.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:36:03.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:35:51, diff=12.677674s, valid=True
2026-05-29T19:36:03.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:36:03.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:36:03.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:36:03.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:36:03.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:36:03.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:36:03.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:36:12, diff=-8.318962s, valid=True
2026-05-29T19:36:03.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:36:03.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:36:03.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:36:03.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008805.681832s, valid=True
2026-05-29T19:36:03.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:36:03.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:36:03.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:36:03.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:36:03.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:36:03.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:36:03.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:36:03.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:36:03.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:36:03.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:36:03.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:36:03.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:36:04.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:36:04.051 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:36:04.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:36:04.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:36:04.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:36:04.771 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:36:04.771 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:36:04.955 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:36:04.955 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:36:34.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:36:34.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:36:34.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:36:35.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:36:35.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:36:35.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:36:35.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T19:36:35.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:36:35.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-05-29T19:36:35.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:36:35.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:36:35.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:36:35.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-05-29T19:36:37.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-05-29T19:36:37.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:36:37.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:36:37.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:36:37.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:36:37.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:36:37.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:36:37.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:36:37.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:36:37.820 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:36:37.820 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:36:37.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:36:37.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:36:37.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:36:37.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:36:37.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:36:38.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:36:38.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:36:38.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:36:38.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:36:38.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:36:38.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:36:38.080 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:36:38.142 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:36:28
2026-05-29T19:36:38.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72686, datetime.datetime(2026, 5, 29, 19, 36, 28), datetime.datetime(2026, 5, 29, 19, 36, 27), 'salt', 9.68, 70.96, None, 16.59, 43.75, 5.0, 831.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:36:38.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:36:38.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:36:38.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:36:27, diff=11.14899s, valid=True
2026-05-29T19:36:38.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:36:38.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:36:38.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:36:12, diff=26.151875s, valid=True
2026-05-29T19:36:38.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:36:38.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:36:38.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:36:22, diff=16.158628s, valid=True
2026-05-29T19:36:38.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:36:38.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:36:38.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:36:38.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:36:38.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:36:38.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:36:38.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:36:12, diff=26.161711s, valid=True
2026-05-29T19:36:38.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:36:38.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:36:38.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:36:38.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008840.162379s, valid=True
2026-05-29T19:36:38.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:36:38.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:36:38.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:36:38.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:36:38.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:36:38.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:36:38.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:36:38.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:36:38.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:36:38.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:36:38.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:36:38.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:36:38.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:36:38.548 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:36:38.764 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:36:39.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:36:39.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:36:39.215 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:36:39.215 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:36:39.438 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:36:39.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:37:09.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:37:09.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:37:09.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:37:10.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:37:10.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:37:10.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:37:10.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-05-29T19:37:10.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:37:10.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-05-29T19:37:10.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:37:10.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:37:10.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:37:10.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-05-29T19:37:12.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-05-29T19:37:12.615 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:37:12.615 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:37:12.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:37:12.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:37:12.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:37:12.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:37:12.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:37:12.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:37:12.636 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:37:12.636 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:37:12.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:37:12.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:37:12.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:37:12.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:37:12.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:37:12.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:37:12.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:37:12.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:37:12.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:37:12.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:37:12.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:37:12.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:37:12.949 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:36:58
2026-05-29T19:37:12.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72687, datetime.datetime(2026, 5, 29, 19, 36, 58), datetime.datetime(2026, 5, 29, 19, 36, 57), 'salt', 9.71, 71.09, None, 16.41, 47.93, 4.97, 831.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:37:12.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:37:12.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:37:12.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:36:57, diff=15.955712s, valid=True
2026-05-29T19:37:12.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:37:12.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:37:12.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:37:12, diff=0.958572s, valid=True
2026-05-29T19:37:12.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:37:12.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:37:12.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:36:54, diff=18.965446s, valid=True
2026-05-29T19:37:12.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:37:12.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:37:12.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:37:12.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:37:12.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:37:12.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:37:12.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:37:12, diff=0.9686s, valid=True
2026-05-29T19:37:12.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:37:12.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:37:12.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:37:12.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008874.969275s, valid=True
2026-05-29T19:37:12.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:37:12.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:37:12.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:37:12.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:37:12.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:37:13.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:37:13.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:37:13.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:37:13.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:37:13.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:37:13.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:37:13.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:37:13.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:37:13.287 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:37:13.494 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:37:13.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:37:13.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:37:13.934 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:37:13.935 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:37:14.184 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:37:14.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:37:44.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:37:44.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:37:44.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:37:44.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:37:44.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:37:44.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:37:44.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-05-29T19:37:44.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:37:44.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-05-29T19:37:44.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:37:44.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:37:44.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:37: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-05-29T19:37:47.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:37:47.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:37:47.115 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:37:47.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:37:47.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:37:47.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:37:47.136 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:37:47.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:37:47.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:37:47.137 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:37:47.137 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:37:47.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:37:47.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:37:47.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:37:47.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:37:47.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:37:47.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:37:47.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:37:47.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:37:47.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:37:47.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:37:47.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:37:47.456 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:37:47.516 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:37:28
2026-05-29T19:37:47.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72688, datetime.datetime(2026, 5, 29, 19, 37, 28), datetime.datetime(2026, 5, 29, 19, 37, 28), 'salt', 9.75, 71.32, None, 18.46, 41.67, 4.93, 831.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:37:47.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:37:47.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:37:47.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:37:28, diff=19.522277s, valid=True
2026-05-29T19:37:47.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:37:47.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:37:47.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:37:12, diff=35.52515s, valid=True
2026-05-29T19:37:47.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:37:47.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:37:47.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:37:25, diff=22.531777s, valid=True
2026-05-29T19:37:47.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:37:47.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:37:47.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:37:47.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:37:47.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:37:47.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:37:47.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:37:12, diff=35.534765s, valid=True
2026-05-29T19:37:47.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:37:47.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:37:47.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:37:47.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008909.535408s, valid=True
2026-05-29T19:37:47.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:37:47.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:37:47.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:37:47.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:37:47.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:37:47.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:37:47.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:37:47.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:37:47.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:37:47.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:37:47.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:37:47.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:37:47.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:37:47.850 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:37:48.059 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:37:48.402 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:37:48.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:37:48.502 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:37:48.502 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:37:48.768 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:37:48.768 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:38:18.789 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:38:18.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:38:18.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:38:19.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:38:19.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:38:19.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:38:19.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-05-29T19:38:19.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:38:19.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-05-29T19:38:19.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:38:19.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:38:19.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:38:19.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-05-29T19:38:21.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-05-29T19:38:21.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:38:21.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:38:21.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:38:21.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:38:21.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:38:21.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:38:21.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:38:21.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:38:21.816 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:38:21.816 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:38:21.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:38:21.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:38:21.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:38:21.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:38:21.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:38:22.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:38:22.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:38:22.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:38:22.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:38:22.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:38:22.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:38:22.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:38:22.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:37:58
2026-05-29T19:38:22.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72689, datetime.datetime(2026, 5, 29, 19, 37, 58), datetime.datetime(2026, 5, 29, 19, 37, 58), 'salt', 9.78, 71.39, None, 17.5, 42.35, 4.92, 832.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:38:22.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:38:22.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:38:22.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:37:58, diff=24.146487s, valid=True
2026-05-29T19:38:22.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:38:22.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:38:22.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:38:12, diff=10.149324s, valid=True
2026-05-29T19:38:22.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:38:22.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:38:22.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:37:57, diff=25.156041s, valid=True
2026-05-29T19:38:22.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:38:22.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:38:22.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:38:22.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:38:22.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:38:22.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:38:22.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:38:12, diff=10.159074s, valid=True
2026-05-29T19:38:22.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:38:22.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:38:22.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:38:22.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008944.159734s, valid=True
2026-05-29T19:38:22.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:38:22.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:38:22.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:38:22.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:38:22.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:38:22.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:38:22.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:38:22.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:38:22.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:38:22.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:38:22.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:38:22.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:38:22.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:38:22.476 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:38:22.684 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:38:23.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:38:23.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:38:23.122 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:38:23.122 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:38:23.302 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:38:23.303 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:38:53.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:38:53.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:38:53.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:38:53.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:38:53.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:38:54.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:38:54.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-05-29T19:38:54.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:38:54.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-05-29T19:38:54.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:38:54.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:38:54.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:38:54.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-05-29T19:38:56.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-05-29T19:38:56.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:38:56.481 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:38:56.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:38:56.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:38:56.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:38:56.500 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:38:56.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:38:56.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:38:56.500 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:38:56.500 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:38:56.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:38:56.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:38:56.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:38:56.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:38:56.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:38:56.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:38:56.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:38:56.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:38:56.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:38:56.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:38:56.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:38:56.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:38:56.820 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:38:28
2026-05-29T19:38:56.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72690, datetime.datetime(2026, 5, 29, 19, 38, 28), datetime.datetime(2026, 5, 29, 19, 38, 28), 'salt', 9.81, 71.49, None, 16.16, 42.82, 4.9, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:38:56.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:38:56.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:38:56.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:38:28, diff=28.826262s, valid=True
2026-05-29T19:38:56.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:38:56.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:38:56.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:38:12, diff=44.829113s, valid=True
2026-05-29T19:38:56.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:38:56.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:38:56.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:38:28, diff=28.836054s, valid=True
2026-05-29T19:38:56.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:38:56.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:38:56.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:38:56.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:38:56.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:38:56.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:38:56.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:38:12, diff=44.839405s, valid=True
2026-05-29T19:38:56.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:38:56.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:38:56.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:38:56.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1008978.840171s, valid=True
2026-05-29T19:38:56.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:38:56.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:38:56.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:38:56.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:38:56.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:38:56.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:38:56.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:38:56.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:38:56.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:38:56.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:38:57.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:38:57.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:38:57.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:38:57.160 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:38:57.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:38:57.710 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:38:57.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:38:57.805 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:38:57.805 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:38:57.993 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:38:57.994 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:39:28.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:39:28.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:39:28.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:39:28.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:39:28.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:39:28.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:39:28.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-05-29T19:39:28.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:39:28.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-05-29T19:39:28.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:39:28.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:39:28.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:39:28.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-05-29T19:39:31.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-05-29T19:39:31.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:39:31.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:39:31.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:39:31.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:39:31.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:39:31.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:39:31.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:39:31.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:39:31.187 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:39:31.187 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:39:31.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:39:31.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:39:31.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:39:31.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:39:31.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:39:31.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:39:31.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:39:31.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:39:31.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:39:31.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:39:31.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:39:31.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:39:31.505 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:39:29
2026-05-29T19:39:31.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72692, datetime.datetime(2026, 5, 29, 19, 39, 29), datetime.datetime(2026, 5, 29, 19, 39, 29), 'salt', 9.71, 71.59, None, 16.8, 41.74, 4.87, 831.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:39:31.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:39:31.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:39:31.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:39:29, diff=2.51208s, valid=True
2026-05-29T19:39:31.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:39:31.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:39:31.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:39:12, diff=19.515014s, valid=True
2026-05-29T19:39:31.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:39:31.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:39:31.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:39:23, diff=8.521836s, valid=True
2026-05-29T19:39:31.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:39:31.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:39:31.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:39:31.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:39:31.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:39:31.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:39:31.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:39:12, diff=19.524959s, valid=True
2026-05-29T19:39:31.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:39:31.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:39:31.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:39:31.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009013.525626s, valid=True
2026-05-29T19:39:31.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:39:31.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:39:31.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:39:31.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:39:31.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:39:31.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:39:31.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:39:31.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:39:31.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:39:31.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:39:31.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:39:31.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:39:31.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:39:31.860 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:39:32.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:39:32.408 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:39:32.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:39:32.508 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:39:32.509 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:39:32.747 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:39:32.747 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:40:02.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:40:02.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:40:02.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:40:03.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:40:03.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:40:03.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:40:03.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-05-29T19:40:03.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:40:03.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-05-29T19:40:03.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:40:03.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:40:03.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:40:03.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-05-29T19:40:05.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-05-29T19:40:05.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:40:05.525 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:40:05.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:40:05.536 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:40:05.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:40:05.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:40:05.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:40:05.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:40:05.550 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:40:05.550 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:40:05.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:40:05.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:40:05.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:40:05.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:40:05.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:40:05.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:40:05.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:40:05.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:40:05.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:40:05.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:40:05.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:40:05.835 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:40:05.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:39:59
2026-05-29T19:40:05.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72693, datetime.datetime(2026, 5, 29, 19, 39, 59), datetime.datetime(2026, 5, 29, 19, 39, 59), 'salt', 9.78, 71.69, None, 17.57, 43.43, 4.86, 831.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:40:05.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:40:05.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:40:05.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:39:59, diff=6.914208s, valid=True
2026-05-29T19:40:05.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:40:05.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:40:05.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:40:12, diff=-6.078361s, valid=True
2026-05-29T19:40:05.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:40:05.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:40:05.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:39:53, diff=12.938385s, valid=True
2026-05-29T19:40:05.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:40:05.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:40:05.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:40:05.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:40:05.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:40:05.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:40:05.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:40:12, diff=-6.058464s, valid=True
2026-05-29T19:40:05.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:40:05.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:40:05.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:40:05.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009047.942217s, valid=True
2026-05-29T19:40:05.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:40:05.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:40:05.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:40:05.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:40:05.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:40:06.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:40:06.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:40:06.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:40:06.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:40:06.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:40:06.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:40:06.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:40:06.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:40:06.261 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:40:06.488 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:40:06.834 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:40:06.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:40:06.934 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:40:06.934 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:40:07.116 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:40:07.116 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:40:37.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:40:37.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:40:37.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:40:37.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:40:37.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:40:37.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:40:37.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-05-29T19:40:37.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:40:37.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-05-29T19:40:37.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:40:37.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:40:37.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:40:37.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-05-29T19:40:40.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-05-29T19:40:40.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:40:40.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:40:40.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:40:40.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:40:40.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:40:40.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:40:40.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:40:40.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:40:40.291 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:40:40.291 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:40:40.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:40:40.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:40:40.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:40:40.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:40:40.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:40:40.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:40:40.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:40:40.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:40:40.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:40:40.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:40:40.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:40:40.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:40:40.613 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:40:29
2026-05-29T19:40:40.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72694, datetime.datetime(2026, 5, 29, 19, 40, 29), datetime.datetime(2026, 5, 29, 19, 40, 29), 'salt', 9.68, 71.69, None, 16.44, 43.07, 4.85, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:40:40.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:40:40.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:40:40.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:40:29, diff=11.619212s, valid=True
2026-05-29T19:40:40.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:40:40.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:40:40.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:40:12, diff=28.62214s, valid=True
2026-05-29T19:40:40.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:40:40.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:40:40.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:40:24, diff=16.629038s, valid=True
2026-05-29T19:40:40.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:40:40.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:40:40.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:40:40.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:40:40.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:40:40.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:40:40.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:40:12, diff=28.632152s, valid=True
2026-05-29T19:40:40.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:40:40.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:40:40.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:40:40.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009082.632869s, valid=True
2026-05-29T19:40:40.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:40:40.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:40:40.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:40:40.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:40:40.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:40:40.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:40:40.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:40:40.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:40:40.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:40:40.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:40:40.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:40:40.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:40:40.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:40:40.950 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:40:41.161 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:40:41.564 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:40:41.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:40:41.666 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:40:41.666 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:40:41.897 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:40:41.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:41:11.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:41:11.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:41:11.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:41:12.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:41:12.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:41:12.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:41:12.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-05-29T19:41:12.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:41:12.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-05-29T19:41:12.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:41:12.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:41:12.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:41:12.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-05-29T19:41:14.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-05-29T19:41:14.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:41:14.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:41:14.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:41:14.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:41:14.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:41:14.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:41:14.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:41:14.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:41:14.765 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:41:14.765 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:41:14.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:41:14.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:41:14.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:41:14.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:41:14.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:41:14.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:41:14.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:41:15.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:41:15.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:41:15.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:41:15.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:41:15.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:41:15.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:41:00
2026-05-29T19:41:15.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72695, datetime.datetime(2026, 5, 29, 19, 41), datetime.datetime(2026, 5, 29, 19, 40, 59), 'salt', 9.65, 71.69, None, 16.8, 42.63, 4.86, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:41:15.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:41:15.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:41:15.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:40:59, diff=16.088019s, valid=True
2026-05-29T19:41:15.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:41:15.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:41:15.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:41:12, diff=3.090898s, valid=True
2026-05-29T19:41:15.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:41:15.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:41:15.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:40:55, diff=20.097543s, valid=True
2026-05-29T19:41:15.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:41:15.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:41:15.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:41:15.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:41:15.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:41:15.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:41:15.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:41:12, diff=3.100606s, valid=True
2026-05-29T19:41:15.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:41:15.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:41:15.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:41:15.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009117.10127s, valid=True
2026-05-29T19:41:15.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:41:15.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:41:15.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:41:15.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:41:15.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:41:15.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:41:15.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:41:15.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:41:15.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:41:15.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:41:15.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:41:15.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:41:15.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:41:15.414 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:41:15.646 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:41:15.999 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:41:16.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:41:16.102 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:41:16.102 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:41:16.285 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:41:16.285 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:41:46.315 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:41:46.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:41:46.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:41:46.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:41:46.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:41:46.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:41:46.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-05-29T19:41:46.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:41:46.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-05-29T19:41:46.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:41:46.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:41:46.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:41:46.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T19:41:49.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-05-29T19:41:49.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:41:49.169 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:41:49.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:41:49.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:41:49.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:41:49.190 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:41:49.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:41:49.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:41:49.191 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:41:49.191 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:41:49.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:41:49.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:41:49.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:41:49.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:41:49.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:41:49.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:41:49.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:41:49.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:41:49.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:41:49.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:41:49.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:41:49.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:41:49.528 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:41:30
2026-05-29T19:41:49.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72696, datetime.datetime(2026, 5, 29, 19, 41, 30), datetime.datetime(2026, 5, 29, 19, 41, 29), 'salt', 9.61, 71.96, None, 16.3, 43.5, 4.8, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:41:49.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:41:49.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:41:49.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:41:29, diff=20.534328s, valid=True
2026-05-29T19:41:49.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:41:49.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:41:49.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:41:12, diff=37.537164s, valid=True
2026-05-29T19:41:49.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:41:49.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:41:49.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:41:27, diff=22.543729s, valid=True
2026-05-29T19:41:49.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:41:49.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:41:49.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:41:49.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:41:49.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:41:49.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:41:49.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:41:12, diff=37.546746s, valid=True
2026-05-29T19:41:49.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:41:49.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:41:49.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:41:49.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009151.547407s, valid=True
2026-05-29T19:41:49.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:41:49.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:41:49.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:41:49.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:41:49.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:41:49.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:41:49.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:41:49.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:41:49.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:41:49.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:41:49.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:41:49.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:41:49.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:41:49.868 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:41:50.179 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:41:50.539 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:41:50.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:41:50.638 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:41:50.638 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:41:50.819 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:41:50.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:42:20.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:42:20.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:42:20.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:42:21.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:42:21.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:42:21.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:42:21.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T19:42:21.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:42:21.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-05-29T19:42:21.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:42:21.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:42:21.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:42:21.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-05-29T19:42:28.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-05-29T19:42:28.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:42:28.981 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:42:28.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:42:28.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:42:29.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:42:29.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:42:29.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:42:29.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:42:29.002 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:42:29.002 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:42:29.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:42:29.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:42:29.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:42:29.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:42:29.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:42:29.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:42:29.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:42:29.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:42:29.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:42:29.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:42:29.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:42:29.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:42:29.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:42:00
2026-05-29T19:42:29.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72697, datetime.datetime(2026, 5, 29, 19, 42), datetime.datetime(2026, 5, 29, 19, 42), 'salt', 9.61, 72.15, None, 16.23, 42.16, 4.76, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:42:29.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:42:29.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:42:29.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:42:00, diff=29.442532s, valid=True
2026-05-29T19:42:29.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:42:29.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:42:29.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:42:12, diff=17.44545s, valid=True
2026-05-29T19:42:29.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:42:29.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:42:29.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:41:58, diff=31.452195s, valid=True
2026-05-29T19:42:29.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:42:29.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:42:29.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:42:29.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:42:29.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:42:29.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:42:29.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:42:12, diff=17.455237s, valid=True
2026-05-29T19:42:29.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:42:29.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:42:29.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:42:29.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009191.45591s, valid=True
2026-05-29T19:42:29.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:42:29.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:42:29.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:42:29.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:42:29.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:42:29.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:42:29.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:42:29.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:42:29.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:42:29.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:42:29.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:42:29.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:42:29.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:42:29.925 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:42:30.157 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:42:30.505 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:42:30.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:42:30.604 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:42:30.604 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:42:30.786 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:42:30.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:43:00.816 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:43:00.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:43:00.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:43:01.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:43:01.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:43:01.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:43:01.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-05-29T19:43:01.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:43:01.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-05-29T19:43:01.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:43:01.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:43:01.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:43:01.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-05-29T19:43:03.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-05-29T19:43:03.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:43:03.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:43:03.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:43:03.890 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:43:03.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:43:03.903 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:43:03.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:43:03.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:43:03.903 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:43:03.903 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:43:03.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:43:04.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:43:04.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:43:04.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:43:04.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:43:04.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:43:04.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:43:04.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:43:04.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:43:04.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:43:04.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:43:04.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:43:04.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:43:00
2026-05-29T19:43:04.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72699, datetime.datetime(2026, 5, 29, 19, 43), datetime.datetime(2026, 5, 29, 19, 43), 'salt', 9.55, 72.35, None, 16.59, 43.38, 4.72, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:43:04.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:43:04.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:43:04.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:43:00, diff=4.255872s, valid=True
2026-05-29T19:43:04.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:43:04.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:43:04.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:43:12, diff=-7.740978s, valid=True
2026-05-29T19:43:04.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:43:04.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:43:04.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:42:55, diff=9.266498s, valid=True
2026-05-29T19:43:04.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:43:04.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:43:04.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:43:04.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:43:04.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:43:04.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:43:04.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:43:12, diff=-7.730233s, valid=True
2026-05-29T19:43:04.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:43:04.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:43:04.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:43:04.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009226.270496s, valid=True
2026-05-29T19:43:04.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:43:04.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:43:04.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:43:04.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:43:04.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:43:04.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:43:04.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:43:04.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:43:04.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:43:04.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:43:04.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:43:04.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:43:04.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:43:04.621 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:43:04.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:43:05.285 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:43:05.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:43:05.385 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:43:05.385 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:43:05.565 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:43:05.565 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:43:35.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:43:35.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:43:35.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:43:36.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:43:36.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:43:36.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:43:36.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-05-29T19:43:36.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:43:36.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-05-29T19:43:36.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:43:36.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:43:36.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:43:36.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-05-29T19:43:39.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-05-29T19:43:39.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:43:39.261 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:43:39.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:43:39.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:43:39.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:43:39.276 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:43:39.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:43:39.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:43:39.276 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:43:39.276 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:43:39.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:43:39.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:43:39.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:43:39.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:43:39.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:43:39.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:43:39.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:43:39.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:43:39.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:43:39.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:43:39.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:43:39.532 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:43:39.592 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:43:31
2026-05-29T19:43:39.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72700, datetime.datetime(2026, 5, 29, 19, 43, 31), datetime.datetime(2026, 5, 29, 19, 43, 30), 'salt', 9.51, 72.59, None, 15.84, 41.39, 4.67, 832.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:43:39.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:43:39.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:43:39.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:43:30, diff=9.598066s, valid=True
2026-05-29T19:43:39.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:43:39.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:43:39.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:43:12, diff=27.600876s, valid=True
2026-05-29T19:43:39.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:43:39.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:43:39.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:43:25, diff=14.607522s, valid=True
2026-05-29T19:43:39.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:43:39.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:43:39.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:43:39.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:43:39.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:43:39.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:43:39.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:43:12, diff=27.610492s, valid=True
2026-05-29T19:43:39.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:43:39.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:43:39.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:43:39.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009261.611161s, valid=True
2026-05-29T19:43:39.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:43:39.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:43:39.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:43:39.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:43:39.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:43:39.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:43:39.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:43:39.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:43:39.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:43:39.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:43:39.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:43:39.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:43:39.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:43:39.932 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:43:40.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:43:40.489 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:43:40.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:43:40.587 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:43:40.587 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:43:40.769 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:43:40.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:44:10.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:44:10.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:44:10.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:44:11.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:44:11.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:44:11.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:44:11.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T19:44:11.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:44:11.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-05-29T19:44:11.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:44:11.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:44:11.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:44:11.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-05-29T19:44:13.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-05-29T19:44:13.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:44:13.719 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:44:13.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:44:13.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:44:13.740 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:44:13.741 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:44:13.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:44:13.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:44:13.741 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:44:13.741 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:44:13.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:44:13.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:44:13.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:44:13.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:44:13.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:44:13.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:44:13.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:44:14.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:44:14.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:44:14.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:44:14.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:44:14.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:44:14.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:44:01
2026-05-29T19:44:14.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72701, datetime.datetime(2026, 5, 29, 19, 44, 1), datetime.datetime(2026, 5, 29, 19, 44, 1), 'salt', 9.58, 72.68, None, 16.83, 42.11, 4.65, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:44:14.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:44:14.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:44:14.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:01, diff=13.072859s, valid=True
2026-05-29T19:44:14.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:44:14.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:44:14.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=2.075797s, valid=True
2026-05-29T19:44:14.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:44:14.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:44:14.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:43:56, diff=18.082519s, valid=True
2026-05-29T19:44:14.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:44:14.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:44:14.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:44:14.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:44:14.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:44:14.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:44:14.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=2.085644s, valid=True
2026-05-29T19:44:14.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:44:14.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:44:14.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:44:14.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009296.086338s, valid=True
2026-05-29T19:44:14.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:44:14.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:44:14.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:44:14.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:44:14.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:44:14.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:44:14.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:44:14.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:44:14.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:44:14.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:44:14.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:44:14.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:44:14.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:44:14.484 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:44:14.697 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:44:15.062 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:44:15.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:44:15.162 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:44:15.162 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:44:15.352 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:44:15.352 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:44:45.353 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:44:45.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:44:45.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:44:45.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:44:45.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:44:45.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:44:45.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-05-29T19:44:45.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:44:45.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-05-29T19:44:45.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:44:45.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:44:45.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:44:45.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-05-29T19:44:48.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-05-29T19:44:48.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:44:48.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:44:48.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:44:48.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:44:48.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:44:48.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:44:48.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:44:48.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:44:48.325 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:44:48.325 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:44:48.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:44:48.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:44:48.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:44:48.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:44:48.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:44:48.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:44:48.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:44:48.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:44:48.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:44:48.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:44:48.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:44:48.580 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:44:48.640 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:44:31
2026-05-29T19:44:48.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72702, datetime.datetime(2026, 5, 29, 19, 44, 31), datetime.datetime(2026, 5, 29, 19, 44, 31), 'salt', 9.55, 72.78, None, 15.95, 41.81, 4.64, 832.26, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:44:48.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:44:48.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:44:48.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:31, diff=17.646255s, valid=True
2026-05-29T19:44:48.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:44:48.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:44:48.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=36.649095s, valid=True
2026-05-29T19:44:48.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:44:48.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:44:48.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:26, diff=22.655822s, valid=True
2026-05-29T19:44:48.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:44:48.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:44:48.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:44:48.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:44:48.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:44:48.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:44:48.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=36.658852s, valid=True
2026-05-29T19:44:48.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:44:48.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:44:48.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:44:48.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009330.659508s, valid=True
2026-05-29T19:44:48.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:44:48.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:44:48.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:44:48.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:44:48.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:44:48.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:44:48.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:44:48.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:44:48.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:44:48.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:44:48.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:44:48.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:44:48.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:44:48.979 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:44:49.191 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:44:49.548 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:44:49.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:44:49.646 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:44:49.646 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:44:50.062 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:44:50.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:45:20.091 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:45:20.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:45:20.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:45:20.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:45:20.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:45:20.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:45:20.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-05-29T19:45:20.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:45:20.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-05-29T19:45:20.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:45:20.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:45:20.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:45:20.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-05-29T19:45:22.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-05-29T19:45:22.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:45:22.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:45:22.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:45:22.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:45:22.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:45:22.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:45:22.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:45:22.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:45:22.924 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:45:22.924 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:45:22.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:45:23.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:45:23.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:45:23.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:45:23.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:45:23.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T19:45:23.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:45:23.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T19:45:23.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:45:23.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:45:23.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:45:23.195 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:45:23.256 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:45:01
2026-05-29T19:45:23.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72703, datetime.datetime(2026, 5, 29, 19, 45, 1), datetime.datetime(2026, 5, 29, 19, 45, 1), 'salt', 9.55, 72.95, None, 16.09, 42.93, 4.6, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:45:23.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:45:23.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:45:23.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:45:01, diff=22.262856s, valid=True
2026-05-29T19:45:23.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:45:23.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T19:45:23.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=71.265711s, valid=True
2026-05-29T19:45:23.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:45:23.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:45:23.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:56, diff=27.272437s, valid=True
2026-05-29T19:45:23.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:45:23.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:45:23.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:45:23.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:45:23.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:45:23.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T19:45:23.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=71.275483s, valid=True
2026-05-29T19:45:23.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:45:23.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:45:23.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:45:23.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009365.276184s, valid=True
2026-05-29T19:45:23.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:45:23.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:45:23.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:45:23.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:45:23.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:45:23.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:45:23.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:45:23.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:45:23.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:45:23.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:45:23.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:45:23.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:45:23.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:45:23.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:45:23.864 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:45:24.203 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:45:24.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:45:24.301 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:45:24.301 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:45:24.776 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:45:24.776 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:45:54.806 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:45:54.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:45:54.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:45:55.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:45:55.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:45:55.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:45:55.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-05-29T19:45:55.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:45:55.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-05-29T19:45:55.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:45:55.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:45:55.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:45:55.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-05-29T19:46:14.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-05-29T19:46:14.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:46:14.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:46:14.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:46:14.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:46:14.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:46:14.615 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:46:14.615 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:46:14.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:46:14.615 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:46:14.615 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:46:14.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:46:14.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:46:14.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:46:14.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:46:14.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:46:14.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T19:46:14.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:46:14.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T19:46:14.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:46:14.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:46:14.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:46:14.882 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:46:14.949 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:46:02
2026-05-29T19:46:14.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72705, datetime.datetime(2026, 5, 29, 19, 46, 2), datetime.datetime(2026, 5, 29, 19, 46, 1), 'salt', 9.55, 73.05, None, 15.91, 43.99, 4.58, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:46:14.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:46:14.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:46:14.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:46:01, diff=13.956164s, valid=True
2026-05-29T19:46:14.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:46:14.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T19:46:14.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=122.959292s, valid=True
2026-05-29T19:46:14.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:46:14.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:46:14.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:45:59, diff=15.966613s, valid=True
2026-05-29T19:46:14.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:46:14.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:46:14.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:46:14.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:46:14.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:46:14.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T19:46:14.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=122.969911s, valid=True
2026-05-29T19:46:14.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:46:14.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:46:14.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:46:14.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009416.970685s, valid=True
2026-05-29T19:46:14.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:46:14.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:46:14.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:46:14.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:46:14.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:46:15.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:46:15.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:46:15.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:46:15.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:46:15.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:46:15.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:46:15.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:46:15.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:46:15.299 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:46:15.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:46:15.875 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:46:15.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:46:15.974 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:46:15.974 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:46:16.274 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:46:16.274 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:46:46.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:46:46.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:46:46.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:46:46.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:46:46.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:46:46.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:46:46.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-05-29T19:46:46.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:46:46.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-05-29T19:46:46.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:46:46.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:46:46.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:46:46.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-05-29T19:46:49.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-05-29T19:46:49.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:46:49.330 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:46:49.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:46:49.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:46:49.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:46:49.348 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:46:49.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:46:49.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:46:49.348 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:46:49.348 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:46:49.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:46:49.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:46:49.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:46:49.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:46:49.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:46:49.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T19:46:49.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:46:49.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T19:46:49.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:46:49.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:46:49.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:46:49.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:46:49.671 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:46:32
2026-05-29T19:46:49.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72706, datetime.datetime(2026, 5, 29, 19, 46, 32), datetime.datetime(2026, 5, 29, 19, 46, 32), 'salt', 9.61, 73.12, None, 16.62, 44.23, 4.57, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:46:49.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:46:49.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:46:49.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:46:32, diff=17.677436s, valid=True
2026-05-29T19:46:49.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:46:49.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T19:46:49.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=157.680364s, valid=True
2026-05-29T19:46:49.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:46:49.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:46:49.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:46:31, diff=18.687105s, valid=True
2026-05-29T19:46:49.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:46:49.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:46:49.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:46:49.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:46:49.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:46:49.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T19:46:49.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=157.690161s, valid=True
2026-05-29T19:46:49.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:46:49.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:46:49.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:46:49.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009451.690841s, valid=True
2026-05-29T19:46:49.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:46:49.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:46:49.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:46:49.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:46:49.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:46:49.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:46:49.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:46:49.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:46:49.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:46:49.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:46:49.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:46:50.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:46:50.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:46:50.106 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:46:50.320 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:46:50.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:46:50.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:46:50.769 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:46:50.769 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:46:51.035 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:46:51.035 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:47:21.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:47:21.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:47:21.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:47:21.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:47:21.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:47:21.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:47: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-05-29T19:47:21.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:47:21.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-05-29T19:47:21.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:47:21.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:47:21.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:47:21.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-05-29T19:47:25.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-05-29T19:47:25.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:47:25.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:47:25.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:47:25.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:47:25.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:47:25.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:47:25.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:47:25.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:47:25.033 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:47:25.033 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:47:25.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:47:25.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:47:25.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:47:25.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:47:25.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:47:25.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T19:47:25.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:47:25.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T19:47:25.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:47:25.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:47:25.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:47:25.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:47:25.358 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:47:02
2026-05-29T19:47:25.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72707, datetime.datetime(2026, 5, 29, 19, 47, 2), datetime.datetime(2026, 5, 29, 19, 47, 2), 'salt', 9.55, 73.12, None, 16.94, 45.45, 4.57, 832.26, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:47:25.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:47:25.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:47:25.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:47:02, diff=23.365029s, valid=True
2026-05-29T19:47:25.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:47:25.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T19:47:25.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=193.36785s, valid=True
2026-05-29T19:47:25.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:47:25.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:47:25.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:46:57, diff=28.374571s, valid=True
2026-05-29T19:47:25.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:47:25.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:47:25.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:47:25.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:47:25.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:47:25.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T19:47:25.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=193.377592s, valid=True
2026-05-29T19:47:25.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:47:25.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:47:25.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:47:25.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009487.378259s, valid=True
2026-05-29T19:47:25.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:47:25.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:47:25.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:47:25.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:47:25.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:47:25.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:47:25.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:47:25.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:47:25.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:47:25.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:47:25.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:47:25.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:47:25.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:47:25.712 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:47:25.927 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:47:26.275 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:47:26.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:47:26.383 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:47:26.384 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:47:26.585 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:47:26.585 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:47:56.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:47:56.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:47:56.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:47:56.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:47:56.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:47:57.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:47:57.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-05-29T19:47:57.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:47:57.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-05-29T19:47:57.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:47:57.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:47:57.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:47:57.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-05-29T19:47:59.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-05-29T19:47:59.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:47:59.533 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:47:59.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:47:59.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:47:59.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:47:59.554 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:47:59.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:47:59.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:47:59.555 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:47:59.555 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:47:59.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:47:59.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:47:59.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:47:59.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:47:59.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:47:59.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T19:47:59.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:47:59.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T19:47:59.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:47:59.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:47:59.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:47:59.871 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:47:59.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:47:32
2026-05-29T19:47:59.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72708, datetime.datetime(2026, 5, 29, 19, 47, 32), datetime.datetime(2026, 5, 29, 19, 47, 32), 'salt', 9.51, 73.25, None, 16.87, 44.18, 4.54, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:47:59.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:47:59.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:47:59.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:47:32, diff=27.937487s, valid=True
2026-05-29T19:47:59.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:47:59.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T19:47:59.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=227.940554s, valid=True
2026-05-29T19:47:59.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:47:59.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:47:59.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:47:28, diff=31.947886s, valid=True
2026-05-29T19:47:59.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:47:59.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:47:59.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:47:59.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:47:59.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:47:59.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T19:47:59.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=227.951093s, valid=True
2026-05-29T19:47:59.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:47:59.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:47:59.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:47:59.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009521.951769s, valid=True
2026-05-29T19:47:59.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:47:59.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:47:59.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:47:59.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:47:59.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:48:00.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:48:00.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:48:00.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:48:00.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:48:00.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:48:00.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:48:00.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:48:00.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:48:00.282 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:48:00.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:48:00.824 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:48:00.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:48:00.922 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:48:00.922 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:48:01.112 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:48:01.112 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:48:31.141 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:48:31.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19: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-05-29T19:48:31.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:48:31.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:48:31.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:48:31.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-05-29T19:48:31.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:48:31.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-05-29T19:48:31.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:48:31.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:48:31.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:48:31.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-05-29T19:48:48.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-05-29T19:48:48.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:48:48.038 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:48:48.038 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:48:48.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:48:48.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:48:48.058 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:48:48.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:48:48.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:48:48.058 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:48:48.058 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:48:48.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:48:48.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:48:48.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:48:48.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:48:48.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:48:48.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T19:48:48.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:48:48.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T19:48:48.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:48:48.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:48:48.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:48:48.311 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:48:48.374 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:48:33
2026-05-29T19:48:48.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72710, datetime.datetime(2026, 5, 29, 19, 48, 33), datetime.datetime(2026, 5, 29, 19, 48, 32), 'salt', 9.55, 73.85, None, 17.15, 48.26, 4.43, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:48:48.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:48:48.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:48:48.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:48:32, diff=16.380545s, valid=True
2026-05-29T19:48:48.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:48:48.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T19:48:48.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=276.383486s, valid=True
2026-05-29T19:48:48.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:48:48.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:48:48.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:48:29, diff=19.390323s, valid=True
2026-05-29T19:48:48.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:48:48.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:48:48.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:48:48.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:48:48.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:48:48.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T19:48:48.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=276.393414s, valid=True
2026-05-29T19:48:48.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:48:48.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:48:48.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:48:48.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009570.394091s, valid=True
2026-05-29T19:48:48.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:48:48.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:48:48.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:48:48.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:48:48.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:48:48.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:48:48.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:48:48.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:48:48.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:48:48.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:48:48.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:48:48.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:48:48.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:48:48.734 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:48:48.955 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:48:49.294 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:48:49.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:48:49.392 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:48:49.393 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:48:49.584 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:48:49.584 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:49:19.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:49:19.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:49:19.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:49:19.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:49:19.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:49:20.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:49:20.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-05-29T19:49:20.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:49:20.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-05-29T19:49:20.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:49:20.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:49:20.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:49:20.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-05-29T19:49:22.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-05-29T19:49:22.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:49:22.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:49:22.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:49:22.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:49:22.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:49:22.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:49:22.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:49:22.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:49:22.509 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:49:22.509 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:49:22.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:49:22.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:49:22.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:49:22.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:49:22.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:49:22.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T19:49:22.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:49:22.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T19:49:22.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:49:22.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:49:22.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:49:22.776 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:49:22.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:49:03
2026-05-29T19:49:22.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72711, datetime.datetime(2026, 5, 29, 19, 49, 3), datetime.datetime(2026, 5, 29, 19, 49, 3), 'salt', 9.51, 73.88, None, 16.9, 45.26, 4.41, 832.26, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:49:22.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:49:22.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:49:22.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:49:03, diff=19.848676s, valid=True
2026-05-29T19:49:22.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:49:22.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T19:49:22.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=310.852673s, valid=True
2026-05-29T19:49:22.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:49:22.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:49:22.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:48:59, diff=23.863123s, valid=True
2026-05-29T19:49:22.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:49:22.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:49:22.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:49:22.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:49:22.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:49:22.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T19:49:22.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:44:12, diff=310.866497s, valid=True
2026-05-29T19:49:22.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:49:22.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:49:22.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:49:22.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009604.86717s, valid=True
2026-05-29T19:49:22.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:49:22.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:49:22.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:49:22.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:49:22.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:49:22.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:49:22.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:49:22.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:49:22.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:49:23.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:49:23.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:49:23.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:49:23.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:49:23.190 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:49:23.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:49:23.746 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:49:23.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:49:23.853 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:49:23.853 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:49:24.098 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:49:24.098 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:49:54.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:49:54.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:49:54.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:49:54.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:49:54.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:49:54.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:49:54.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-05-29T19:49:54.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:49:54.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-05-29T19:49:54.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:49:54.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:49:54.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:49:54.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-05-29T19:50:06.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-05-29T19:50:06.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:50:06.123 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:50:06.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:50:06.131 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:50:06.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:50:06.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:50:06.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:50:06.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:50:06.144 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:50:06.144 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:50:06.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:50:06.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:50:06.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:50:06.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:50:06.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:50:06.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T19:50:06.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:50:06.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T19:50:06.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:50:06.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:50:06.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:50:06.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:50:06.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:50:04
2026-05-29T19:50:06.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72713, datetime.datetime(2026, 5, 29, 19, 50, 4), datetime.datetime(2026, 5, 29, 19, 50, 3), 'salt', 9.61, 74.41, None, 17.01, 45.21, 4.31, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:50:06.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:50:06.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:50:06.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:50:03, diff=3.481689s, valid=True
2026-05-29T19:50:06.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:50:06.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T19:50:06.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:50:12, diff=-5.515407s, valid=True
2026-05-29T19:50:06.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:50:06.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:50:06.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:50:01, diff=5.491381s, valid=True
2026-05-29T19:50:06.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:50:06.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:50:06.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:50:06.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:50:06.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:50:06.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T19:50:06.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:50:12, diff=-5.505519s, valid=True
2026-05-29T19:50:06.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:50:06.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:50:06.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:50:06.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009648.495154s, valid=True
2026-05-29T19:50:06.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:50:06.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:50:06.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:50:06.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:50:06.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:50:06.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:50:06.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:50:06.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:50:06.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:50:06.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:50:06.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:50:06.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:50:06.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:50:06.808 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:50:07.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:50:07.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:50:07.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:50:07.509 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:50:07.509 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:50:08.869 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:50:08.869 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:50:38.873 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:50:38.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:50:38.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:50:39.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:50:39.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:50:39.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:50:39.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-05-29T19:50:39.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:50:39.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-05-29T19:50:39.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:50:39.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:50:39.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:50:39.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-05-29T19:51:09.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-05-29T19:51:09.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:51:09.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:51:09.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:51:09.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:51:09.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:51:09.115 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:51:09.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:51:09.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:51:09.116 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:51:09.116 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:51:09.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:51:09.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:51:09.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:51:09.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:51:09.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:51:09.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:51:09.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:51:09.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:51:09.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:51:09.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:51:09.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:51:09.387 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:51:09.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:51:04
2026-05-29T19:51:09.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72715, datetime.datetime(2026, 5, 29, 19, 51, 4), datetime.datetime(2026, 5, 29, 19, 51, 4), 'salt', 9.55, 74.64, None, 17.5, 45.87, 4.27, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:51:09.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:51:09.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:51:09.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:51:04, diff=5.457703s, valid=True
2026-05-29T19:51:09.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:51:09.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:51:09.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:51:12, diff=-2.539481s, valid=True
2026-05-29T19:51:09.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:51:09.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:51:09.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:51:00, diff=9.467087s, valid=True
2026-05-29T19:51:09.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:51:09.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:51:09.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:51:09.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:51:09.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:51:09.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:51:09.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:51:12, diff=-2.529796s, valid=True
2026-05-29T19:51:09.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:51:09.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:51:09.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:51:09.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009711.470902s, valid=True
2026-05-29T19:51:09.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:51:09.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:51:09.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:51:09.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:51:09.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:51:09.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:51:09.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:51:09.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:51:09.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:51:09.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:51:09.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:51:09.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:51:09.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:51:09.794 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:51:10.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:51:10.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:51:10.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:51:10.505 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:51:10.505 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:51:10.702 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:51:10.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:51:40.732 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:51:40.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:51:40.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:51:41.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:51:41.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:51:41.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:51:41.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-05-29T19:51:41.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:51:41.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T19:51:41.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:51:41.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:51:41.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:51:41.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-05-29T19:51:43.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:51:43.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:51:43.885 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:51:43.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:51:43.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:51:43.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:51:43.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:51:43.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:51:43.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:51:43.907 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:51:43.907 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:51:43.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:51:43.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:51:43.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:51:44.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:51:44.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:51:44.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:51:44.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:51:44.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:51:44.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:51:44.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:51:44.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:51:44.157 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:51:44.224 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:51:34
2026-05-29T19:51:44.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72716, datetime.datetime(2026, 5, 29, 19, 51, 34), datetime.datetime(2026, 5, 29, 19, 51, 34), 'salt', 9.58, 74.78, None, 18.77, 45.78, 4.24, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:51:44.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:51:44.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:51:44.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:51:34, diff=10.230698s, valid=True
2026-05-29T19:51:44.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:51:44.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:51:44.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:52:12, diff=-27.766482s, valid=True
2026-05-29T19:51:44.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:51:44.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:51:44.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:51:30, diff=14.240182s, valid=True
2026-05-29T19:51:44.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:51:44.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:51:44.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:51:44.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:51:44.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:51:44.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:51:44.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:52:12, diff=-27.756745s, valid=True
2026-05-29T19:51:44.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:51:44.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:51:44.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:51:44.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009746.243928s, valid=True
2026-05-29T19:51:44.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:51:44.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:51:44.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:51:44.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:51:44.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:51:44.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:51:44.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:51:44.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:51:44.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:51:44.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:51:44.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:51:44.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:51:44.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:51:44.557 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:51:44.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:51:45.192 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:51:45.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:51:45.294 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:51:45.294 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:51:45.573 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:51:45.573 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:52:15.603 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:52:15.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:52:15.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:52:16.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:52:16.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:52:16.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:52:16.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-05-29T19:52:16.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:52:16.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-05-29T19:52:16.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:52:16.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:52:16.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:52:16.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-05-29T19:52:18.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-05-29T19:52:18.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:52:18.566 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:52:18.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:52:18.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:52:18.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:52:18.587 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:52:18.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:52:18.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:52:18.588 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:52:18.588 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:52:18.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:52:18.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:52:18.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:52:18.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:52:18.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:52:18.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:52:18.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:52:18.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:52:18.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:52:18.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:52:18.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:52:18.845 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:52:18.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:52:04
2026-05-29T19:52:18.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72717, datetime.datetime(2026, 5, 29, 19, 52, 4), datetime.datetime(2026, 5, 29, 19, 52, 4), 'salt', 9.52, 74.88, None, 18.17, 48.15, 4.23, 832.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:52:18.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:52:18.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:52:18.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:52:04, diff=14.919089s, valid=True
2026-05-29T19:52:18.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:52:18.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:52:18.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:52:12, diff=6.921958s, valid=True
2026-05-29T19:52:18.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:52:18.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:52:18.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:52:00, diff=18.928607s, valid=True
2026-05-29T19:52:18.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:52:18.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:52:18.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:52:18.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:52:18.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:52:18.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:52:18.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:52:12, diff=6.931729s, valid=True
2026-05-29T19:52:18.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:52:18.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:52:18.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:52:18.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009780.932397s, valid=True
2026-05-29T19:52:18.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:52:18.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:52:18.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:52:18.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:52:18.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:52:18.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:52:18.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:52:18.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:52:19.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:52:19.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:52:19.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:52:19.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:52:19.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:52:19.262 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:52:19.490 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:52:19.843 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:52:19.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:52:19.951 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:52:19.951 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:52:20.108 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:52:20.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:52:50.138 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:52:50.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:52:50.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:52:50.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:52:50.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:52:50.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:52:50.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-05-29T19:52:50.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:52:50.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-05-29T19:52:50.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:52:50.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:52:50.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:52:50.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T19:52: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-05-29T19:52:53.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:52:53.247 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:52:53.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:52:53.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:52:53.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:52:53.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:52:53.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:52:53.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:52:53.268 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:52:53.268 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:52:53.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:52:53.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:52:53.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:52:53.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:52:53.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:52:53.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:52:53.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:52:53.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:52:53.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:52:53.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:52:53.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:52:53.525 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:52:53.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:52:35
2026-05-29T19:52:53.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72718, datetime.datetime(2026, 5, 29, 19, 52, 35), datetime.datetime(2026, 5, 29, 19, 52, 34), 'salt', 9.52, 75.14, None, 17.43, 45.26, 4.18, 832.26, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:52:53.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:52:53.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:52:53.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:52:34, diff=19.5919s, valid=True
2026-05-29T19:52:53.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:52:53.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:52:53.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:53:12, diff=-18.40528s, valid=True
2026-05-29T19:52:53.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:52:53.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:52:53.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:52:30, diff=23.601386s, valid=True
2026-05-29T19:52:53.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:52:53.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:52:53.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:52:53.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:52:53.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:52:53.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:52:53.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:53:12, diff=-18.395601s, valid=True
2026-05-29T19:52:53.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:52:53.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:52:53.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:52:53.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009815.605058s, valid=True
2026-05-29T19:52:53.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:52:53.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:52:53.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:52:53.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:52:53.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:52:53.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:52:53.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:52:53.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:52:53.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:52:53.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:52:53.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:52:53.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:52:53.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:52:53.922 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:52:54.211 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:52:54.561 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:52:54.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:52:54.662 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:52:54.662 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:52:54.859 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:52:54.859 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:53:24.889 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:53:24.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:53:24.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:53:25.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:53:25.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:53:25.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:53:25.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T19:53:25.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:53:25.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-05-29T19:53:25.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:53:25.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:53:25.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:53:25.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-05-29T19:53:29.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-05-29T19:53:29.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:53:29.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:53:29.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:53:29.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:53:29.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:53:29.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:53:29.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:53:29.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:53:29.837 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:53:29.837 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:53:29.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:53:29.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:53:29.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:53:30.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:53:30.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:53:30.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:53:30.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:53:30.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:53:30.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:53:30.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:53:30.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:53:30.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:53:30.170 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:53:05
2026-05-29T19:53:30.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72719, datetime.datetime(2026, 5, 29, 19, 53, 5), datetime.datetime(2026, 5, 29, 19, 53, 5), 'salt', 9.58, 75.31, None, 17.15, 44.46, 4.14, 832.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:53:30.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:53:30.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:53:30.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:53:05, diff=25.176829s, valid=True
2026-05-29T19:53:30.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:53:30.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:53:30.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:53:12, diff=18.179707s, valid=True
2026-05-29T19:53:30.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:53:30.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:53:30.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:53:01, diff=29.186574s, valid=True
2026-05-29T19:53:30.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:53:30.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:53:30.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:53:30.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:53:30.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:53:30.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:53:30.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:53:12, diff=18.189662s, valid=True
2026-05-29T19:53:30.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:53:30.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:53:30.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:53:30.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009852.19032s, valid=True
2026-05-29T19:53:30.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:53:30.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:53:30.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:53:30.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:53:30.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:53:30.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:53:30.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:53:30.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:53:30.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:53:30.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:53:30.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:53:30.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:53:30.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:53:30.505 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:53:30.723 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:53:31.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:53:31.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:53:31.178 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:53:31.178 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:53:31.330 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:53:31.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:54:01.339 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:54:01.339 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:54:01.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:54:01.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:54:01.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:54:01.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:54:01.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-05-29T19:54:01.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:54:01.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-05-29T19:54:01.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:54:01.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:54:01.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:54:01.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-05-29T19:54:39.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:54:39.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:54:39.637 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:54:39.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:54:39.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:54:39.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:54:39.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:54:39.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:54:39.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:54:39.659 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:54:39.659 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:54:39.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:54:39.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T19:54:39.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:54:39.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T19:54:39.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:54:39.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:54:39.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:54:39.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T19:54:39.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:54:39.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:54:39.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:54:39.937 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:54:39.999 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:54:36
2026-05-29T19:54:39.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72722, datetime.datetime(2026, 5, 29, 19, 54, 36), datetime.datetime(2026, 5, 29, 19, 54, 35), 'salt', 9.65, 75.64, None, 17.5, 46.46, 4.08, 832.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:54:39.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:54:39.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T19:54:40.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:54:35, diff=5.005433s, valid=True
2026-05-29T19:54:40.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:54:40.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:54:40.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:55:12, diff=-31.991631s, valid=True
2026-05-29T19:54:40.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:54:40.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T19:54:40.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:54:34, diff=6.015372s, valid=True
2026-05-29T19:54:40.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:54:40.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:54:40.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:54:40.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:54:40.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:54:40.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T19:54:40.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:55:12, diff=-31.981026s, valid=True
2026-05-29T19:54:40.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:54:40.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:54:40.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:54:40.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009922.019839s, valid=True
2026-05-29T19:54:40.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:54:40.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:54:40.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:54:40.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:54:40.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:54:40.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:54:40.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:54:40.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:54:40.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:54:40.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:54:40.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:54:40.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:54:40.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:54:40.353 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:54:40.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:54:41.006 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:54:41.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:54:41.112 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:54:41.112 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:54:41.303 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:54:41.303 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:55:11.315 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:55:11.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:55:11.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:55:11.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:55:11.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:55:11.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:55:11.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-05-29T19:55:11.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:55:11.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-05-29T19:55:11.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:55:11.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:55:11.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:55:11.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-05-29T19:55:54.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:55:54.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:55:54.843 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:55:54.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:55:54.853 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:55:54.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:55:54.865 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:55:54.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:55:54.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:55:54.865 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:55:54.865 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:55:54.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:55:54.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:55:54.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:55:55.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:55:55.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:55:55.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:55:55.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:55:55.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:55:55.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:55:55.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:55:55.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:55:55.127 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:55:55.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:55:36
2026-05-29T19:55:55.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72724, datetime.datetime(2026, 5, 29, 19, 55, 36), datetime.datetime(2026, 5, 29, 19, 55, 36), 'salt', 9.65, 75.97, None, 17.4, 44.74, 4.02, 832.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:55:55.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:55:55.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:55:55.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:55:36, diff=19.191809s, valid=True
2026-05-29T19:55:55.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:55:55.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:55:55.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:56:12, diff=-16.805371s, valid=True
2026-05-29T19:55:55.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:55:55.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:55:55.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:55:32, diff=23.201212s, valid=True
2026-05-29T19:55:55.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:55:55.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:55:55.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:55:55.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:55:55.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:55:55.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:55:55.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:56:12, diff=-16.795802s, valid=True
2026-05-29T19:55:55.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:55:55.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:55:55.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:55:55.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1009997.204854s, valid=True
2026-05-29T19:55:55.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:55:55.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:55:55.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:55:55.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:55:55.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:55:55.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:55:55.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:55:55.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:55:55.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:55:55.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:55:55.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:55:55.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:55:55.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:55:55.525 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:55:55.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:55:56.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:55:56.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:55:56.216 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:55:56.216 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:55:56.410 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:55:56.411 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:56:26.431 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:56:26.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:56:26.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:56:26.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:56:26.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:56:26.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:56:26.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-05-29T19:56:26.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:56:26.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-05-29T19:56:26.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:56:26.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:56:26.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:56:26.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-05-29T19:56:29.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-05-29T19:56:29.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:56:29.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:56:29.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:56:29.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:56:29.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:56:29.757 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:56:29.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:56:29.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:56:29.757 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:56:29.757 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:56:29.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:56:29.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:56:29.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:56:29.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:56:29.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:56:29.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:56:29.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:56:30.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:56:30.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:56:30.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:56:30.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:56:30.021 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:56:30.085 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:56:06
2026-05-29T19:56:30.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72725, datetime.datetime(2026, 5, 29, 19, 56, 6), datetime.datetime(2026, 5, 29, 19, 56, 6), 'salt', 9.55, 76.0, None, 16.94, 46.43, 4.01, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:56:30.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:56:30.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:56:30.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:56:06, diff=24.093156s, valid=True
2026-05-29T19:56:30.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:56:30.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:56:30.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:56:12, diff=18.096216s, valid=True
2026-05-29T19:56:30.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:56:30.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:56:30.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:56:02, diff=28.103076s, valid=True
2026-05-29T19:56:30.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:56:30.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:56:30.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:56:30.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:56:30.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:56:30.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:56:30.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:56:12, diff=18.106326s, valid=True
2026-05-29T19:56:30.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:56:30.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:56:30.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:56:30.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010032.107022s, valid=True
2026-05-29T19:56:30.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:56:30.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:56:30.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:56:30.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:56:30.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:56:30.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:56:30.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:56:30.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:56:30.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:56:30.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:56:30.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:56:30.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:56:30.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:56:30.516 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:56:30.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:56:31.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:56:31.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:56: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-05-29T19:56: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-05-29T19:56:31.409 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:56:31.409 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:57:01.439 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:57:01.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:57:01.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:57:01.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:57:01.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:57:01.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:57:01.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-05-29T19:57:01.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:57:01.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-05-29T19:57:01.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:57:01.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:57:01.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:57:01.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-05-29T19:57:04.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-05-29T19:57:04.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:57:04.068 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:57:04.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:57:04.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:57:04.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:57:04.089 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:57:04.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:57:04.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:57:04.089 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:57:04.089 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:57:04.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:57:04.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:57:04.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:57:04.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:57:04.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:57:04.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:57:04.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:57:04.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:57:04.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:57:04.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:57:04.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:57:04.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:57:04.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:56:36
2026-05-29T19:57:04.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72726, datetime.datetime(2026, 5, 29, 19, 56, 36), datetime.datetime(2026, 5, 29, 19, 56, 36), 'salt', 9.55, 76.07, None, 16.87, 46.27, 4.0, 832.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:57:04.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:57:04.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:57:04.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:56:36, diff=28.416481s, valid=True
2026-05-29T19:57:04.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:57:04.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:57:04.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:57:12, diff=-7.580503s, valid=True
2026-05-29T19:57:04.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:57:04.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:57:04.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:56:32, diff=32.426228s, valid=True
2026-05-29T19:57:04.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:57:04.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:57:04.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:57:04.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:57:04.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:57:04.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:57:04.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:57:12, diff=-7.570752s, valid=True
2026-05-29T19:57:04.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:57:04.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:57:04.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:57:04.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010066.42993s, valid=True
2026-05-29T19:57:04.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:57:04.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:57:04.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:57:04.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:57:04.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:57:04.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:57:04.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:57:04.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:57:04.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:57:04.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:57:04.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:57:04.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:57:04.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:57:04.765 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:57:04.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:57:05.364 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:57:05.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:57:05.464 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:57:05.464 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:57:05.657 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:57:05.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:57:35.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:57:35.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:57:35.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:57:36.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:57:36.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:57:36.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:57:36.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-05-29T19:57:36.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:57:36.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-05-29T19:57:36.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:57:36.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:57:36.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:57:36.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-05-29T19:58:21.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T19:58:21.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:58:21.062 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:58:21.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:58:21.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:58:21.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:58:21.083 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:58:21.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:58:21.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:58:21.083 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:58:21.083 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:58:21.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:58:21.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:58:21.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:58:21.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:58:21.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:58:21.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:58:21.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:58:21.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:58:21.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:58:21.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:58:21.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:58:21.360 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:58:21.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:58:07
2026-05-29T19:58:21.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72729, datetime.datetime(2026, 5, 29, 19, 58, 7), datetime.datetime(2026, 5, 29, 19, 58, 7), 'salt', 9.58, 76.4, None, 17.18, 45.89, 3.93, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:58:21.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:58:21.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:58:21.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:58:07, diff=14.4304s, valid=True
2026-05-29T19:58:21.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:58:21.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:58:21.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:58:12, diff=9.433277s, valid=True
2026-05-29T19:58:21.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:58:21.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:58:21.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:58:03, diff=18.439972s, valid=True
2026-05-29T19:58:21.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:58:21.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:58:21.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:58:21.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:58:21.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:58:21.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:58:21.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:58:12, diff=9.443248s, valid=True
2026-05-29T19:58:21.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:58:21.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:58:21.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:58:21.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010143.443971s, valid=True
2026-05-29T19:58:21.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:58:21.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:58:21.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:58:21.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:58:21.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:58:21.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:58:21.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:58:21.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:58:21.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:58:21.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:58:21.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:58:21.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:58:21.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:58:21.865 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:58:22.109 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:58:22.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:58:22.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:58:22.651 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:58:22.651 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:58:22.842 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:58:22.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:58:52.872 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:58:52.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:58:52.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:58:53.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:58:53.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:58:53.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:58:53.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-05-29T19:58:53.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:58:53.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-05-29T19:58:53.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:58:53.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:58:53.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:58:53.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-05-29T19:59:23.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-05-29T19:59:23.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T19:59:23.285 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T19:59:23.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T19:59:23.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T19:59:23.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T19:59:23.307 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T19:59:23.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T19:59:23.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T19:59:23.307 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T19:59:23.308 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T19:59:23.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T19:59:23.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T19:59:23.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T19:59:23.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T19:59:23.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:59:23.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:59:23.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T19:59:23.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T19:59:23.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T19:59:23.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T19:59:23.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T19:59:23.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T19:59:23.646 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 19:59:08
2026-05-29T19:59:23.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72731, datetime.datetime(2026, 5, 29, 19, 59, 8), datetime.datetime(2026, 5, 29, 19, 59, 7), 'salt', 9.55, 76.64, None, 17.08, 44.34, 3.89, 832.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T19:59:23.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T19:59:23.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T19:59:23.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:59:07, diff=16.652256s, valid=True
2026-05-29T19:59:23.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T19:59:23.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:59:23.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:59:12, diff=11.655167s, valid=True
2026-05-29T19:59:23.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T19:59:23.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T19:59:23.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:59:06, diff=17.662029s, valid=True
2026-05-29T19:59:23.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T19:59:23.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:59:23.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T19:59:23.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T19:59:23.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T19:59:23.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T19:59:23.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 19:59:12, diff=11.665111s, valid=True
2026-05-29T19:59:23.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T19:59:23.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T19:59:23.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T19:59:23.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010205.665803s, valid=True
2026-05-29T19:59:23.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T19:59:23.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T19:59:23.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T19:59:23.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T19:59:23.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T19:59:23.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T19:59:23.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T19:59:23.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T19:59:23.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T19:59:23.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T19:59:23.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T19:59:23.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T19:59:23.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T19:59:23.983 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T19:59:24.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:59:24.580 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T19:59:24.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T19:59:24.686 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T19:59:24.686 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T19:59:24.877 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T19:59:24.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T19:59:54.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T19:59:54.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T19:59:54.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T19:59:55.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T19:59:55.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T19:59:55.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T19:59:55.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-05-29T19:59:55.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T19:59:55.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-05-29T19:59:55.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T19:59:55.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T19:59:55.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T19:59:55.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-05-29T20:00:17.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-05-29T20:00:17.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:00:17.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:00:17.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:00:17.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:00:17.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:00:17.301 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:00:17.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:00:17.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:00:17.302 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:00:17.303 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:00:17.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:00:17.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:00:17.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:00:17.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:00:17.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:00:17.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:00:17.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:00:17.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:00:17.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:00:17.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:00:17.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:00:17.660 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:00:17.722 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:00:08
2026-05-29T20:00:17.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72733, datetime.datetime(2026, 5, 29, 20, 0, 8), datetime.datetime(2026, 5, 29, 20, 0, 8), 'salt', 9.62, 76.83, None, 16.51, 44.51, 3.86, 832.39, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:00:17.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:00:17.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:00:17.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:00:08, diff=9.728829s, valid=True
2026-05-29T20:00:17.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:00:17.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:00:17.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:00:12, diff=5.731785s, valid=True
2026-05-29T20:00:17.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:00:17.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:00:17.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:00:04, diff=13.738659s, valid=True
2026-05-29T20:00:17.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:00:17.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:00:17.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:00:17.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:00:17.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:00:17.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:00:17.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:00:12, diff=5.741782s, valid=True
2026-05-29T20:00:17.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:00:17.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:00:17.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:00:17.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010259.742525s, valid=True
2026-05-29T20:00:17.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:00:17.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:00:17.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:00:17.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:00:17.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:00:17.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:00:17.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:00:17.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:00:17.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:00:17.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:00:17.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:00:17.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:00:18.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:00:18.084 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:00:18.304 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:00:18.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:00:18.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:00:18.764 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:00:18.764 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:00:18.957 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:00:18.957 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:00:48.987 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:00:48.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:00:48.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:00:49.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:00:49.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:00:49.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:00:49.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-05-29T20:00:49.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:00:49.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-05-29T20:00:49.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:00:49.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:00:49.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:00:49.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-05-29T20:00:52.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T20:00:52.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:00:52.174 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:00:52.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:00:52.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:00:52.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:00:52.194 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:00:52.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:00:52.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:00:52.194 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:00:52.194 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:00:52.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:00:52.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:00:52.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:00:52.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:00:52.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:00:52.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:00:52.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:00:52.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:00:52.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:00:52.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:00:52.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:00:52.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:00:52.513 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:00:38
2026-05-29T20:00:52.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72734, datetime.datetime(2026, 5, 29, 20, 0, 38), datetime.datetime(2026, 5, 29, 20, 0, 38), 'salt', 9.55, 76.9, None, 16.06, 44.41, 3.84, 832.45, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:00:52.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:00:52.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:00:52.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:00:38, diff=14.520309s, valid=True
2026-05-29T20:00:52.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:00:52.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:00:52.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:01:12, diff=-19.476783s, valid=True
2026-05-29T20:00:52.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:00:52.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:00:52.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:00:34, diff=18.529905s, valid=True
2026-05-29T20:00:52.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:00:52.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:00:52.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:00:52.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:00:52.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:00:52.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:00:52.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:01:12, diff=-19.467042s, valid=True
2026-05-29T20:00:52.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:00:52.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:00:52.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:00:52.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010294.533627s, valid=True
2026-05-29T20:00:52.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:00:52.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:00:52.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:00:52.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:00:52.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:00:52.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:00:52.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:00:52.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:00:52.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:00:52.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:00:52.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:00:52.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:00:52.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:00:52.852 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:00:53.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:00:53.429 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:00:53.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:00:53.530 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:00:53.530 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:00:53.809 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:00:53.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:01:23.823 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:01:23.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:01:23.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:01:23.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:01:23.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:01:24.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:01:24.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-05-29T20:01:24.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:01:24.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-05-29T20:01:24.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:01:24.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:01:24.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:01:24.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-05-29T20:01:28.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-05-29T20:01:28.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:01:28.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:01:28.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:01:28.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:01:28.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:01:28.293 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:01:28.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:01:28.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:01:28.293 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:01:28.293 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:01:28.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:01:28.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:01:28.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:01:28.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:01:28.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:01:28.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:01:28.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:01:28.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:01:28.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:01:28.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:01:28.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:01:28.551 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:01:28.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:01:09
2026-05-29T20:01:28.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72735, datetime.datetime(2026, 5, 29, 20, 1, 9), datetime.datetime(2026, 5, 29, 20, 1, 8), 'salt', 9.55, 77.13, None, 16.48, 43.26, 3.8, 832.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:01:28.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:01:28.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:01:28.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:01:08, diff=20.617146s, valid=True
2026-05-29T20:01:28.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:01:28.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:01:28.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:01:12, diff=16.619991s, valid=True
2026-05-29T20:01:28.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:01:28.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:01:28.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:01:04, diff=24.626683s, valid=True
2026-05-29T20:01:28.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:01:28.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:01:28.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:01:28.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:01:28.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:01:28.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:01:28.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:01:12, diff=16.62982s, valid=True
2026-05-29T20:01:28.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:01:28.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:01:28.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:01:28.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010330.630472s, valid=True
2026-05-29T20:01:28.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:01:28.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:01:28.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:01:28.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:01:28.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:01:28.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:01:28.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:01:28.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:01:28.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:01:28.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:01:28.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:01:28.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:01:28.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:01:28.965 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:01:29.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:01:29.545 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:01:29.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:01:29.655 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:01:29.655 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:01:29.850 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:01:29.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:01:59.879 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:01:59.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:01:59.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:02:00.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:02:00.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:02:00.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:02: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-05-29T20:02:00.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:02:00.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-05-29T20:02:00.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:02:00.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:02:00.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:02:00.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-05-29T20:02:03.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-05-29T20:02:03.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:02:03.008 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:02:03.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:02:03.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:02:03.028 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:02:03.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:02:03.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:02:03.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:02:03.029 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:02:03.029 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:02:03.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:02:03.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:02:03.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:02:03.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:02:03.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:02:03.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:02:03.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:02:03.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:02:03.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:02:03.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:02:03.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:02:03.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:02:03.342 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:01:39
2026-05-29T20:02:03.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72736, datetime.datetime(2026, 5, 29, 20, 1, 39), datetime.datetime(2026, 5, 29, 20, 1, 38), 'salt', 9.48, 77.07, None, 16.34, 46.46, 3.8, 832.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:02:03.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:02:03.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:02:03.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:01:38, diff=25.348166s, valid=True
2026-05-29T20:02:03.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:02:03.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:02:03.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:02:12, diff=-8.649001s, valid=True
2026-05-29T20:02:03.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:02:03.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:02:03.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:01:35, diff=28.357658s, valid=True
2026-05-29T20:02:03.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:02:03.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:02:03.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:02:03.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:02:03.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:02:03.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:02:03.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:02:12, diff=-8.639265s, valid=True
2026-05-29T20:02:03.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:02:03.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:02:03.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:02:03.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010365.36139s, valid=True
2026-05-29T20:02:03.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:02:03.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:02:03.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:02:03.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:02:03.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:02:03.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:02:03.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:02:03.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:02:03.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:02:03.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:02:03.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:02:03.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:02:03.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:02:03.682 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:02:03.921 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:02:04.515 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:02:04.618 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:02:04.618 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:02:04.618 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:02:04.814 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:02:04.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:02:34.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:02:34.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:02:34.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:02:34.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:02:34.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:02:35.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:02:35.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-05-29T20:02:35.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:02:35.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-05-29T20:02:35.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:02:35.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:02:35.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:02:35.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-05-29T20:03:12.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-05-29T20:03:12.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:03:12.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:03:12.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:03:12.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:03:12.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:03:12.546 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:03:12.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:03:12.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:03:12.546 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:03:12.546 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:03:12.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:03:12.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:03:12.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:03:12.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:03:12.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:03:12.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:03:12.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:03:12.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:03:12.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:03:12.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:03:12.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:03:12.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:03:12.893 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:03:09
2026-05-29T20:03:12.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72739, datetime.datetime(2026, 5, 29, 20, 3, 9), datetime.datetime(2026, 5, 29, 20, 3, 9), 'salt', 9.52, 77.1, None, 15.67, 46.2, 3.81, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:03:12.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:03:12.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:03:12.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:03:09, diff=3.899459s, valid=True
2026-05-29T20:03:12.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:03:12.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:03:12.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:03:12, diff=0.902285s, valid=True
2026-05-29T20:03:12.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:03:12.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:03:12.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:03:07, diff=5.908758s, valid=True
2026-05-29T20:03:12.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:03:12.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:03:12.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:03:12.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:03:12.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:03:12.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:03:12.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:03:12, diff=0.911752s, valid=True
2026-05-29T20:03:12.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:03:12.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:03:12.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:03:12.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010434.912398s, valid=True
2026-05-29T20:03:12.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:03:12.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:03:12.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:03:12.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:03:12.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:03:12.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:03:12.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:03:12.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:03:12.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:03:13.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:03:13.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:03:13.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:03:13.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:03:13.236 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:03:13.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:03:13.808 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:03:13.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:03:13.909 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:03:13.909 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:03:14.108 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:03:14.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:03:44.113 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:03:44.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:03:44.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:03:44.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:03:44.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:03:44.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:03:44.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-05-29T20:03:44.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:03:44.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-05-29T20:03:44.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:03:44.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:03:44.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:03:44.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-05-29T20:04:23.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-05-29T20:04:23.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:04:23.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:04:23.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:04:23.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:04:23.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:04:23.148 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:04:23.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:04:23.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:04:23.148 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:04:23.148 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:04:23.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:04:23.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:04:23.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:04:23.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:04:23.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:04:23.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:04:23.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:04:23.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:04:23.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:04:23.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:04:23.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:04:23.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:04:23.479 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:04:10
2026-05-29T20:04:23.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72741, datetime.datetime(2026, 5, 29, 20, 4, 10), datetime.datetime(2026, 5, 29, 20, 4, 9), 'salt', 9.52, 77.1, None, 15.17, 44.91, 3.81, 832.39, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:04:23.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:04:23.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:04:23.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:04:09, diff=14.486017s, valid=True
2026-05-29T20:04:23.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:04:23.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:04:23.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:04:12, diff=11.488857s, valid=True
2026-05-29T20:04:23.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:04:23.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:04:23.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:04:10, diff=13.495517s, valid=True
2026-05-29T20:04:23.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:04:23.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:04:23.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:04:23.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:04:23.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:04:23.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:04:23.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:04:12, diff=11.498564s, valid=True
2026-05-29T20:04:23.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:04:23.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:04:23.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:04:23.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010505.499224s, valid=True
2026-05-29T20:04:23.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:04:23.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:04:23.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:04:23.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:04:23.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:04:23.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:04:23.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:04:23.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:04:23.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:04:23.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:04:23.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:04:23.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:04:23.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:04:23.834 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:04:24.132 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:04:24.497 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:04:24.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:04:24.598 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:04:24.598 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:04:24.838 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:04:24.838 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:04:54.876 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:04:54.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:04:54.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:04:55.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:04:55.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:04:55.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:04:55.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T20:04:55.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:04:55.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-05-29T20:04:55.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:04:55.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:04:55.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:04:55.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-05-29T20:04:58.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-05-29T20:04:58.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:04:58.465 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:04:58.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:04:58.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:04:58.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:04:58.486 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:04:58.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:04:58.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:04:58.487 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:04:58.487 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:04:58.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:04:58.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:04:58.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:04:58.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:04:58.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:04:58.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:04:58.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:04:58.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:04:58.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:04:58.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:04:58.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:04:58.750 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:04:58.816 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:04:40
2026-05-29T20:04:58.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72742, datetime.datetime(2026, 5, 29, 20, 4, 40), datetime.datetime(2026, 5, 29, 20, 4, 40), 'salt', 9.58, 77.2, None, 15.81, 43.62, 3.78, 832.39, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:04:58.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:04:58.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:04:58.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:04:40, diff=18.822436s, valid=True
2026-05-29T20:04:58.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:04:58.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:04:58.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:05:12, diff=-13.174745s, valid=True
2026-05-29T20:04:58.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:04:58.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:04:58.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:04:36, diff=22.831976s, valid=True
2026-05-29T20:04:58.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:04:58.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:04:58.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:04:58.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:04:58.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:04:58.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:04:58.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:05:12, diff=-13.165004s, valid=True
2026-05-29T20:04:58.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:04:58.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:04:58.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:04:58.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010540.835667s, valid=True
2026-05-29T20:04:58.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:04:58.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:04:58.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:04:58.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:04:58.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:04:58.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:04:58.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:04:58.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:04:58.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:04:58.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:04:59.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:04:59.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:04:59.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:04:59.172 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:04:59.386 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:04:59.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:04:59.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:04:59.860 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:04:59.860 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:05:00.121 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:05:00.121 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:05:30.150 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:05:30.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:05:30.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:05:30.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:05:30.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:05:30.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:05:30.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-05-29T20:05:30.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:05:30.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-05-29T20:05:30.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:05:30.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:05:30.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:05:30.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-05-29T20:05:34.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-05-29T20:05:34.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:05:34.888 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:05:34.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:05:34.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:05:34.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:05:34.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:05:34.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:05:34.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:05:34.909 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:05:34.909 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:05:34.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:05:34.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:05:34.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:05:35.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:05:35.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:05:35.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:05:35.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:05:35.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:05:35.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:05:35.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:05:35.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:05:35.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:05:35.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:05:10
2026-05-29T20:05:35.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72743, datetime.datetime(2026, 5, 29, 20, 5, 10), datetime.datetime(2026, 5, 29, 20, 5, 10), 'salt', 9.58, 77.37, None, 15.95, 44.51, 3.75, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:05:35.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:05:35.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:05:35.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:05:10, diff=25.238698s, valid=True
2026-05-29T20:05:35.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:05:35.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:05:35.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:05:12, diff=23.241595s, valid=True
2026-05-29T20:05:35.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:05:35.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:05:35.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:05:06, diff=29.248563s, valid=True
2026-05-29T20:05:35.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:05:35.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:05:35.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:05:35.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:05:35.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:05:35.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:05:35.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:05:12, diff=23.252285s, valid=True
2026-05-29T20:05:35.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:05:35.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:05:35.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:05:35.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010577.252984s, valid=True
2026-05-29T20:05:35.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:05:35.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:05:35.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:05:35.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:05:35.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:05:35.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:05:35.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:05:35.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:05:35.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:05:35.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:05:35.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:05:35.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:05:35.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:05:35.657 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:05:35.880 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:05:36.243 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:05:36.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:05:36.345 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:05:36.345 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:05:36.535 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:05:36.535 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:06:06.564 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:06:06.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:06:06.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:06:06.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:06:06.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:06:07.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:06:07.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T20:06:07.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:06:07.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T20:06:07.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:06:07.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:06:07.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:06:07.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-05-29T20:06:11.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-05-29T20:06:11.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:06:11.340 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:06:11.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:06:11.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:06:11.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:06:11.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:06:11.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:06:11.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:06:11.361 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:06:11.361 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:06:11.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:06:11.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:06:11.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:06:11.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:06:11.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:06:11.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:06:11.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:06:11.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:06:11.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:06:11.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:06:11.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:06:11.630 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:06:11.689 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:06:11
2026-05-29T20:06:11.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72745, datetime.datetime(2026, 5, 29, 20, 6, 11), datetime.datetime(2026, 5, 29, 20, 6, 10), 'salt', 9.52, 77.53, None, 17.11, 43.26, 3.72, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:06:11.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:06:11.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:06:11.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:06:10, diff=1.695614s, valid=True
2026-05-29T20:06:11.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:06:11.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:06:11.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:06:12, diff=-0.301519s, valid=True
2026-05-29T20:06:11.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:06:11.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:06:11.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:06:07, diff=4.70531s, valid=True
2026-05-29T20:06:11.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:06:11.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:06:11.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:06:11.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:06:11.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:06:11.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:06:11.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:06:12, diff=-0.291671s, valid=True
2026-05-29T20:06:11.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:06:11.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:06:11.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:06:11.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010613.708993s, valid=True
2026-05-29T20:06:11.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:06:11.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:06:11.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:06:11.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:06:11.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:06:11.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:06:11.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:06:11.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:06:11.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:06:11.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:06:11.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:06:11.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:06:11.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:06:12.042 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:06:12.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:06:12.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:06:12.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:06:12.727 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:06:12.727 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:06:12.916 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:06:12.916 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:06:42.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:06:42.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:06:42.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:06:43.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:06:43.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:06:43.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:06:43.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-05-29T20:06:43.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:06:43.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-05-29T20:06:43.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:06:43.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:06:43.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:06:43.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-05-29T20:06:49.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-05-29T20:06:49.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:06:49.048 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:06:49.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:06:49.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:06:49.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:06:49.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:06:49.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:06:49.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:06:49.069 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:06:49.069 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:06:49.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:06:49.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:06:49.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:06:49.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:06:49.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:06:49.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:06:49.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:06:49.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:06:49.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:06:49.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:06:49.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:06:49.337 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:06:49.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:06:41
2026-05-29T20:06:49.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72746, datetime.datetime(2026, 5, 29, 20, 6, 41), datetime.datetime(2026, 5, 29, 20, 6, 41), 'salt', 9.52, 77.47, None, 16.87, 44.58, 3.74, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:06:49.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:06:49.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:06:49.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:06:41, diff=8.401437s, valid=True
2026-05-29T20:06:49.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:06:49.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:06:49.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:07:12, diff=-22.595746s, valid=True
2026-05-29T20:06:49.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:06:49.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:06:49.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:06:37, diff=12.410747s, valid=True
2026-05-29T20:06:49.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:06:49.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:06:49.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:06:49.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:06:49.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:06:49.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:06:49.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:07:12, diff=-22.586239s, valid=True
2026-05-29T20:06:49.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:06:49.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:06:49.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:06:49.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010651.414406s, valid=True
2026-05-29T20:06:49.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:06:49.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:06:49.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:06:49.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:06:49.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:06:49.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:06:49.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:06:49.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:06:49.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:06:49.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:06:49.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:06:49.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:06:49.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:06:49.797 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:06:50.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:06:50.385 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:06:50.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:06:50.485 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:06:50.485 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:06:50.676 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:06:50.676 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:07:20.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:07:20.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:07:20.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:07:20.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:07:20.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:07:21.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:07:21.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-05-29T20:07:21.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:07:21.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-05-29T20:07:21.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:07:21.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:07:21.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:07:21.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-05-29T20:07: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-05-29T20:07:30.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:07:30.305 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:07:30.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:07:30.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:07:30.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:07:30.326 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:07:30.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:07:30.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:07:30.326 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:07:30.327 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:07:30.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:07:30.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:07:30.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:07:30.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:07:30.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:07:30.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:07:30.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:07:30.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:07:30.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:07:30.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:07:30.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:07:30.586 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:07:30.645 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:07:11
2026-05-29T20:07:30.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72747, datetime.datetime(2026, 5, 29, 20, 7, 11), datetime.datetime(2026, 5, 29, 20, 7, 11), 'salt', 9.52, 77.57, None, 17.26, 44.16, 3.72, 832.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:07:30.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:07:30.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:07:30.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:07:11, diff=19.651664s, valid=True
2026-05-29T20:07:30.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:07:30.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:07:30.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:07:12, diff=18.65452s, valid=True
2026-05-29T20:07:30.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:07:30.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:07:30.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:07:08, diff=22.661469s, valid=True
2026-05-29T20:07:30.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:07:30.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:07:30.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:07:30.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:07:30.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:07:30.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:07:30.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:07:12, diff=18.664526s, valid=True
2026-05-29T20:07:30.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:07:30.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:07:30.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:07:30.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010692.665199s, valid=True
2026-05-29T20:07:30.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:07:30.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:07:30.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:07:30.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:07:30.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:07:30.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:07:30.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:07:30.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:07:30.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:07:30.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:07:30.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:07:30.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:07:30.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:07:31.011 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:07:31.233 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:07:31.595 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:07:31.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:07:31.712 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:07:31.712 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:07:32.051 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:07:32.051 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:08:02.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:08:02.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:08:02.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:08:02.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:08:02.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:08:02.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:08:02.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-05-29T20:08:02.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:08:02.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-05-29T20:08:02.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:08:02.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:08:02.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:08:02.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-05-29T20:08:05.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-05-29T20:08:05.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:08:05.537 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:08:05.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:08:05.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:08:05.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:08:05.560 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:08:05.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:08:05.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:08:05.561 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:08:05.561 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:08:05.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:08:05.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:08:05.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:08:05.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:08:05.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:08:05.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:08:05.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:08:05.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:08:05.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:08:05.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:08:05.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:08:05.918 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:08:05.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:07:41
2026-05-29T20:08:05.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72748, datetime.datetime(2026, 5, 29, 20, 7, 41), datetime.datetime(2026, 5, 29, 20, 7, 41), 'salt', 9.49, 77.5, None, 16.62, 45.8, 3.73, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:08:05.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:08:05.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:08:05.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:07:41, diff=24.986355s, valid=True
2026-05-29T20:08:05.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:08:05.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:08:05.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:08:12, diff=-6.010773s, valid=True
2026-05-29T20:08:05.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:08:05.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:08:05.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:07:39, diff=26.995985s, valid=True
2026-05-29T20:08:05.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:08:05.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:08:05.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:08:05.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:08:05.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:08:05.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:08:05.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:08:12, diff=-6.000998s, valid=True
2026-05-29T20:08:05.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:08:05.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:08:05.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:08:05.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010727.999658s, valid=True
2026-05-29T20:08:06.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:08:06.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:08:06.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:08:06.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:08:06.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:08:06.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:08:06.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:08:06.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:08:06.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:08:06.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:08:06.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:08:06.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:08:06.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:08:06.330 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:08:06.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:08:06.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:08:07.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:08:07.011 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:08:07.011 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:08:07.299 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:08:07.299 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:08:37.319 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:08:37.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:08:37.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:08:37.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:08:37.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:08:37.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:08:37.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-05-29T20:08:37.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:08:37.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-05-29T20:08:37.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:08:37.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:08:37.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:08:37.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-05-29T20:08:53.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-05-29T20:08:53.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:08:53.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:08:53.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:08:53.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:08:53.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:08:53.981 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:08:53.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:08:53.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:08:53.981 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:08:53.981 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:08:53.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:08:54.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:08:54.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:08:54.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:08:54.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:08:54.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:08:54.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:08:54.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:08:54.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:08:54.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:08:54.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:08:54.252 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:08:54.315 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:08:42
2026-05-29T20:08:54.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72750, datetime.datetime(2026, 5, 29, 20, 8, 42), datetime.datetime(2026, 5, 29, 20, 8, 41), 'salt', 9.49, 77.43, None, 16.55, 43.05, 3.74, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:08:54.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:08:54.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:08:54.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:08:41, diff=13.322329s, valid=True
2026-05-29T20:08:54.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:08:54.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:08:54.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:09:12, diff=-17.67476s, valid=True
2026-05-29T20:08:54.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:08:54.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:08:54.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:08:38, diff=16.331971s, valid=True
2026-05-29T20:08:54.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:08:54.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:08:54.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:08:54.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:08:54.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:08:54.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:08:54.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:09:12, diff=-17.66494s, valid=True
2026-05-29T20:08:54.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:08:54.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:08:54.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:08:54.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010776.335729s, valid=True
2026-05-29T20:08:54.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:08:54.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:08:54.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:08:54.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:08:54.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:08:54.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:08:54.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:08:54.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:08:54.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:08:54.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:08:54.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:08:54.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:08:54.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:08:54.660 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:08:54.884 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:08:55.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:08:55.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:08:55.353 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:08:55.353 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:08:55.542 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:08:55.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:09:25.564 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:09:25.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:09:25.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:09:25.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:09:25.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:09:25.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:09:25.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-05-29T20:09:25.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:09:25.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-05-29T20:09:25.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:09:25.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:09:25.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:09:25.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-05-29T20:09:28.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-05-29T20:09:28.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:09:28.350 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:09:28.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:09:28.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:09:28.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:09:28.371 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:09:28.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:09:28.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:09:28.371 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:09:28.371 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:09:28.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:09:28.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:09:28.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:09:28.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:09:28.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:09:28.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:09:28.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:09:28.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:09:28.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:09:28.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:09:28.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:09:28.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:09:28.690 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:09:12
2026-05-29T20:09:28.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72751, datetime.datetime(2026, 5, 29, 20, 9, 12), datetime.datetime(2026, 5, 29, 20, 9, 12), 'salt', 9.45, 77.43, None, 16.51, 43.92, 3.74, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:09:28.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:09:28.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:09:28.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:09:12, diff=16.696616s, valid=True
2026-05-29T20:09:28.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:09:28.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:09:28.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:09:12, diff=16.699501s, valid=True
2026-05-29T20:09:28.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:09:28.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:09:28.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:09:08, diff=20.706129s, valid=True
2026-05-29T20:09:28.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:09:28.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:09:28.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:09:28.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:09:28.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:09:28.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:09:28.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:09:12, diff=16.709149s, valid=True
2026-05-29T20:09:28.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:09:28.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:09:28.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:09:28.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010810.709808s, valid=True
2026-05-29T20:09:28.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:09:28.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:09:28.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:09:28.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:09:28.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:09:28.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:09:28.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:09:28.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:09:28.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:09:28.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:09:28.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:09:28.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:09:28.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:09:29.033 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:09:29.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:09:29.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:09:29.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:09:29.737 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:09:29.737 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:09:29.947 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:09:29.948 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:09:59.977 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:09:59.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:09:59.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:10:00.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:10:00.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:10:00.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:10:00.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-05-29T20:10:00.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:10:00.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-05-29T20:10:00.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:10:00.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:10:00.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:10:00.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-05-29T20: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-05-29T20:10:03.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:10:03.562 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:10:03.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:10:03.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:10:03.584 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:10:03.584 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:10:03.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:10:03.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:10:03.585 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:10:03.585 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:10:03.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:10:03.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:10:03.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:10:03.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:10:03.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:10:03.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:10:03.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:10:03.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:10:03.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:10:03.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:10:03.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:10:03.853 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:10:03.921 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:09:42
2026-05-29T20:10:03.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72752, datetime.datetime(2026, 5, 29, 20, 9, 42), datetime.datetime(2026, 5, 29, 20, 9, 42), 'salt', 9.45, 77.5, None, 17.64, 42.77, 3.73, 832.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:10:03.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:10:03.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:10:03.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:09:42, diff=21.928088s, valid=True
2026-05-29T20:10:03.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:10:03.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:10:03.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:10:12, diff=-8.069042s, valid=True
2026-05-29T20:10:03.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:10:03.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:10:03.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:09:39, diff=24.937772s, valid=True
2026-05-29T20:10:03.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:10:03.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:10:03.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:10:03.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:10:03.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:10:03.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:10:03.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:10:12, diff=-8.05916s, valid=True
2026-05-29T20:10:03.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:10:03.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:10:03.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:10:03.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010845.941509s, valid=True
2026-05-29T20:10:03.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:10:03.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:10:03.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:10:03.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:10:03.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:10:04.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:10:04.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:10:04.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:10:04.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:10:04.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:10:04.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:10:04.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:10:04.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:10:04.262 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:10:04.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:10:04.910 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:10:05.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:10:05.014 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:10:05.014 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:10:05.277 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:10:05.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:10:35.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:10:35.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:10:35.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:10:35.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:10:35.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:10:35.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:10:35.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-05-29T20:10:35.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:10:35.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-05-29T20:10:35.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:10:35.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:10:35.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:10:35.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-05-29T20:10:38.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-05-29T20:10:38.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:10:38.802 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:10:38.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:10:38.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:10:38.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:10:38.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:10:38.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:10:38.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:10:38.824 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:10:38.824 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:10:38.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:10:38.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:10:38.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:10:38.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:10:38.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:10:39.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:10:39.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:10:39.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:10:39.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:10:39.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:10:39.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:10:39.079 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:10:39.163 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:10:13
2026-05-29T20:10:39.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72753, datetime.datetime(2026, 5, 29, 20, 10, 13), datetime.datetime(2026, 5, 29, 20, 10, 12), 'salt', 9.45, 77.57, None, 18.1, 44.89, 3.71, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:10:39.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:10:39.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:10:39.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:10:12, diff=27.169227s, valid=True
2026-05-29T20:10:39.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:10:39.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:10:39.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:10:12, diff=27.172146s, valid=True
2026-05-29T20:10:39.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:10:39.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:10:39.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:10:09, diff=30.178717s, valid=True
2026-05-29T20:10:39.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:10:39.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:10:39.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:10:39.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:10:39.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:10:39.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:10:39.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:10:12, diff=27.181778s, valid=True
2026-05-29T20:10:39.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:10:39.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:10:39.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:10:39.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010881.182437s, valid=True
2026-05-29T20:10:39.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:10:39.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:10:39.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:10:39.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:10:39.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:10:39.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:10:39.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:10:39.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:10:39.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:10:39.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:10:39.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:10:39.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:10:39.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:10:39.498 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:10:39.729 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:10:40.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:10:40.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:10:40.213 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:10:40.213 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:10:40.472 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:10:40.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:11:10.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:11:10.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:11:10.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:11:10.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:11:10.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:11:10.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:11:10.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-05-29T20:11:10.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:11:10.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-05-29T20:11:10.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:11:10.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:11:10.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:11:10.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-05-29T20:11:13.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-05-29T20:11:13.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:11:13.825 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:11:13.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:11:13.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:11:13.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:11:13.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:11:13.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:11:13.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:11:13.846 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:11:13.846 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:11:13.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:11:13.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:11:13.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:11:14.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:11:14.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:11:14.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:11:14.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:11:14.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:11:14.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:11:14.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:11:14.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:11:14.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:11:14.174 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:11:13
2026-05-29T20:11:14.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72755, datetime.datetime(2026, 5, 29, 20, 11, 13), datetime.datetime(2026, 5, 29, 20, 11, 13), 'salt', 9.39, 77.5, None, 17.89, 43.76, 3.73, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:11:14.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:11:14.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:11:14.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:11:13, diff=1.181852s, valid=True
2026-05-29T20:11:14.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:11:14.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:11:14.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:11:12, diff=2.184697s, valid=True
2026-05-29T20:11:14.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:11:14.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:11:14.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:11:09, diff=5.192473s, valid=True
2026-05-29T20:11:14.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:11:14.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:11:14.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:11:14.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:11:14.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:11:14.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:11:14.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:11:12, diff=2.196066s, valid=True
2026-05-29T20:11:14.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:11:14.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:11:14.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:11:14.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1010916.197156s, valid=True
2026-05-29T20:11:14.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:11:14.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:11:14.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:11:14.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:11:14.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:11:14.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:11:14.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:11:14.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:11:14.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:11:14.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:11:14.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:11:14.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:11:14.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:11:14.527 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:11:14.824 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:11:15.186 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:11:15.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:11:15.286 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:11:15.286 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:11:15.476 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:11:15.476 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:11:45.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:11:45.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:11:45.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:11:45.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:11:45.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:11:46.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:11:46.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-05-29T20:11:46.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:11:46.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-05-29T20:11:46.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:11:46.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:11:46.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:11:46.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T20:12:56.393 [ERROR] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] processing LCO all-sky image: HTTPSConnectionPool(host='s3.us-west-2.amazonaws.com', port=443): Read timed out.
2026-05-29T20:12:56.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:12:56.396 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:12:56.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:12:56.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:12:56.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:12:56.417 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:12:56.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:12:56.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:12:56.417 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:12:56.417 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:12:56.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:12:56.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:12:56.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:12:56.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:12:56.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:12:56.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:12:56.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:12:56.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:12:56.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:12:56.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:12:56.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:12:56.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:12:56.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:12:44
2026-05-29T20:12:56.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72758, datetime.datetime(2026, 5, 29, 20, 12, 44), datetime.datetime(2026, 5, 29, 20, 12, 44), 'salt', 9.45, 77.1, None, 18.28, 43.97, 3.8, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:12:56.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:12:56.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:12:56.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:12:44, diff=12.742864s, valid=True
2026-05-29T20:12:56.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:12:56.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:12:56.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:13:12, diff=-15.254317s, valid=True
2026-05-29T20:12:56.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:12:56.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:12:56.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:12:43, diff=13.752434s, valid=True
2026-05-29T20:12:56.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:12:56.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:12:56.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:12:56.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:12:56.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:12:56.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:12:56.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:13:12, diff=-15.244527s, valid=True
2026-05-29T20:12:56.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:12:56.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:12:56.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:12:56.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011018.756142s, valid=True
2026-05-29T20:12:56.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:12:56.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:12:56.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:12:56.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:12:56.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:12:56.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:12:56.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:12:56.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:12:56.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:12:56.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:12:56.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:12:56.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:12:57.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:12:57.082 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:12:57.297 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:12:57.647 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:12:57.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:12:57.748 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:12:57.748 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:12:57.932 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:12:57.932 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:13:27.962 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:13:27.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:13:27.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:13:28.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:13:28.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:13:28.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:13:28.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-05-29T20:13:28.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:13:28.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-05-29T20:13:28.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:13:28.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:13:28.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:13:28.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-05-29T20:13:31.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-05-29T20:13:31.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:13:31.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:13:31.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:13:31.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:13:31.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:13:31.575 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:13:31.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:13:31.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:13:31.575 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:13:31.575 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:13:31.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:13:31.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:13:31.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:13:31.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:13:31.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:13:31.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:13:31.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:13:31.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:13:31.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:13:31.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:13:31.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:13:31.847 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:13:31.908 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:13:15
2026-05-29T20:13:31.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72759, datetime.datetime(2026, 5, 29, 20, 13, 15), datetime.datetime(2026, 5, 29, 20, 13, 14), 'salt', 9.55, 77.04, None, 19.2, 45.96, 3.81, 832.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:13:31.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:13:31.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:13:31.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:13:14, diff=17.914413s, valid=True
2026-05-29T20:13:31.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:13:31.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:13:31.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:13:12, diff=19.91725s, valid=True
2026-05-29T20:13:31.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:13:31.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:13:31.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:13:10, diff=21.923956s, valid=True
2026-05-29T20:13:31.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:13:31.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:13:31.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:13:31.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:13:31.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:13:31.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:13:31.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:13:12, diff=19.926977s, valid=True
2026-05-29T20:13:31.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:13:31.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:13:31.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:13:31.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011053.927641s, valid=True
2026-05-29T20:13:31.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:13:31.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:13:31.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:13:31.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:13:31.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:13:31.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:13:31.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:13:31.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:13:32.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:13:32.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:13:32.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:13:32.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:13:32.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:13:32.319 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:13:32.536 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:13:32.887 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:13:32.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:13:32.990 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:13:32.990 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:13:33.186 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:13:33.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:14:03.216 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:14:03.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:14:03.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:14:03.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:14:03.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:14:03.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:14:03.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-05-29T20:14:03.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:14: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-05-29T20:14:03.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:14:03.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:14:03.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:14: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-05-29T20:14:07.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-05-29T20:14:07.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:14:07.293 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:14:07.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:14:07.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:14:07.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:14:07.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:14:07.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:14:07.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:14:07.315 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:14:07.315 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:14:07.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:14:07.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:14:07.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:14:07.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:14:07.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:14:07.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:14:07.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:14:07.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:14:07.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:14:07.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:14:07.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:14:07.593 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:14:07.652 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:13:45
2026-05-29T20:14:07.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72760, datetime.datetime(2026, 5, 29, 20, 13, 45), datetime.datetime(2026, 5, 29, 20, 13, 44), 'salt', 9.52, 76.84, None, 16.76, 47.28, 3.85, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:14:07.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:14:07.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:14:07.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:13:44, diff=23.658366s, valid=True
2026-05-29T20:14:07.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:14:07.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:14:07.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:14:12, diff=-4.33878s, valid=True
2026-05-29T20:14:07.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:14:07.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:14:07.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:13:41, diff=26.667932s, valid=True
2026-05-29T20:14:07.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:14:07.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:14:07.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:14:07.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:14:07.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:14:07.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:14:07.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:14:12, diff=-4.329014s, valid=True
2026-05-29T20:14:07.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:14:07.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:14:07.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:14:07.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011089.671673s, valid=True
2026-05-29T20:14:07.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:14:07.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:14:07.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:14:07.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:14:07.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:14:07.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:14:07.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:14:07.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:14:07.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:14:07.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:14:07.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:14:07.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:14:07.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:14:07.991 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:14:08.205 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:14:08.581 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:14:08.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:14:08.681 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:14:08.681 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:14:08.873 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:14:08.873 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:14:38.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:14:38.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:14:38.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:14:39.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:14:39.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:14:39.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:14:39.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-05-29T20:14:39.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:14:39.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-05-29T20:14:39.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:14:39.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:14:39.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:14:39.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-05-29T20:14:41.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-05-29T20:14:41.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:14:41.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:14:41.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:14:41.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:14:41.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:14:41.732 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:14:41.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:14:41.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:14:41.732 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:14:41.732 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:14:41.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:14:41.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:14:41.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:14:41.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:14:41.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:14:41.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:14:41.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:14:41.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:14:41.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:14:41.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:14:41.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:14:41.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:14:42.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:14:15
2026-05-29T20:14:42.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72761, datetime.datetime(2026, 5, 29, 20, 14, 15), datetime.datetime(2026, 5, 29, 20, 14, 15), 'salt', 9.59, 76.64, None, 17.93, 45.71, 3.9, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:14:42.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:14:42.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:14:42.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:14:15, diff=27.059187s, valid=True
2026-05-29T20:14:42.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:14:42.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:14:42.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:14:12, diff=30.062066s, valid=True
2026-05-29T20:14:42.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:14:42.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:14:42.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:14:11, diff=31.06876s, valid=True
2026-05-29T20:14:42.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:14:42.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:14:42.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:14:42.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:14:42.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:14:42.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:14:42.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:14:12, diff=30.072182s, valid=True
2026-05-29T20:14:42.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:14:42.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:14:42.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:14:42.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011124.073028s, valid=True
2026-05-29T20:14:42.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:14:42.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:14:42.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:14:42.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:14:42.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:14:42.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:14:42.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:14:42.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:14:42.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:14:42.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:14:42.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:14:42.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:14:42.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:14:42.463 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:14:42.680 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:14:43.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:14:43.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:14:43.127 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:14:43.127 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:14:43.314 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:14:43.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:15:13.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:15:13.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:15:13.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:15:13.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:15:13.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:15:13.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:15:13.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T20:15:13.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:15:13.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-05-29T20:15:13.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:15:13.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:15:13.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:15:13.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-05-29T20:16: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-05-29T20:16:03.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:16:03.909 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:16:03.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:16:03.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:16:03.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:16:03.930 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:16:03.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:16:03.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:16:03.930 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:16:03.931 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:16:03.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:16:04.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:16:04.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:16:04.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:16:04.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:16:04.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:16:04.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:16:04.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:16:04.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:16:04.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:16:04.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:16:04.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:16:04.278 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:15:46
2026-05-29T20:16:04.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72764, datetime.datetime(2026, 5, 29, 20, 15, 46), datetime.datetime(2026, 5, 29, 20, 15, 45), 'salt', 9.62, 76.24, None, 17.47, 44.09, 3.97, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:16:04.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:16:04.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:16:04.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:15:45, diff=19.28557s, valid=True
2026-05-29T20:16:04.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:16:04.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:16:04.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:16:12, diff=-7.711317s, valid=True
2026-05-29T20:16:04.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:16:04.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:16:04.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:15:42, diff=22.296285s, valid=True
2026-05-29T20:16:04.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:16:04.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:16:04.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:16:04.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:16:04.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:16:04.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:16:04.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:16:12, diff=-7.700421s, valid=True
2026-05-29T20:16:04.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:16:04.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:16:04.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:16:04.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011206.300322s, valid=True
2026-05-29T20:16:04.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:16:04.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:16:04.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:16:04.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:16:04.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:16:04.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:16:04.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:16:04.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:16:04.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:16:04.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:16:04.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:16:04.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:16:04.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:16:04.649 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:16:04.869 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:16:05.222 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:16:05.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:16:05.323 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:16:05.323 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:16:05.564 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:16:05.564 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:16:35.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:16:35.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:16:35.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:16:35.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:16:35.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:16:36.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:16:36.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-05-29T20:16:36.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:16:36.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T20:16:36.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:16:36.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:16:36.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:16:36.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-05-29T20:16: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-05-29T20:16:41.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:16:41.168 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:16:41.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:16:41.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:16:41.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:16:41.189 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:16:41.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:16:41.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:16:41.189 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:16:41.190 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:16:41.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:16:41.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:16:41.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:16:41.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:16:41.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:16:41.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:16:41.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:16:41.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:16:41.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:16:41.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:16:41.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:16:41.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:16:41.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:16:16
2026-05-29T20:16:41.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72765, datetime.datetime(2026, 5, 29, 20, 16, 16), datetime.datetime(2026, 5, 29, 20, 16, 15), 'salt', 9.52, 76.27, None, 17.11, 47.44, 3.96, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:16:41.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:16:41.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:16:41.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:16:15, diff=26.596437s, valid=True
2026-05-29T20:16:41.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:16:41.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:16:41.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:16:12, diff=29.59954s, valid=True
2026-05-29T20:16:41.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:16:41.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:16:41.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:16:13, diff=28.606763s, valid=True
2026-05-29T20:16:41.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:16:41.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:16:41.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:16:41.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:16:41.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:16:41.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:16:41.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:16:12, diff=29.610325s, valid=True
2026-05-29T20:16:41.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:16:41.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:16:41.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:16:41.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011243.611066s, valid=True
2026-05-29T20:16:41.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:16:41.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:16:41.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:16:41.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:16:41.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:16:41.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:16:41.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:16:41.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:16:41.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:16:41.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:16:41.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:16:41.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:16:41.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:16:41.936 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:16:42.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:16:42.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:16:42.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:16:42.627 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:16:42.627 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:16:42.877 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:16:42.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:17:12.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:17:12.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:17:12.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:17:13.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:17:13.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:17:13.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:17:13.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-05-29T20:17:13.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:17:13.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-05-29T20:17:13.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:17:13.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:17:13.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:17:13.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-05-29T20:17:15.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T20:17:15.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:17:15.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:17:15.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:17:15.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:17:15.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:17:15.954 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:17:15.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:17:15.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:17:15.954 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:17:15.954 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:17:15.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:17:16.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:17:16.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:17:16.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:17:16.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:17:16.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:17:16.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:17:16.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:17:16.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:17:16.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:17:16.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:17:16.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:17:16.277 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:16:46
2026-05-29T20:17:16.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72766, datetime.datetime(2026, 5, 29, 20, 16, 46), datetime.datetime(2026, 5, 29, 20, 16, 46), 'salt', 9.59, 76.21, None, 16.51, 45.59, 3.98, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:17:16.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:17:16.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:17:16.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:16:46, diff=30.284217s, valid=True
2026-05-29T20:17:16.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:17:16.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:17:16.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:17:12, diff=4.287067s, valid=True
2026-05-29T20:17:16.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:17:16.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:17:16.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:16:45, diff=31.293854s, valid=True
2026-05-29T20:17:16.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:17:16.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:17:16.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:17:16.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:17:16.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:17:16.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:17:16.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:17:12, diff=4.296944s, valid=True
2026-05-29T20:17:16.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:17:16.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:17:16.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:17:16.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011278.297611s, valid=True
2026-05-29T20:17:16.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:17:16.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:17:16.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:17:16.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:17:16.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:17:16.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:17:16.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:17:16.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:17:16.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:17:16.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:17:16.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:17:16.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:17:16.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:17:16.633 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:17:16.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:17:17.227 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:17:17.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:17:17.332 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:17:17.332 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:17:19.866 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:17:19.866 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:17:49.895 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:17:49.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:17:49.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:17:50.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:17:50.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:17:50.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:17:50.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-05-29T20:17:50.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:17:50.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-05-29T20:17:50.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:17:50.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:17:50.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:17:50.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-05-29T20:17:52.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-05-29T20:17:52.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:17:52.791 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:17:52.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:17:52.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:17:52.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:17:52.812 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:17:52.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:17:52.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:17:52.813 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:17:52.813 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:17:52.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:17:52.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:17:52.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:17:52.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:17:52.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:17:53.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:17:53.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:17:53.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:17:53.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:17:53.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:17:53.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:17:53.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:17:53.130 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:17:47
2026-05-29T20:17:53.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72768, datetime.datetime(2026, 5, 29, 20, 17, 47), datetime.datetime(2026, 5, 29, 20, 17, 46), 'salt', 9.52, 76.21, None, 16.69, 36.62, 3.97, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:17:53.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:17:53.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:17:53.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:17:46, diff=7.136563s, valid=True
2026-05-29T20:17:53.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:17:53.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:17:53.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:18:12, diff=-18.860587s, valid=True
2026-05-29T20:17:53.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:17:53.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:17:53.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:17:43, diff=10.146198s, valid=True
2026-05-29T20:17:53.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:17:53.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:17:53.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:17:53.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:17:53.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:17:53.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:17:53.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:18:12, diff=-18.850758s, valid=True
2026-05-29T20:17:53.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:17:53.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:17:53.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:17:53.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011315.149916s, valid=True
2026-05-29T20:17:53.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:17:53.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:17:53.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:17:53.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:17:53.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:17:53.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:17:53.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:17:53.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:17:53.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:17:53.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:17:53.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:17:53.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:17:53.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:17:53.466 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:17:53.679 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:17:54.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:17:54.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:17:54.127 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:17:54.127 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:17:54.376 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:17:54.376 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:18:24.398 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:18:24.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:18:24.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:18:24.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:18:24.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:18:24.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:18:25.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-05-29T20:18:25.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:18:25.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-05-29T20:18:25.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:18:25.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:18:25.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:18:25.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-05-29T20:18:27.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-05-29T20:18:27.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:18:27.391 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:18:27.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:18:27.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:18:27.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:18:27.411 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:18:27.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:18:27.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:18:27.412 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:18:27.412 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:18:27.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:18:27.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:18:27.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:18:27.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:18:27.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:18:27.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:18:27.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:18:27.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:18:27.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:18:27.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:18:27.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:18:27.674 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:18:27.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:18:17
2026-05-29T20:18:27.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72769, datetime.datetime(2026, 5, 29, 20, 18, 17), datetime.datetime(2026, 5, 29, 20, 18, 17), 'salt', 9.55, 76.17, None, 15.74, 46.53, 3.98, 832.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:18:27.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:18:27.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:18:27.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:18:17, diff=10.740386s, valid=True
2026-05-29T20:18:27.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:18:27.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:18:27.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:18:12, diff=15.743237s, valid=True
2026-05-29T20:18:27.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:18:27.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:18:27.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:18:13, diff=14.749896s, valid=True
2026-05-29T20:18:27.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:18:27.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:18:27.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:18:27.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:18:27.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:18:27.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:18:27.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:18:12, diff=15.752942s, valid=True
2026-05-29T20:18:27.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:18:27.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:18:27.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:18:27.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011349.753598s, valid=True
2026-05-29T20:18:27.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:18:27.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:18:27.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:18:27.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:18:27.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:18:27.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:18:27.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:18:27.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:18:27.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:18:27.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:18:27.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:18:27.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:18:28.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:18:28.073 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:18:28.290 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:18:28.699 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:18:28.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:18:28.798 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:18:28.798 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:18:28.958 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:18:28.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:18:58.988 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:18:58.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:18:58.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:18:59.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:18:59.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:18:59.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:18:59.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-05-29T20:18:59.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:18:59.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-05-29T20:18:59.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:18:59.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:18:59.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:18:59.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-05-29T20:19:50.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T20:19:50.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:19:50.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:19:50.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:19:50.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:19:50.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:19:50.852 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:19:50.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:19:50.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:19:50.852 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:19:50.853 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:19:50.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:19:50.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:19:50.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:19:51.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:19:51.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:19:51.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:19:51.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:19:51.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:19:51.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:19:51.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:19:51.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:19:51.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:19:51.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:19:48
2026-05-29T20:19:51.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72772, datetime.datetime(2026, 5, 29, 20, 19, 48), datetime.datetime(2026, 5, 29, 20, 19, 47), 'salt', 9.42, 76.27, None, 17.22, 40.07, 3.96, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:19:51.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:19:51.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:19:51.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:19:47, diff=4.191284s, valid=True
2026-05-29T20:19:51.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:19:51.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:19:51.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:20:12, diff=-20.805837s, valid=True
2026-05-29T20:19:51.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:19:51.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:19:51.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:19:44, diff=7.200807s, valid=True
2026-05-29T20:19:51.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:19:51.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:19:51.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:19:51.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:19:51.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:19:51.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:19:51.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:20:12, diff=-20.796135s, valid=True
2026-05-29T20:19:51.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:19:51.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:19:51.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:19:51.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011433.204521s, valid=True
2026-05-29T20:19:51.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:19:51.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:19:51.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:19:51.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:19:51.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:19:51.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:19:51.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:19:51.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:19:51.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:19:51.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:19:51.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:19:51.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:19:51.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:19:51.523 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:19:51.741 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:19:52.129 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:19:52.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:19:52.231 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:19:52.231 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:19:52.418 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:19:52.418 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:20:22.448 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:20:22.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:20:22.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:20:22.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:20:22.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:20:22.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:20:22.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-05-29T20:20:22.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:20:22.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-05-29T20:20:22.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:20:22.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:20:22.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:20:22.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-05-29T20:20:46.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-05-29T20:20:46.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:20:46.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:20:46.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:20:46.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:20:46.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:20:46.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:20:46.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:20:46.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:20:46.940 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:20:46.940 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:20:46.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:20:47.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:20:47.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:20:47.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:20:47.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:20:47.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:20:47.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:20:47.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:20:47.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:20:47.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:20:47.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:20:47.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:20:47.267 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:20:18
2026-05-29T20:20:47.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72773, datetime.datetime(2026, 5, 29, 20, 20, 18), datetime.datetime(2026, 5, 29, 20, 20, 18), 'salt', 9.45, 76.34, None, 17.57, 43.67, 3.94, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:20:47.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:20:47.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:20:47.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:20:18, diff=29.273701s, valid=True
2026-05-29T20:20:47.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:20:47.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:20:47.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:20:12, diff=35.276501s, valid=True
2026-05-29T20:20:47.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:20:47.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:20:47.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:20:15, diff=32.283222s, valid=True
2026-05-29T20:20:47.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:20:47.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:20:47.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:20:47.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:20:47.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:20:47.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:20:47.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:20:12, diff=35.28622s, valid=True
2026-05-29T20:20:47.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:20:47.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:20:47.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:20:47.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011489.286876s, valid=True
2026-05-29T20:20:47.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:20:47.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:20:47.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:20:47.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:20:47.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:20:47.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:20:47.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:20:47.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:20:47.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:20:47.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:20:47.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:20:47.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:20:47.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:20:47.603 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:20:47.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:20:48.237 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:20:48.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:20:48.337 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:20:48.337 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:20:48.526 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:20:48.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:21:18.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:21:18.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:21:18.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:21:19.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:21:19.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:21:19.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:21:19.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-05-29T20:21:19.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:21:19.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-05-29T20:21:19.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:21:19.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:21:19.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:21:19.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-05-29T20:21:21.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-05-29T20:21:21.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:21:21.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:21:21.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:21:21.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:21:21.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:21:21.821 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:21:21.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:21:21.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:21:21.821 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:21:21.821 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:21:21.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:21:21.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:21:21.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:21:22.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:21:22.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:21:22.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:21:22.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:21:22.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:21:22.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:21:22.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:21:22.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:21:22.091 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:21:22.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:21:18
2026-05-29T20:21:22.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72775, datetime.datetime(2026, 5, 29, 20, 21, 18), datetime.datetime(2026, 5, 29, 20, 21, 18), 'salt', 9.45, 76.67, None, 17.04, 42.89, 3.88, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:21:22.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:21:22.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:21:22.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:21:18, diff=4.160689s, valid=True
2026-05-29T20:21:22.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:21:22.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:21:22.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:21:12, diff=10.163495s, valid=True
2026-05-29T20:21:22.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:21:22.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:21:22.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:21:18, diff=4.170146s, valid=True
2026-05-29T20:21:22.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:21:22.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:21:22.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:21:22.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:21:22.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:21:22.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:21:22.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:21:12, diff=10.173179s, valid=True
2026-05-29T20:21:22.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:21:22.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:21:22.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:21:22.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011524.173847s, valid=True
2026-05-29T20:21:22.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:21:22.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:21:22.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:21:22.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:21:22.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:21:22.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:21:22.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:21:22.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:21:22.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:21:22.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:21:22.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:21:22.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:21:22.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:21:22.492 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:21:22.708 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:21:23.059 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:21:23.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:21:23.160 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:21:23.160 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:21:23.413 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:21:23.413 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:21:53.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:21:53.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:21:53.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:21:53.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:21:53.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:21:53.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:21:53.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-05-29T20:21:53.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:21:53.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T20:21:53.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:21:53.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:21:53.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:21:53.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T20:22:14.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-05-29T20:22:14.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:22:14.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:22:14.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:22:14.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:22:14.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:22:14.938 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:22:14.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:22:14.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:22:14.938 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:22:14.938 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:22:14.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:22:15.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:22:15.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:22:15.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:22:15.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:22:15.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:22:15.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:22:15.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:22:15.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:22:15.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:22:15.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:22:15.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:22:15.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:21:49
2026-05-29T20:22:15.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72776, datetime.datetime(2026, 5, 29, 20, 21, 49), datetime.datetime(2026, 5, 29, 20, 21, 48), 'salt', 9.42, 76.77, None, 17.75, 40.68, 3.86, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:22:15.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:22:15.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:22:15.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:21:48, diff=27.257764s, valid=True
2026-05-29T20:22:15.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:22:15.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:22:15.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:22:12, diff=3.260612s, valid=True
2026-05-29T20:22:15.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:22:15.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:22:15.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:21:45, diff=30.267383s, valid=True
2026-05-29T20:22:15.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:22:15.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:22:15.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:22:15.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:22:15.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:22:15.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:22:15.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:22:12, diff=3.270507s, valid=True
2026-05-29T20:22:15.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:22:15.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:22:15.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:22:15.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011577.271178s, valid=True
2026-05-29T20:22:15.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:22:15.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:22:15.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:22:15.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:22:15.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:22:15.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:22:15.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:22:15.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:22:15.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:22:15.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:22:15.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:22:15.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:22:15.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:22:15.588 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:22:15.872 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:22:16.221 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:22:16.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:22:16.321 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:22:16.321 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:22:16.505 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:22:16.505 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:22:46.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:22:46.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:22:46.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:22:46.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:22:46.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:22:46.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:22:46.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-05-29T20:22:46.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:22:46.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-05-29T20:22:46.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:22:46.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:22:46.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:22:46.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-05-29T20:22:49.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T20:22:49.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:22:49.342 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:22:49.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:22:49.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:22:49.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:22:49.362 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:22:49.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:22:49.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:22:49.363 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:22:49.363 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:22:49.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:22:49.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:22:49.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:22:49.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:22:49.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:22:49.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:22:49.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:22:49.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:22:49.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:22:49.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:22:49.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:22:49.630 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:22:49.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:22:49
2026-05-29T20:22:49.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72778, datetime.datetime(2026, 5, 29, 20, 22, 49), datetime.datetime(2026, 5, 29, 20, 22, 49), 'salt', 9.39, 76.54, None, 18.0, 38.99, 3.91, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:22:49.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:22:49.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:22:49.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:22:49, diff=0.707109s, valid=True
2026-05-29T20:22:49.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:22:49.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:22:49.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:23:12, diff=-22.290037s, valid=True
2026-05-29T20:22:49.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:22:49.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:22:49.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:22:46, diff=3.716605s, valid=True
2026-05-29T20:22:49.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:22:49.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:22:49.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:22:49.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:22:49.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:22:49.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:22:49.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:23:12, diff=-22.280357s, valid=True
2026-05-29T20:22:49.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:22:49.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:22:49.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:22:49.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011611.720312s, valid=True
2026-05-29T20:22:49.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:22:49.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:22:49.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:22:49.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:22:49.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:22:49.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:22:49.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:22:49.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:22:49.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:22:49.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:22:49.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:22:49.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:22:50.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:22:50.060 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:22:50.285 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:22:50.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:22:50.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:22: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-05-29T20:22: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-05-29T20:22:50.987 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:22:50.987 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:23:21.010 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:23:21.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:23:21.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:23:21.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:23:21.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:23:21.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:23:21.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-05-29T20:23:21.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:23:21.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-05-29T20:23:21.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:23:21.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:23:21.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:23:21.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-05-29T20:24:03.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T20:24:03.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:24:03.199 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:24:03.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:24:03.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:24:03.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:24:03.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:24:03.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:24:03.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:24:03.231 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:24:03.231 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:24:03.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:24:03.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:24:03.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:24:03.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:24:03.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:24:03.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:24:03.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:24:03.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:24:03.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:24:03.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:24:03.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:24:03.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:24:03.565 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:23:51
2026-05-29T20:24:03.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72780, datetime.datetime(2026, 5, 29, 20, 23, 51), datetime.datetime(2026, 5, 29, 20, 23, 51), 'salt', 9.42, 76.31, None, 18.88, 38.34, 3.95, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:24:03.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:24:03.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:24:03.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:23:51, diff=12.571979s, valid=True
2026-05-29T20:24:03.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:24:03.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:24:03.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:24:12, diff=-8.425157s, valid=True
2026-05-29T20:24:03.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:24:03.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:24:03.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:23:46, diff=17.581641s, valid=True
2026-05-29T20:24:03.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:24:03.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:24:03.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:24:03.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:24:03.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:24:03.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:24:03.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:24:12, diff=-8.415233s, valid=True
2026-05-29T20:24:03.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:24:03.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:24:03.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:24:03.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011685.585436s, valid=True
2026-05-29T20:24:03.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:24:03.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:24:03.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:24:03.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:24:03.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:24:03.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:24:03.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:24:03.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:24:03.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:24:03.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:24:03.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:24:03.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:24:03.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:24:03.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:24:04.191 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:24:04.539 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:24:04.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:24:04.640 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:24:04.641 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:24:06.277 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:24:06.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:24:36.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:24:36.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:24:36.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:24:36.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:24:36.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:24:36.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:24:36.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-05-29T20:24:36.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:24:36.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-05-29T20:24:36.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:24:36.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:24:36.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:24:36.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-05-29T20:24:39.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-05-29T20:24:39.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:24:39.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:24:39.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:24:39.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:24:39.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:24:39.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:24:39.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:24:39.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:24:39.255 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:24:39.255 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:24:39.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:24:39.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:24:39.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:24:39.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:24:39.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:24:39.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:24:39.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:24:39.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:24:39.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:24:39.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:24:39.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:24:39.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:24:39.587 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:24:22
2026-05-29T20:24:39.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72781, datetime.datetime(2026, 5, 29, 20, 24, 22), datetime.datetime(2026, 5, 29, 20, 24, 21), 'salt', 9.42, 76.14, None, 17.47, 40.03, 3.98, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:24:39.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:24:39.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:24:39.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:24:21, diff=18.593716s, valid=True
2026-05-29T20:24:39.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:24:39.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:24:39.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:24:12, diff=27.59656s, valid=True
2026-05-29T20:24:39.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:24:39.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:24:39.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:24:17, diff=22.603405s, valid=True
2026-05-29T20:24:39.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:24:39.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:24:39.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:24:39.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:24:39.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:24:39.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:24:39.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:24:12, diff=27.606429s, valid=True
2026-05-29T20:24:39.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:24:39.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:24:39.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:24:39.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011721.607105s, valid=True
2026-05-29T20:24:39.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:24:39.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:24:39.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:24:39.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:24:39.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:24:39.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:24:39.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:24:39.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:24:39.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:24:39.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:24:39.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:24:39.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:24:39.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:24:39.945 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:24:40.185 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:24:40.547 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:24:40.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:24:40.658 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:24:40.658 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:24:40.897 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:24:40.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:25:10.903 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:25:10.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:25:10.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:25:11.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:25:11.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:25:11.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:25:11.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-05-29T20:25:11.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:25: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-05-29T20:25:11.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:25:11.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:25:11.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:25:11.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-05-29T20:25:13.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-05-29T20:25:13.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:25:13.875 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:25:13.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:25:13.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:25:13.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:25:13.898 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:25:13.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:25:13.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:25:13.898 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:25:13.898 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:25:13.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:25:13.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:25:13.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:25:14.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:25:14.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:25:14.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:25:14.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:25:14.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:25:14.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:25:14.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:25:14.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:25:14.148 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:25:14.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:24:52
2026-05-29T20:25:14.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72782, datetime.datetime(2026, 5, 29, 20, 24, 52), datetime.datetime(2026, 5, 29, 20, 24, 52), 'salt', 9.39, 76.01, None, 18.74, 38.76, 4.01, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:25:14.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:25:14.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:25:14.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:24:52, diff=22.213946s, valid=True
2026-05-29T20:25:14.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:25:14.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:25:14.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:25:12, diff=2.216782s, valid=True
2026-05-29T20:25:14.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:25:14.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:25:14.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:24:48, diff=26.223305s, valid=True
2026-05-29T20:25:14.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:25:14.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:25:14.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:25:14.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:25:14.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:25:14.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:25:14.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:25:12, diff=2.226312s, valid=True
2026-05-29T20:25:14.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:25:14.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:25:14.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:25:14.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011756.226973s, valid=True
2026-05-29T20:25:14.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:25:14.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:25:14.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:25:14.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:25:14.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:25:14.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:25:14.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:25:14.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:25:14.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:25:14.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:25:14.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:25:14.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:25:14.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:25:14.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:25:14.855 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:25:15.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:25:15.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:25:15.357 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:25:15.357 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:25:15.548 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:25:15.548 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:25:45.566 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:25:45.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:25:45.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:25:45.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:25:45.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:25:45.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:25:45.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-05-29T20:25:46.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:25:46.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-05-29T20:25:46.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:25:46.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:25:46.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:25:46.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-05-29T20:25:48.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-05-29T20:25:48.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:25:48.401 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:25:48.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:25:48.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:25:48.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:25:48.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:25:48.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:25:48.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:25:48.421 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:25:48.421 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:25:48.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:25:48.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:25:48.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:25:48.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:25:48.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:25:48.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:25:48.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:25:48.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:25:48.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:25:48.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:25:48.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:25:48.678 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:25:48.740 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:25:22
2026-05-29T20:25:48.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72783, datetime.datetime(2026, 5, 29, 20, 25, 22), datetime.datetime(2026, 5, 29, 20, 25, 22), 'salt', 9.45, 76.08, None, 18.63, 38.83, 3.99, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:25:48.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:25:48.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:25:48.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:25:22, diff=26.746319s, valid=True
2026-05-29T20:25:48.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:25:48.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:25:48.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:25:12, diff=36.749124s, valid=True
2026-05-29T20:25:48.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:25:48.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:25:48.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:25:20, diff=28.755952s, valid=True
2026-05-29T20:25:48.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:25:48.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:25:48.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:25:48.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:25:48.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:25:48.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:25:48.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:25:12, diff=36.758964s, valid=True
2026-05-29T20:25:48.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:25:48.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:25:48.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:25:48.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011790.759612s, valid=True
2026-05-29T20:25:48.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:25:48.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:25:48.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:25:48.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:25:48.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:25:48.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:25:48.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:25:48.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:25:48.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:25:48.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:25:48.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:25:48.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:25:49.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:25:49.076 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:25:49.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:25:49.640 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:25:49.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:25:49.741 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:25:49.741 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:25:50.016 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:25:50.016 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:26:20.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:26:20.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:26:20.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:26:20.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:26:20.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:26:20.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:26:20.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-05-29T20:26:20.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:26:20.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-05-29T20:26:20.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:26:20.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:26:20.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:26:20.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-05-29T20:26:58.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-05-29T20:26:58.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:26:58.625 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:26:58.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:26:58.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:26:58.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:26:58.646 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:26:58.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:26:58.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:26:58.647 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:26:58.647 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:26:58.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:26:58.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:26:58.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:26:58.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:26:58.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:26:58.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:26:58.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:26:58.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:26:58.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:26:58.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:26:58.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:26:58.969 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:26:59.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:26:53
2026-05-29T20:26:59.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72786, datetime.datetime(2026, 5, 29, 20, 26, 53), datetime.datetime(2026, 5, 29, 20, 26, 52), 'salt', 9.35, 75.94, None, 18.31, 38.99, 4.01, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:26:59.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:26:59.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:26:59.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:26:52, diff=7.047613s, valid=True
2026-05-29T20:26:59.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:26:59.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:26:59.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:27:12, diff=-12.949549s, valid=True
2026-05-29T20:26:59.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:26:59.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:26:59.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:26:48, diff=11.057116s, valid=True
2026-05-29T20:26:59.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:26:59.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:26:59.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:26:59.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:26:59.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:26:59.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:26:59.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:27:12, diff=-12.939853s, valid=True
2026-05-29T20:26:59.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:26:59.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:26:59.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:26:59.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011861.060804s, valid=True
2026-05-29T20:26:59.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:26:59.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:26:59.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:26:59.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:26:59.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:26:59.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:26:59.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:26:59.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:26:59.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:26:59.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:26:59.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:26:59.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:26:59.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:26:59.376 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:26:59.590 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:26:59.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:27:00.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:27:00.064 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:27:00.064 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:27:00.317 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:27:00.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:27:30.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:27:30.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:27:30.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:27:30.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:27:30.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:27:30.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:27:30.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-05-29T20:27:30.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:27:30.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-05-29T20:27:30.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:27:30.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:27:30.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:27:30.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-05-29T20:27:33.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-05-29T20:27:33.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:27:33.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:27:33.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:27:33.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:27:33.405 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:27:33.405 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:27:33.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:27:33.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:27:33.406 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:27:33.406 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:27:33.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:27:33.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:27:33.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:27:33.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:27:33.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:27:33.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:27:33.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:27:33.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:27:33.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:27:33.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:27:33.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:27:33.684 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:27:33.747 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:27:23
2026-05-29T20:27:33.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72787, datetime.datetime(2026, 5, 29, 20, 27, 23), datetime.datetime(2026, 5, 29, 20, 27, 23), 'salt', 9.39, 75.91, None, 18.1, 42.14, 4.03, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:27:33.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:27:33.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:27:33.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:27:23, diff=10.753903s, valid=True
2026-05-29T20:27:33.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:27:33.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:27:33.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:27:12, diff=21.758095s, valid=True
2026-05-29T20:27:33.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:27:33.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:27:33.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:27:18, diff=15.767412s, valid=True
2026-05-29T20:27:33.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:27:33.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:27:33.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:27:33.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:27:33.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:27:33.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:27:33.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:27:12, diff=21.770488s, valid=True
2026-05-29T20:27:33.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:27:33.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:27:33.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:27:33.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011895.771152s, valid=True
2026-05-29T20:27:33.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:27:33.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:27:33.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:27:33.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:27:33.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:27:33.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:27:33.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:27:33.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:27:33.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:27:33.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:27:33.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:27:34.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:27:34.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:27:34.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:27:34.317 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:27:34.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:27:34.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:27:34.781 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:27:34.781 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:27:34.964 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:27:34.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:28:04.968 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:28:04.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:28:04.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:28:05.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:28:05.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:28:05.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:28:05.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-05-29T20:28:05.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:28:05.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T20:28:05.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:28:05.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:28:05.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:28:05.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-05-29T20:28:08.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-05-29T20:28:08.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:28:08.509 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:28:08.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:28:08.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:28:08.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:28:08.530 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:28:08.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:28:08.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:28:08.531 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:28:08.531 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:28:08.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:28:08.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:28:08.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:28:08.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:28:08.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:28:08.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:28:08.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:28:08.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:28:08.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:28:08.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:28:08.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:28:08.798 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:28:08.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:27:53
2026-05-29T20:28:08.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72788, datetime.datetime(2026, 5, 29, 20, 27, 53), datetime.datetime(2026, 5, 29, 20, 27, 53), 'salt', 9.39, 75.64, None, 16.66, 40.54, 4.08, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:28:08.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:28:08.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:28:08.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:27:53, diff=15.867328s, valid=True
2026-05-29T20:28:08.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:28:08.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:28:08.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:28:12, diff=-3.129812s, valid=True
2026-05-29T20:28:08.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:28:08.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:28:08.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:27:48, diff=20.876869s, valid=True
2026-05-29T20:28:08.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:28:08.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:28:08.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:28:08.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:28:08.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:28:08.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:28:08.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:28:12, diff=-3.118049s, valid=True
2026-05-29T20:28:08.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:28:08.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:28:08.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:28:08.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011930.883049s, valid=True
2026-05-29T20:28:08.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:28:08.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:28:08.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:28:08.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:28:08.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:28:08.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:28:08.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:28:08.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:28:08.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:28:09.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:28:09.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:28:09.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:28:09.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:28:09.219 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:28:09.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:28:09.801 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:28:09.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:28:09.907 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:28:09.907 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:28:10.107 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:28:10.107 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:28:40.137 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:28:40.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:28:40.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:28:40.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:28:40.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:28:40.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:28:40.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-05-29T20:28:40.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:28:40.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-05-29T20:28:40.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:28:40.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:28:40.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:28:40.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-05-29T20:28:43.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-05-29T20:28:43.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:28:43.216 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:28:43.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:28:43.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:28:43.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:28:43.240 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:28:43.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:28:43.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:28:43.240 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:28:43.240 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:28:43.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:28:43.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:28:43.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:28:43.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:28:43.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:28:43.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:28:43.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:28:43.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:28:43.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:28:43.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:28:43.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:28:43.527 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:28:43.586 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:28:24
2026-05-29T20:28:43.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72789, datetime.datetime(2026, 5, 29, 20, 28, 24), datetime.datetime(2026, 5, 29, 20, 28, 23), 'salt', 9.35, 75.51, None, 17.29, 39.63, 4.09, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:28:43.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:28:43.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:28:43.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:28:23, diff=20.593104s, valid=True
2026-05-29T20:28:43.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:28:43.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:28:43.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:28:12, diff=31.596112s, valid=True
2026-05-29T20:28:43.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:28:43.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:28:43.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:28:18, diff=25.603214s, valid=True
2026-05-29T20:28:43.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:28:43.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:28:43.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:28:43.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:28:43.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:28:43.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:28:43.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:28:12, diff=31.606763s, valid=True
2026-05-29T20:28:43.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:28:43.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:28:43.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:28:43.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1011965.607569s, valid=True
2026-05-29T20:28:43.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:28:43.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:28:43.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:28:43.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:28:43.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:28:43.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:28:43.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:28:43.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:28:43.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:28:43.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:28:43.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:28:43.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:28:43.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:28:43.956 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:28:44.221 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:28:44.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:28:44.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:28:44.792 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:28:44.792 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:28:44.976 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:28:44.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:29:15.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:29:15.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:29:15.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:29:15.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:29:15.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:29:15.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:29:15.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-05-29T20:29:15.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:29:15.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-05-29T20:29:15.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:29:15.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:29:15.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:29:15.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-05-29T20:29:17.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-05-29T20:29:17.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:29:17.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:29:17.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:29:17.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:29:17.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:29:17.921 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:29:17.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:29:17.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:29:17.921 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:29:17.922 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:29:17.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:29:18.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:29:18.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:29:18.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:29:18.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:29:18.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:29:18.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:29:18.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:29:18.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:29:18.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:29:18.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:29:18.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:29:18.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:28:54
2026-05-29T20:29:18.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72790, datetime.datetime(2026, 5, 29, 20, 28, 54), datetime.datetime(2026, 5, 29, 20, 28, 54), 'salt', 9.32, 75.38, None, 17.04, 36.86, 4.12, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:29:18.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:29:18.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:29:18.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:28:54, diff=24.256088s, valid=True
2026-05-29T20:29:18.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:29:18.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:29:18.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:29:12, diff=6.259048s, valid=True
2026-05-29T20:29:18.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:29:18.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:29:18.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:28:49, diff=29.26633s, valid=True
2026-05-29T20:29:18.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:29:18.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:29:18.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:29:18.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:29:18.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:29:18.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:29:18.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:29:12, diff=6.269478s, valid=True
2026-05-29T20:29:18.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:29:18.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:29:18.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:29:18.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012000.270207s, valid=True
2026-05-29T20:29:18.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:29:18.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:29:18.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:29:18.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:29:18.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:29:18.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:29:18.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:29:18.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:29:18.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:29:18.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:29:18.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:29:18.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:29:18.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:29:18.601 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:29:18.821 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:29:19.184 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:29:19.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:29:19.289 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:29:19.289 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:29:19.563 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:29:19.564 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:29:49.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:29:49.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:29:49.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:29:50.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:29:50.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:29:50.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:29:50.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T20:29:50.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:29:50.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-05-29T20:29:50.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:29:50.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:29:50.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:29:50.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-05-29T20:29: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-05-29T20:29:53.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:29:53.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:29:53.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:29:53.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:29:53.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:29:53.542 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:29:53.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:29:53.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:29:53.542 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:29:53.542 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:29:53.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:29:53.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:29:53.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:29:53.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:29:53.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:29:53.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:29:53.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:29:53.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:29:53.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:29:53.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:29:53.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:29:53.799 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:29:53.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:29:24
2026-05-29T20:29:53.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72791, datetime.datetime(2026, 5, 29, 20, 29, 24), datetime.datetime(2026, 5, 29, 20, 29, 24), 'salt', 9.32, 75.38, None, 17.43, 38.55, 4.12, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:29:53.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:29:53.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:29:53.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:29:24, diff=29.870433s, valid=True
2026-05-29T20:29:53.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:29:53.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:29:53.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:29:12, diff=41.873256s, valid=True
2026-05-29T20:29:53.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:29:53.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:29:53.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:29:21, diff=32.879925s, valid=True
2026-05-29T20:29:53.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:29:53.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:29:53.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:29:53.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:29:53.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:29:53.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:29:53.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:29:12, diff=41.882946s, valid=True
2026-05-29T20:29:53.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:29:53.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:29:53.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:29:53.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012035.883605s, valid=True
2026-05-29T20:29:53.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:29:53.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:29:53.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:29:53.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:29:53.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:29:53.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:29:53.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:29:53.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:29:53.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:29:54.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:29:54.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:29:54.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:29:54.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:29:54.200 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:29:54.493 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:29:54.843 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:29:54.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:29:54.944 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:29:54.944 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:29:55.213 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:29:55.213 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:30:25.243 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:30:25.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:30:25.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:30:25.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:30:25.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:30:25.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:30:25.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-05-29T20:30:25.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:30:25.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-05-29T20:30:25.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:30:25.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:30:25.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:30:25.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-05-29T20:30:28.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-05-29T20:30:28.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:30:28.547 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:30:28.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:30:28.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:30:28.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:30:28.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:30:28.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:30:28.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:30:28.568 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:30:28.568 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:30:28.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:30:28.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:30:28.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:30:28.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:30:28.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:30:28.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:30:28.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:30:28.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:30:28.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:30:28.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:30:28.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:30:28.806 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:30:28.865 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:30:25
2026-05-29T20:30:28.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72793, datetime.datetime(2026, 5, 29, 20, 30, 25), datetime.datetime(2026, 5, 29, 20, 30, 25), 'salt', 9.29, 75.51, None, 17.82, 40.31, 4.1, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:30:28.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:30:28.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:30:28.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:30:25, diff=3.871501s, valid=True
2026-05-29T20:30:28.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:30:28.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:30:28.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:30:12, diff=16.874328s, valid=True
2026-05-29T20:30:28.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:30:28.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:30:28.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:30:23, diff=5.881205s, valid=True
2026-05-29T20:30:28.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:30:28.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:30:28.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:30:28.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:30:28.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:30:28.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:30:28.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:30:12, diff=16.884261s, valid=True
2026-05-29T20:30:28.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:30:28.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:30:28.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:30:28.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012070.884939s, valid=True
2026-05-29T20:30:28.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:30:28.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:30:28.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:30:28.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:30:28.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:30:28.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:30:28.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:30:28.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:30:28.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:30:29.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:30:29.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:30:29.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:30:29.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:30:29.202 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:30:29.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:30:29.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:30:29.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:30:29.871 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:30:29.871 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:30:30.058 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:30:30.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:31:00.087 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:31:00.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:31:00.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:31:00.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:31:00.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:31:00.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:31:00.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-05-29T20:31:00.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:31:00.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-05-29T20:31:00.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:31:00.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:31:00.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:31:00.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-05-29T20:31:03.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-05-29T20:31:03.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:31:03.563 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:31:03.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:31:03.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:31:03.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:31:03.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:31:03.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:31:03.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:31:03.589 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:31:03.589 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:31:03.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:31:03.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:31:03.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:31:03.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:31:03.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:31:03.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:31:03.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:31:03.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:31:03.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:31:03.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:31:03.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:31:03.845 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:31:03.903 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:30:55
2026-05-29T20:31:03.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72794, datetime.datetime(2026, 5, 29, 20, 30, 55), datetime.datetime(2026, 5, 29, 20, 30, 55), 'salt', 9.32, 75.68, None, 18.42, 38.64, 4.06, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:31:03.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:31:03.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:31:03.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:30:55, diff=8.910034s, valid=True
2026-05-29T20:31:03.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:31:03.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:31:03.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:31:12, diff=-8.087104s, valid=True
2026-05-29T20:31:03.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:31:03.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:31:03.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:30:55, diff=8.919681s, valid=True
2026-05-29T20:31:03.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:31:03.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:31:03.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:31:03.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:31:03.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:31:03.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:31:03.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:31:12, diff=-8.07727s, valid=True
2026-05-29T20:31:03.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:31:03.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:31:03.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:31:03.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012105.923385s, valid=True
2026-05-29T20:31:03.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:31:03.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:31:03.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:31:03.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:31:03.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:31:03.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:31:03.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:31:03.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:31:04.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:31:04.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:31:04.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:31:04.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:31:04.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:31:04.312 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:31:04.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:31:04.882 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:31:04.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:31:04.984 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:31:04.984 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:31:05.202 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:31:05.203 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:31:35.233 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:31:35.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:31:35.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:31:35.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:31:35.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:31:35.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:31:35.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-05-29T20:31:35.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:31:35.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-05-29T20:31:35.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:31:35.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:31:35.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:31:35.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-05-29T20:31:38.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T20:31:38.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:31:38.309 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:31:38.309 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:31:38.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:31:38.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:31:38.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:31:38.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:31:38.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:31:38.330 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:31:38.330 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:31:38.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:31:38.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:31:38.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:31:38.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:31:38.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:31:38.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:31:38.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:31:38.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:31:38.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:31:38.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:31:38.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:31:38.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:31:38.663 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:31:25
2026-05-29T20:31:38.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72795, datetime.datetime(2026, 5, 29, 20, 31, 25), datetime.datetime(2026, 5, 29, 20, 31, 25), 'salt', 9.32, 75.68, None, 18.81, 38.24, 4.06, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:31:38.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:31:38.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:31:38.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:31:25, diff=13.66915s, valid=True
2026-05-29T20:31:38.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:31:38.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:31:38.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:31:12, diff=26.671977s, valid=True
2026-05-29T20:31:38.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:31:38.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:31:38.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:31:20, diff=18.678726s, valid=True
2026-05-29T20:31:38.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:31:38.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:31:38.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:31:38.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:31:38.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:31:38.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:31:38.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:31:12, diff=26.681752s, valid=True
2026-05-29T20:31:38.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:31:38.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:31:38.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:31:38.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012140.682399s, valid=True
2026-05-29T20:31:38.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:31:38.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:31:38.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:31:38.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:31:38.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:31:38.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:31:38.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:31:38.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:31:38.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:31:38.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:31:38.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:31:38.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:31:38.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:31:39.017 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:31:39.236 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:31:39.596 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:31:39.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:31:39.707 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:31:39.707 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:31:39.891 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:31:39.892 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:32:09.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:32:09.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:32:09.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:32:10.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:32:10.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:32:10.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:32:10.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-05-29T20:32:10.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:32:10.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-05-29T20:32:10.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:32:10.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:32:10.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:32: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-05-29T20:32:12.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-05-29T20:32:12.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:32:12.878 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:32:12.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:32:12.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:32:12.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:32:12.901 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:32:12.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:32:12.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:32:12.902 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:32:12.902 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:32:12.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:32:12.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:32:12.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:32:13.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:32:13.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:32:13.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:32:13.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:32:13.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:32:13.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:32:13.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:32:13.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:32:13.165 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:32:13.228 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:31:56
2026-05-29T20:32:13.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72796, datetime.datetime(2026, 5, 29, 20, 31, 56), datetime.datetime(2026, 5, 29, 20, 31, 55), 'salt', 9.32, 75.35, None, 19.16, 38.38, 4.13, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:32:13.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:32:13.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:32:13.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:31:55, diff=18.234435s, valid=True
2026-05-29T20:32:13.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:32:13.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:32:13.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:32:12, diff=1.237271s, valid=True
2026-05-29T20:32:13.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:32:13.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:32:13.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:31:50, diff=23.243882s, valid=True
2026-05-29T20:32:13.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:32:13.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:32:13.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:32:13.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:32:13.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:32:13.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:32:13.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:32:12, diff=1.246874s, valid=True
2026-05-29T20:32:13.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:32:13.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:32:13.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:32:13.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012175.247545s, valid=True
2026-05-29T20:32:13.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:32:13.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:32:13.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:32:13.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:32:13.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:32:13.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:32:13.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:32:13.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:32:13.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:32:13.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:32:13.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:32:13.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:32:13.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:32:13.633 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:32:13.866 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:32:14.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:32:14.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:32:14.319 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:32:14.319 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:32:14.596 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:32:14.596 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:32:44.626 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:32:44.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:32:44.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:32:44.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:32:44.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:32:45.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:32:45.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T20:32:45.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:32:45.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-05-29T20:32:45.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:32:45.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:32:45.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:32:45.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-05-29T20:32:47.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-05-29T20:32:47.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:32:47.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:32:47.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:32:47.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:32:47.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:32:47.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:32:47.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:32:47.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:32:47.786 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:32:47.786 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:32:47.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:32:47.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:32:47.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:32:47.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:32:47.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:32:48.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:32:48.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:32:48.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:32:48.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:32:48.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:32:48.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:32:48.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:32:48.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:32:26
2026-05-29T20:32:48.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72797, datetime.datetime(2026, 5, 29, 20, 32, 26), datetime.datetime(2026, 5, 29, 20, 32, 25), 'salt', 9.32, 75.35, None, 19.02, 38.85, 4.13, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:32:48.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:32:48.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:32:48.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:32:25, diff=23.126189s, valid=True
2026-05-29T20:32:48.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:32:48.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:32:48.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:32:12, diff=36.129297s, valid=True
2026-05-29T20:32:48.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:32:48.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:32:48.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:32:21, diff=27.136389s, valid=True
2026-05-29T20:32:48.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:32:48.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:32:48.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:32:48.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:32:48.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:32:48.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:32:48.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:32:12, diff=36.139769s, valid=True
2026-05-29T20:32:48.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:32:48.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:32:48.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:32:48.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012210.140571s, valid=True
2026-05-29T20:32:48.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:32:48.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:32:48.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:32:48.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:32:48.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:32:48.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:32:48.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:32:48.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:32:48.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:32:48.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:32:48.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:32:48.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:32:48.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:32:48.470 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:32:48.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:32:49.084 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:32:49.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:32:49.194 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:32:49.194 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:32:49.411 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:32:49.411 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:33:19.434 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:33:19.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:33:19.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:33:19.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:33:19.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:33:19.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:33:19.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-05-29T20:33:20.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:33:20.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-05-29T20:33:20.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:33:20.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:33:20.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:33:20.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-05-29T20:33:22.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-05-29T20:33:22.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:33:22.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:33:22.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:33:22.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:33:22.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:33:22.815 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:33:22.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:33:22.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:33:22.815 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:33:22.815 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:33:22.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:33:22.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:33:22.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:33:22.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:33:22.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:33:23.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:33:23.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:33:23.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:33:23.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:33:23.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:33:23.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:33:23.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:33:23.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:32:56
2026-05-29T20:33:23.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72798, datetime.datetime(2026, 5, 29, 20, 32, 56), datetime.datetime(2026, 5, 29, 20, 32, 56), 'salt', 9.35, 75.05, None, 18.81, 36.76, 4.18, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:33:23.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:33:23.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:33:23.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:32:56, diff=27.212649s, valid=True
2026-05-29T20:33:23.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:33:23.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:33:23.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:33:12, diff=11.215513s, valid=True
2026-05-29T20:33:23.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:33:23.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:33:23.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:32:51, diff=32.222125s, valid=True
2026-05-29T20:33:23.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:33:23.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:33:23.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:33:23.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:33:23.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:33:23.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:33:23.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:33:12, diff=11.225234s, valid=True
2026-05-29T20:33:23.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:33:23.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:33:23.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:33:23.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012245.225888s, valid=True
2026-05-29T20:33:23.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:33:23.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:33:23.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:33:23.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:33:23.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:33:23.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:33:23.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:33:23.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:33:23.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:33:23.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:33:23.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:33:23.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:33:23.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:33:23.541 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:33:23.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:33:24.103 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:33:24.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:33:24.204 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:33:24.204 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:33:24.483 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:33:24.484 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:33:54.496 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:33:54.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:33:54.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:33:54.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:33:54.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:33:54.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:33:54.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-05-29T20:33:54.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:33:54.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-05-29T20:33:54.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:33:54.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:33:54.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:33:54.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-05-29T20:33:57.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-05-29T20:33:57.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:33:57.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:33:57.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:33:57.675 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:33:57.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:33:57.687 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:33:57.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:33:57.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:33:57.687 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:33:57.687 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:33:57.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:33:57.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:33:57.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:33:57.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:33:57.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:33:57.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:33:57.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:33:57.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:33:57.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:33:57.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:33:57.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:33:57.964 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:33:58.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:33:57
2026-05-29T20:33:58.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72800, datetime.datetime(2026, 5, 29, 20, 33, 57), datetime.datetime(2026, 5, 29, 20, 33, 56), 'salt', 9.32, 74.72, None, 18.67, 34.25, 4.25, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:33:58.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:33:58.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:33:58.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:33:56, diff=2.031859s, valid=True
2026-05-29T20:33:58.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:33:58.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:33:58.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:34:12, diff=-13.965243s, valid=True
2026-05-29T20:33:58.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:33:58.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:33:58.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:33:53, diff=5.041681s, valid=True
2026-05-29T20:33:58.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:33:58.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:33:58.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:33:58.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:33:58.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:33:58.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:33:58.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:34:12, diff=-13.955091s, valid=True
2026-05-29T20:33:58.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:33:58.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:33:58.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:33:58.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012280.045589s, valid=True
2026-05-29T20:33:58.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:33:58.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:33:58.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:33:58.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:33:58.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:33:58.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:33:58.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:33:58.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:33:58.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:33:58.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:33:58.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:33:58.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:33:58.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:33:58.371 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:33:58.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:33:58.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:33:59.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:33:59.051 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:33:59.051 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:33:59.137 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:33:59.137 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:34:29.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:34:29.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:34:29.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:34:29.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:34:29.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:34:29.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:34:29.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-05-29T20:34:29.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:34:29.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-05-29T20:34:29.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:34:29.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:34:29.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:34:29.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-05-29T20:35:02.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-05-29T20:35:02.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:35:02.112 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:35:02.112 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:35:02.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:35:02.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:35:02.133 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:35:02.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:35:02.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:35:02.133 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:35:02.133 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:35:02.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:35:02.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:35:02.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:35:02.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:35:02.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:35:02.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:35:02.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:35:02.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:35:02.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:35:02.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:35:02.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:35:02.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:35:02.474 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:34:57
2026-05-29T20:35:02.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72802, datetime.datetime(2026, 5, 29, 20, 34, 57), datetime.datetime(2026, 5, 29, 20, 34, 57), 'salt', 9.39, 74.72, None, 19.62, 37.8, 4.25, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:35:02.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:35:02.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:35:02.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:34:57, diff=5.480462s, valid=True
2026-05-29T20:35:02.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:35:02.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:35:02.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:35:12, diff=-9.51662s, valid=True
2026-05-29T20:35:02.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:35:02.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:35:02.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:34:56, diff=6.490121s, valid=True
2026-05-29T20:35:02.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:35:02.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:35:02.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:35:02.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:35:02.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:35:02.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:35:02.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:35:12, diff=-9.506794s, valid=True
2026-05-29T20:35:02.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:35:02.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:35:02.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:35:02.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012344.493882s, valid=True
2026-05-29T20:35:02.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:35:02.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:35:02.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:35:02.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:35:02.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:35:02.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:35:02.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:35:02.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:35:02.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:35:02.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:35:02.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:35:02.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:35:02.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:35:02.821 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:35:03.038 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:35:03.396 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:35:03.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:35:03.496 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:35:03.496 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:35:03.688 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:35:03.688 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:35:33.719 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:35:33.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:35:33.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:35:34.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:35:34.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:35:34.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:35:34.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-05-29T20:35:34.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:35:34.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-05-29T20:35:34.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:35:34.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:35:34.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:35:34.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-05-29T20:35:36.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-05-29T20:35:36.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:35:36.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:35:36.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:35:36.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:35:36.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:35:36.808 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:35:36.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:35:36.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:35:36.809 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:35:36.809 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:35:36.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:35:36.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:35:36.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:35:36.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:35:36.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:35:37.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:35:37.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:35:37.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:35:37.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:35:37.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:35:37.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:35:37.063 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:35:37.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:35:27
2026-05-29T20:35:37.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72803, datetime.datetime(2026, 5, 29, 20, 35, 27), datetime.datetime(2026, 5, 29, 20, 35, 27), 'salt', 9.42, 74.58, None, 19.55, 38.24, 4.28, 832.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:35:37.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:35:37.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:35:37.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:35:27, diff=10.129189s, valid=True
2026-05-29T20:35:37.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:35:37.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:35:37.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:35:12, diff=25.132195s, valid=True
2026-05-29T20:35:37.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:35:37.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:35:37.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:35:22, diff=15.139844s, valid=True
2026-05-29T20:35:37.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:35:37.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:35:37.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:35:37.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:35:37.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:35:37.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:35:37.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:35:12, diff=25.142923s, valid=True
2026-05-29T20:35:37.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:35:37.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:35:37.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:35:37.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012379.143585s, valid=True
2026-05-29T20:35:37.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:35:37.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:35:37.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:35:37.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:35:37.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:35:37.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:35:37.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:35:37.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:35:37.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:35:37.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:35:37.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:35:37.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:35:37.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:35:37.482 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:35:37.704 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:35:39.033 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:35:39.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:35:39.143 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:35:39.143 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:35:41.197 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:35:41.197 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:36:11.227 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:36:11.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:36:11.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:36:11.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:36:11.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:36:11.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:36:11.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-05-29T20:36:11.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:36:11.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-05-29T20:36:11.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:36:11.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:36:11.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:36:11.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-05-29T20:36:14.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-05-29T20:36:14.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:36:14.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:36:14.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:36:14.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:36:14.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:36:14.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:36:14.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:36:14.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:36:14.324 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:36:14.324 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:36:14.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:36:14.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:36:14.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:36:14.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:36:14.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:36:14.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:36:14.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:36:14.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:36:14.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:36:14.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:36:14.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:36:14.591 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:36:14.652 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:35:57
2026-05-29T20:36:14.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72804, datetime.datetime(2026, 5, 29, 20, 35, 57), datetime.datetime(2026, 5, 29, 20, 35, 57), 'salt', 9.39, 74.55, None, 19.9, 39.11, 4.29, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:36:14.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:36:14.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:36:14.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:35:57, diff=17.65814s, valid=True
2026-05-29T20:36:14.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:36:14.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:36:14.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:36:12, diff=2.660963s, valid=True
2026-05-29T20:36:14.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:36:14.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:36:14.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:35:52, diff=22.667552s, valid=True
2026-05-29T20:36:14.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:36:14.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:36:14.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:36:14.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:36:14.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:36:14.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:36:14.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:36:12, diff=2.670575s, valid=True
2026-05-29T20:36:14.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:36:14.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:36:14.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:36:14.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012416.671226s, valid=True
2026-05-29T20:36:14.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:36:14.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:36:14.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:36:14.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:36:14.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:36:14.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:36:14.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:36:14.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:36:14.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:36:14.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:36:14.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:36:14.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:36:14.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:36:15.010 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:36:15.236 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:36:15.621 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:36:15.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:36:15.732 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:36:15.732 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:36:15.926 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:36:15.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:36:45.956 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:36:45.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:36:45.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:36:46.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:36:46.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:36:46.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:36:46.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-05-29T20:36:46.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:36:46.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-05-29T20:36:46.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:36:46.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:36:46.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:36:46.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-05-29T20:36: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-05-29T20:36:49.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:36:49.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:36:49.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:36:49.643 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:36:49.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:36:49.655 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:36:49.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:36:49.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:36:49.656 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:36:49.656 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:36:49.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:36:49.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:36:49.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:36:49.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:36:49.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:36:49.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:36:49.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:36:49.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:36:49.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:36:49.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:36:49.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:36:49.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:36:50.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:36:28
2026-05-29T20:36:50.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72805, datetime.datetime(2026, 5, 29, 20, 36, 28), datetime.datetime(2026, 5, 29, 20, 36, 27), 'salt', 9.39, 74.52, None, 19.73, 39.65, 4.29, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:36:50.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:36:50.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:36:50.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:36:27, diff=23.021098s, valid=True
2026-05-29T20:36:50.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:36:50.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:36:50.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:36:12, diff=38.024039s, valid=True
2026-05-29T20:36:50.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:36:50.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:36:50.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:36:23, diff=27.031776s, valid=True
2026-05-29T20:36:50.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:36:50.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:36:50.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:36:50.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:36:50.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:36:50.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:36:50.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:36:12, diff=38.03541s, valid=True
2026-05-29T20:36:50.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:36:50.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:36:50.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:36:50.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012452.03633s, valid=True
2026-05-29T20:36:50.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:36:50.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:36:50.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:36:50.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:36:50.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:36:50.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:36:50.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:36:50.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:36:50.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:36:50.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:36:50.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:36:50.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:36:50.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:36:50.407 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:36:50.714 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:36:51.095 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:36:51.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:36:51.204 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:36:51.204 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:36:51.492 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:36:51.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:37:21.502 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:37:21.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:37:21.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:37:22.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:37:22.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:37:22.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:37:22.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-05-29T20:37:22.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:37:22.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-05-29T20:37:22.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:37:22.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:37:22.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:37:22.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-05-29T20:37:24.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-05-29T20:37:24.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:37:24.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:37:24.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:37:24.577 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:37:24.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:37:24.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:37:24.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:37:24.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:37:24.590 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:37:24.590 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:37:24.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:37:24.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:37:24.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:37:24.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:37:24.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:37:24.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:37:24.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:37:24.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:37:24.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:37:24.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:37:24.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:37:24.844 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:37:24.904 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:36:58
2026-05-29T20:37:24.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72806, datetime.datetime(2026, 5, 29, 20, 36, 58), datetime.datetime(2026, 5, 29, 20, 36, 58), 'salt', 9.39, 74.62, None, 20.01, 38.9, 4.27, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:37:24.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:37:24.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:37:24.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:36:58, diff=26.911109s, valid=True
2026-05-29T20:37:24.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:37:24.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:37:24.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:37:12, diff=12.913951s, valid=True
2026-05-29T20:37:24.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:37:24.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:37:24.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:36:53, diff=31.920734s, valid=True
2026-05-29T20:37:24.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:37:24.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:37:24.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:37:24.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:37:24.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:37:24.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:37:24.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:37:12, diff=12.923759s, valid=True
2026-05-29T20:37:24.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:37:24.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:37:24.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:37:24.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012486.924411s, valid=True
2026-05-29T20:37:24.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:37:24.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:37:24.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:37:24.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:37:24.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:37:24.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:37:24.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:37:24.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:37:25.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:37:25.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:37:25.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:37:25.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:37:25.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:37:25.242 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:37:25.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:37:25.785 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:37:25.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:37:25.885 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:37:25.885 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:37:26.153 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:37:26.153 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:37:56.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:37:56.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:37:56.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:37:56.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:37:56.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:37:56.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:37:56.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-05-29T20:37:56.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:37:56.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-05-29T20:37:56.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:37:56.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:37:56.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:37:56.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-05-29T20:37:59.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-05-29T20:37:59.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:37:59.019 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:37:59.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:37:59.028 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:37:59.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:37:59.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:37:59.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:37:59.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:37:59.041 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:37:59.041 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:37:59.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:37:59.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:37:59.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:37:59.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:37:59.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:37:59.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:37:59.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:37:59.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T20:37:59.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:37:59.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:37:59.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:37:59.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:37:59.344 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:37:58
2026-05-29T20:37:59.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72808, datetime.datetime(2026, 5, 29, 20, 37, 58), datetime.datetime(2026, 5, 29, 20, 37, 58), 'salt', 9.39, 74.45, None, 20.01, 37.21, 4.31, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:37:59.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:37:59.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:37:59.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:37:58, diff=1.350833s, valid=True
2026-05-29T20:37:59.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:37:59.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:37:59.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:38:12, diff=-12.646342s, valid=True
2026-05-29T20:37:59.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:37:59.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:37:59.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:37:54, diff=5.36031s, valid=True
2026-05-29T20:37:59.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:37:59.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:37:59.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:37:59.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:37:59.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:37:59.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T20:37:59.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:38:12, diff=-12.636684s, valid=True
2026-05-29T20:37:59.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:37:59.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:37:59.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:37:59.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012521.363983s, valid=True
2026-05-29T20:37:59.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:37:59.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:37:59.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:37:59.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:37:59.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:37:59.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:37:59.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:37:59.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:37:59.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:37:59.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:37:59.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:37:59.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:37:59.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:37:59.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:37:59.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:38:00.317 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:38:00.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:38:00.419 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:38:00.419 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:38:00.709 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:38:00.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:38:30.720 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:38:30.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:38:30.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:38:30.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:38:30.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:38:31.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:38:31.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-05-29T20:38:31.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:38:31.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-05-29T20:38:31.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:38:31.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:38:31.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:38: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-05-29T20:38:37.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-05-29T20:38:37.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:38:37.441 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:38:37.441 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:38:37.450 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:38:37.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:38:37.462 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:38:37.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:38:37.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:38:37.462 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:38:37.462 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:38:37.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:38:37.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:38:37.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:38:37.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:38:37.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:38:37.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:38:37.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:38:37.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:38:37.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:38:37.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:38:37.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:38:37.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:38:37.788 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:38:29
2026-05-29T20:38:37.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72809, datetime.datetime(2026, 5, 29, 20, 38, 29), datetime.datetime(2026, 5, 29, 20, 38, 28), 'salt', 9.42, 74.35, None, 20.04, 37.12, 4.32, 832.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:38:37.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:38:37.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:38:37.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:38:28, diff=9.795036s, valid=True
2026-05-29T20:38:37.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:38:37.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:38:37.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:38:12, diff=25.797915s, valid=True
2026-05-29T20:38:37.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:38:37.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:38:37.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:38:26, diff=11.804659s, valid=True
2026-05-29T20:38:37.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:38:37.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:38:37.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:38:37.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:38:37.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:38:37.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:38:37.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:38:12, diff=25.807756s, valid=True
2026-05-29T20:38:37.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:38:37.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:38:37.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:38:37.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012559.808422s, valid=True
2026-05-29T20:38:37.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:38:37.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:38:37.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:38:37.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:38:37.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:38:37.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:38:37.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:38:37.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:38:37.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:38:37.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:38:38.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:38:38.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:38:38.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:38:38.130 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:38:38.341 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:38:38.688 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:38:38.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:38:38.792 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:38:38.792 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:38:38.975 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:38:38.975 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:39:09.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:39:09.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:39:09.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:39:09.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:39:09.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:39:09.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:39:09.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-05-29T20:39:09.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:39:09.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-05-29T20:39:09.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:39:09.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:39:09.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:39:09.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-05-29T20:39:11.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-05-29T20:39:11.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:39:11.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:39:11.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:39:11.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:39:11.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:39:11.858 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:39:11.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:39:11.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:39:11.859 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:39:11.859 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:39:11.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:39:11.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:39:11.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:39:12.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:39:12.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:39:12.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:39:12.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:39:12.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:39:12.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:39:12.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:39:12.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:39:12.124 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:39:12.183 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:38:59
2026-05-29T20:39:12.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72810, datetime.datetime(2026, 5, 29, 20, 38, 59), datetime.datetime(2026, 5, 29, 20, 38, 58), 'salt', 9.35, 74.25, None, 19.65, 38.2, 4.34, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:39:12.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:39:12.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:39:12.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:38:58, diff=14.190143s, valid=True
2026-05-29T20:39:12.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:39:12.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:39:12.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:39:12, diff=0.193019s, valid=True
2026-05-29T20:39:12.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:39:12.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:39:12.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:38:57, diff=15.199758s, valid=True
2026-05-29T20:39:12.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:39:12.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:39:12.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:39:12.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:39:12.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:39:12.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:39:12.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:39:12, diff=0.202817s, valid=True
2026-05-29T20:39:12.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:39:12.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:39:12.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:39:12.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012594.203496s, valid=True
2026-05-29T20:39:12.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:39:12.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:39:12.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:39:12.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:39:12.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:39:12.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:39:12.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:39:12.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:39:12.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:39:12.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:39:12.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:39:12.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:39:12.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:39:12.595 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:39:12.841 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:39:13.188 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:39:13.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:39: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-05-29T20:39: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-05-29T20:39:13.536 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:39:13.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:39:43.565 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:39:43.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:39:43.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:39:43.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:39:43.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:39:44.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:39:44.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-05-29T20:39:44.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:39:44.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-05-29T20:39:44.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:39:44.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:39:44.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:39:44.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-05-29T20:39:46.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-05-29T20:39:46.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:39:46.509 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:39:46.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:39:46.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:39:46.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:39:46.531 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:39:46.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:39:46.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:39:46.531 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:39:46.531 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:39:46.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:39:46.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:39:46.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:39:46.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:39:46.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:39:46.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:39:46.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:39:46.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:39:46.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:39:46.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:39:46.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:39:46.789 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:39:46.848 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:39:29
2026-05-29T20:39:46.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72811, datetime.datetime(2026, 5, 29, 20, 39, 29), datetime.datetime(2026, 5, 29, 20, 39, 29), 'salt', 9.42, 74.09, None, 19.83, 37.3, 4.37, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:39:46.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:39:46.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:39:46.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:39:29, diff=17.854808s, valid=True
2026-05-29T20:39:46.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:39:46.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:39:46.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:39:12, diff=34.857705s, valid=True
2026-05-29T20:39:46.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:39:46.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:39:46.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:39:28, diff=18.864247s, valid=True
2026-05-29T20:39:46.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:39:46.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:39:46.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:39:46.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:39:46.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:39:46.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:39:46.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:39:12, diff=34.867348s, valid=True
2026-05-29T20:39:46.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:39:46.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:39:46.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:39:46.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012628.868016s, valid=True
2026-05-29T20:39:46.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:39:46.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:39:46.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:39:46.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:39:46.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:39:46.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:39:46.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:39:46.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:39:46.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:39:47.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:39:47.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:39:47.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:39:47.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:39:47.186 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:39:47.393 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:39:47.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:39:47.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:39:47.834 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:39:47.834 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:39:48.016 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:39:48.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:40:18.047 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:40:18.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:40:18.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:40:18.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:40:18.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:40:18.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:40:18.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-05-29T20:40:18.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:40:18.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-05-29T20:40:18.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:40:18.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:40:18.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:40:18.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-05-29T20:40:20.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-05-29T20:40:20.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:40:20.909 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:40:20.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:40:20.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:40:20.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:40:20.929 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:40:20.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:40:20.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:40:20.929 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:40:20.929 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:40:20.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:40:21.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:40:21.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:40:21.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:40:21.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:40:21.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:40:21.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:40:21.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:40:21.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:40:21.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:40:21.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:40:21.186 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:40:21.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:40:00
2026-05-29T20:40:21.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72812, datetime.datetime(2026, 5, 29, 20, 40), datetime.datetime(2026, 5, 29, 20, 39, 59), 'salt', 9.42, 73.92, None, 19.94, 36.72, 4.41, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:40:21.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:40:21.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:40:21.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:39:59, diff=22.252676s, valid=True
2026-05-29T20:40:21.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:40:21.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:40:21.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:40:12, diff=9.255539s, valid=True
2026-05-29T20:40:21.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:40:21.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:40:21.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:39:55, diff=26.262301s, valid=True
2026-05-29T20:40:21.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:40:21.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:40:21.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:40:21.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:40:21.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:40:21.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:40:21.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:40:12, diff=9.265364s, valid=True
2026-05-29T20:40:21.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:40:21.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:40:21.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:40:21.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012663.266053s, valid=True
2026-05-29T20:40:21.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:40:21.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:40:21.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:40:21.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:40:21.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:40:21.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:40:21.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:40:21.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:40:21.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:40:21.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:40:21.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:40:21.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:40:21.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:40:21.652 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:40:21.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:40:22.201 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:40:22.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:40:22.301 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:40:22.301 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:40:22.549 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:40:22.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:40:52.579 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:40:52.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:40:52.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:40:52.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:40:52.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:40:53.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:40:53.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T20:40:53.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:40:53.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-05-29T20:40:53.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:40:53.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:40:53.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:40:53.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T20:40:57.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-05-29T20:40:57.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:40:57.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:40:57.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:40:57.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:40:57.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:40:57.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:40:57.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:40:57.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:40:57.255 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:40:57.255 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:40:57.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:40:57.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:40:57.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:40:57.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:40:57.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:40:57.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:40:57.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:40:57.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:40:57.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:40:57.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:40:57.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:40:57.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:40:57.579 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:40:30
2026-05-29T20:40:57.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72813, datetime.datetime(2026, 5, 29, 20, 40, 30), datetime.datetime(2026, 5, 29, 20, 40, 30), 'salt', 9.45, 73.79, None, 20.25, 36.91, 4.43, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:40:57.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:40:57.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:40:57.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:40:30, diff=27.585485s, valid=True
2026-05-29T20:40:57.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:40:57.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:40:57.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:40:12, diff=45.588327s, valid=True
2026-05-29T20:40:57.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:40:57.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:40:57.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:40:25, diff=32.595056s, valid=True
2026-05-29T20:40:57.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:40:57.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:40:57.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:40:57.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:40:57.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:40:57.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:40:57.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:40:12, diff=45.598051s, valid=True
2026-05-29T20:40:57.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:40:57.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:40:57.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:40:57.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012699.598714s, valid=True
2026-05-29T20:40:57.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:40:57.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:40:57.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:40:57.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:40:57.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:40:57.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:40:57.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:40:57.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:40:57.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:40:57.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:40:57.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:40:57.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:40:57.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:40:57.935 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:40:58.150 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:40:58.503 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:40:58.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:40:58.603 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:40:58.603 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:40:58.876 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:40:58.876 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:41:28.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:41:28.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:41:28.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:41:29.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:41:29.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:41:29.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:41:29.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-05-29T20:41:29.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:41:29.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-05-29T20:41:29.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:41:29.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:41:29.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:41:29.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-05-29T20:41:31.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T20:41:31.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:41:31.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:41:31.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:41:31.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:41:32.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:41:32.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:41:32.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:41:32.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:41:32.007 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:41:32.007 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:41:32.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:41:32.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:41:32.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:41:32.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:41:32.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:41:32.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:41:32.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:41:32.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:41:32.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:41:32.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:41:32.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:41:32.271 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:41:32.331 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:41:30
2026-05-29T20:41:32.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72815, datetime.datetime(2026, 5, 29, 20, 41, 30), datetime.datetime(2026, 5, 29, 20, 41, 30), 'salt', 9.49, 73.39, None, 20.89, 37.87, 4.51, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:41:32.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:41:32.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:41:32.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:41:30, diff=2.3377s, valid=True
2026-05-29T20:41:32.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:41:32.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:41:32.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:41:12, diff=20.340628s, valid=True
2026-05-29T20:41:32.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:41:32.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:41:32.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:41:26, diff=6.347463s, valid=True
2026-05-29T20:41:32.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:41:32.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:41:32.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:41:32.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:41:32.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:41:32.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:41:32.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:41:12, diff=20.350563s, valid=True
2026-05-29T20:41:32.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:41:32.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:41:32.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:41:32.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012734.35125s, valid=True
2026-05-29T20:41:32.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:41:32.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:41:32.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:41:32.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:41:32.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:41:32.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:41:32.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:41:32.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:41:32.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:41:32.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:41:32.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:41:32.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:41:32.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:41:32.941 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:41:33.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:41:33.499 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:41:33.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:41: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-05-29T20:41: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-05-29T20:41:34.211 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:41:34.211 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:42:04.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:42:04.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:42:04.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:42:04.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:42:04.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:42:04.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:42:04.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-05-29T20:42:04.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:42:04.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-05-29T20:42:04.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:42:04.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:42:04.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:42:04.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-05-29T20:42:42.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-05-29T20:42:42.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:42:42.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:42:42.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:42:42.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:42:42.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:42:42.847 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:42:42.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:42:42.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:42:42.847 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:42:42.847 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:42:42.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:42:42.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:42:42.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:42:43.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:42:43.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:42:43.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:42:43.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:42:43.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:42:43.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:42:43.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:42:43.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:42:43.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:42:43.161 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:42:31
2026-05-29T20:42:43.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72817, datetime.datetime(2026, 5, 29, 20, 42, 31), datetime.datetime(2026, 5, 29, 20, 42, 30), 'salt', 9.45, 73.09, None, 21.07, 36.11, 4.56, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:42:43.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:42:43.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:42:43.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:42:30, diff=13.167394s, valid=True
2026-05-29T20:42:43.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:42:43.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:42:43.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:42:12, diff=31.170219s, valid=True
2026-05-29T20:42:43.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:42:43.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:42:43.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:42:27, diff=16.176911s, valid=True
2026-05-29T20:42:43.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:42:43.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:42:43.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:42:43.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:42:43.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:42:43.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:42:43.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:42:12, diff=31.17993s, valid=True
2026-05-29T20:42:43.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:42:43.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:42:43.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:42:43.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012805.180593s, valid=True
2026-05-29T20:42:43.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:42:43.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:42:43.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:42:43.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:42:43.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:42:43.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:42:43.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:42:43.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:42:43.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:42:43.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:42:43.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:42:43.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:42:43.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:42:43.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:42:43.716 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:42:44.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:42:44.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:42:44.164 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:42:44.164 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:42:44.498 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:42:44.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:43:14.528 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:43:14.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:43:14.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:43:14.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:43:14.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:43:14.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:43:14.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-05-29T20:43:14.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:43:14.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-05-29T20:43:14.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:43:14.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:43:15.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:43:15.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-05-29T20:43:17.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-05-29T20:43:17.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:43:17.405 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:43:17.405 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:43:17.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:43:17.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:43:17.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:43:17.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:43:17.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:43:17.425 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:43:17.425 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:43:17.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:43:17.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:43:17.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:43:17.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:43:17.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:43:17.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:43:17.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:43:17.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:43:17.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:43:17.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:43:17.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:43:17.745 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:43:17.810 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:43:01
2026-05-29T20:43:17.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72818, datetime.datetime(2026, 5, 29, 20, 43, 1), datetime.datetime(2026, 5, 29, 20, 43, 1), 'salt', 9.49, 72.92, None, 20.75, 37.12, 4.61, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:43:17.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:43:17.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:43:17.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:01, diff=16.816999s, valid=True
2026-05-29T20:43:17.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:43:17.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:43:17.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:12, diff=5.819802s, valid=True
2026-05-29T20:43:17.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:43:17.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:43:17.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:42:58, diff=19.826376s, valid=True
2026-05-29T20:43:17.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:43:17.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:43:17.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:43:17.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:43:17.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:43:17.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:43:17.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:12, diff=5.829376s, valid=True
2026-05-29T20:43:17.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:43:17.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:43:17.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:43:17.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012839.830037s, valid=True
2026-05-29T20:43:17.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:43:17.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:43:17.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:43:17.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:43:17.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:43:17.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:43:17.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:43:17.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:43:17.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:43:17.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:43:18.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:43:18.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:43:18.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:43:18.166 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:43:18.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:43:18.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:43:18.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:43: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-05-29T20:43: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-05-29T20:43:19.154 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:43:19.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:43:49.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:43:49.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:43:49.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:43:49.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:43:49.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:43:49.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:43:49.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-05-29T20:43:49.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:43:49.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-05-29T20:43:49.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:43:49.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:43:49.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:43:49.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-05-29T20:43:51.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-05-29T20:43:51.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:43:51.873 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:43:51.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:43:51.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:43:51.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:43:51.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:43:51.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:43:51.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:43:51.895 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:43:51.895 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:43:51.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:43:51.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:43:51.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:43:52.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:43:52.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:43:52.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:43:52.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:43:52.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:43:52.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:43:52.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:43:52.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:43:52.144 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:43:52.205 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:43:31
2026-05-29T20:43:52.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72819, datetime.datetime(2026, 5, 29, 20, 43, 31), datetime.datetime(2026, 5, 29, 20, 43, 31), 'salt', 9.55, 72.82, None, 20.78, 37.56, 4.62, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:43:52.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:43:52.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:43:52.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:31, diff=21.211867s, valid=True
2026-05-29T20:43:52.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:43:52.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:43:52.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:12, diff=40.214708s, valid=True
2026-05-29T20:43:52.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:43:52.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:43:52.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:30, diff=22.221479s, valid=True
2026-05-29T20:43:52.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:43:52.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:43:52.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:43:52.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:43:52.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:43:52.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:43:52.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:12, diff=40.224501s, valid=True
2026-05-29T20:43:52.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:43:52.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:43:52.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:43:52.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012874.225176s, valid=True
2026-05-29T20:43:52.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:43:52.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:43:52.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:43:52.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:43:52.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:43:52.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:43:52.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:43:52.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:43:52.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:43:52.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:43:52.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:43:52.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:43:52.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:43:52.542 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:43:52.751 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:43:53.093 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:43:53.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:43:53.193 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:43:53.193 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:43:53.428 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:43:53.429 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:44:23.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:44:23.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:44:23.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:44:23.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:44:23.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:44:23.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:44:23.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-05-29T20:44:23.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:44:23.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-05-29T20:44:23.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:44:23.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:44:23.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:44:23.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T20:45:01.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-05-29T20:45:01.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:45:01.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:45:01.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:45:01.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:45:01.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:45:01.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:45:01.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:45:01.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:45:01.166 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:45:01.166 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:45:01.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:45:01.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:45:01.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:45:01.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:45:01.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:45:01.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:45:01.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:45:01.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:45:01.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:45:01.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:45:01.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:45:01.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:45:01.498 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:44:32
2026-05-29T20:45:01.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72821, datetime.datetime(2026, 5, 29, 20, 44, 32), datetime.datetime(2026, 5, 29, 20, 44, 31), 'salt', 9.42, 72.53, None, 20.25, 36.08, 4.68, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:45:01.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:45:01.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:45:01.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:44:31, diff=30.515541s, valid=True
2026-05-29T20:45:01.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:45:01.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:45:01.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:12, diff=109.522427s, valid=True
2026-05-29T20:45:01.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:45:01.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:45:01.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:44:27, diff=34.538438s, valid=True
2026-05-29T20:45:01.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:45:01.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:45:01.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:45:01.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:45:01.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:45:01.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:45:01.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:12, diff=109.54529s, valid=True
2026-05-29T20:45:01.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:45:01.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:45:01.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:45:01.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012943.546333s, valid=True
2026-05-29T20:45:01.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:45:01.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:45:01.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:45:01.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:45:01.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:45:01.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:45:01.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:45:01.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:45:01.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:45:01.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:45:01.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:45:01.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:45:01.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:45:01.964 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:45:02.183 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:45:02.534 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:45:02.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:45:02.636 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:45:02.636 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:45:02.911 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:45:02.911 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:45:32.941 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:45:32.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:45:32.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:45:33.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:45:33.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:45:33.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:45:33.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-05-29T20:45:33.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:45:33.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-05-29T20:45:33.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:45:33.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:45:33.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:45:33.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-05-29T20:45:36.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-05-29T20:45:36.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:45:36.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:45:36.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:45:36.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:45:36.126 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:45:36.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:45:36.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:45:36.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:45:36.127 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:45:36.127 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:45:36.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:45:36.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:45:36.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:45:36.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:45:36.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:45:36.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:45:36.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:45:36.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:45:36.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:45:36.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:45:36.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:45:36.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:45:36.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:45:32
2026-05-29T20:45:36.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72823, datetime.datetime(2026, 5, 29, 20, 45, 32), datetime.datetime(2026, 5, 29, 20, 45, 32), 'salt', 9.45, 72.36, None, 21.81, 34.07, 4.71, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:45:36.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:45:36.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:45:36.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:45:32, diff=4.454026s, valid=True
2026-05-29T20:45:36.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:45:36.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:45:36.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:12, diff=144.456895s, valid=True
2026-05-29T20:45:36.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:45:36.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:45:36.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:45:28, diff=8.463453s, valid=True
2026-05-29T20:45:36.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:45:36.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:45:36.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:45:36.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:45:36.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:45:36.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:45:36.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:12, diff=144.4665s, valid=True
2026-05-29T20:45:36.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:45:36.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:45:36.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:45:36.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1012978.467172s, valid=True
2026-05-29T20:45:36.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:45:36.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:45:36.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:45:36.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:45:36.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:45:36.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:45:36.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:45:36.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:45:36.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:45:36.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:45:36.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:45:36.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:45:36.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:45:36.785 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:45:36.990 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:45:37.387 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:45:37.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:45:37.485 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:45:37.485 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:45:37.747 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:45:37.747 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:46:07.776 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:46:07.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:46:07.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:46:08.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:46:08.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:46:08.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:46:08.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-05-29T20:46:08.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:46:08.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-05-29T20:46:08.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:46:08.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:46:08.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:46:08.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-05-29T20:46:10.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-05-29T20:46:10.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:46:10.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:46:10.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:46:10.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:46:10.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:46:10.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:46:10.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:46:10.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:46:10.860 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:46:10.860 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:46:10.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:46:10.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:46:10.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:46:11.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:46:11.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:46:11.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:46:11.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:46:11.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:46:11.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:46:11.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:46:11.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:46:11.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:46:11.181 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:46:02
2026-05-29T20:46:11.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72824, datetime.datetime(2026, 5, 29, 20, 46, 2), datetime.datetime(2026, 5, 29, 20, 46, 1), 'salt', 9.42, 72.29, None, 21.42, 37.77, 4.72, 832.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:46:11.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:46:11.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:46:11.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:46:01, diff=10.188867s, valid=True
2026-05-29T20:46:11.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:46:11.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:46:11.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:12, diff=179.191829s, valid=True
2026-05-29T20:46:11.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:46:11.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:46:11.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:45:58, diff=13.198803s, valid=True
2026-05-29T20:46:11.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:46:11.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:46:11.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:46:11.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:46:11.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:46:11.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:46:11.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:12, diff=179.201862s, valid=True
2026-05-29T20:46:11.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:46:11.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:46:11.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:46:11.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013013.202526s, valid=True
2026-05-29T20:46:11.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:46:11.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:46:11.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:46:11.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:46:11.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:46:11.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:46:11.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:46:11.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:46:11.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:46:11.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:46:11.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:46:11.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:46:11.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:46:11.521 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:46:11.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:46:12.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:46:12.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:46:12.189 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:46:12.189 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:46:12.378 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:46:12.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:46:42.407 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:46:42.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:46:42.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:46:42.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:46:42.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:46:42.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:46:42.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-05-29T20:46:42.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:46:42.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-05-29T20:46:42.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:46:42.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:46:42.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:46:42.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-05-29T20:47:25.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-05-29T20:47:25.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:47:25.449 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:47:25.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:47:25.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:47:25.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:47:25.470 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:47:25.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:47:25.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:47:25.470 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:47:25.470 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:47:25.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:47:25.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:47:25.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:47:25.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:47:25.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:47:25.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:47:25.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:47:25.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:47:25.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:47:25.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:47:25.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:47:25.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:47:25.816 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:47:03
2026-05-29T20:47:25.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72826, datetime.datetime(2026, 5, 29, 20, 47, 3), datetime.datetime(2026, 5, 29, 20, 47, 2), 'salt', 9.49, 72.09, None, 21.17, 36.77, 4.77, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:47:25.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:47:25.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:47:25.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:47:02, diff=23.824392s, valid=True
2026-05-29T20:47:25.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:47:25.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:47:25.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:12, diff=253.828733s, valid=True
2026-05-29T20:47:25.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:47:25.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:47:25.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:47:00, diff=25.838314s, valid=True
2026-05-29T20:47:25.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:47:25.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:47:25.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:47:25.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:47:25.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:47:25.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:47:25.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:12, diff=253.842495s, valid=True
2026-05-29T20:47:25.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:47:25.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:47:25.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:47:25.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013087.843578s, valid=True
2026-05-29T20:47:25.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:47:25.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:47:25.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:47:25.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:47:25.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:47:25.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:47:25.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:47:25.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:47:25.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:47:26.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:47:26.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:47:26.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:47:26.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:47:26.252 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:47:26.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:47:26.931 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:47:27.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:47:27.036 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:47:27.036 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:47:29.903 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:47:29.903 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:47:59.933 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:47:59.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:47:59.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:48:00.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:48:00.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:48:00.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:48:00.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-05-29T20:48:00.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:48:00.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-05-29T20:48:00.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:48:00.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:48:00.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:48:00.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T20:48:04.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T20:48:04.618 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:48:04.619 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:48:04.619 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:48:04.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:48:04.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:48:04.640 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:48:04.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:48:04.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:48:04.640 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:48:04.640 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:48:04.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:48:04.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:48:04.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:48:04.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:48:04.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:48:04.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:48:04.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:48:04.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:48:04.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:48:04.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:48:04.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:48:04.894 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:48:04.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:48:03
2026-05-29T20:48:04.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72828, datetime.datetime(2026, 5, 29, 20, 48, 3), datetime.datetime(2026, 5, 29, 20, 48, 3), 'salt', 9.55, 71.9, None, 21.67, 35.52, 4.81, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:48:04.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:48:04.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:48:04.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:48:03, diff=1.960085s, valid=True
2026-05-29T20:48:04.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:48:04.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:48:04.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:12, diff=292.963237s, valid=True
2026-05-29T20:48:04.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:48:04.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:48:04.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:48:03, diff=1.970585s, valid=True
2026-05-29T20:48:04.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:48:04.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:48:04.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:48:04.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:48:04.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:48:04.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:48:04.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:43:12, diff=292.973964s, valid=True
2026-05-29T20:48:04.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:48:04.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:48:04.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:48:04.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013126.974722s, valid=True
2026-05-29T20:48:04.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:48:04.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:48:04.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:48:04.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:48:04.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:48:05.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:48:05.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:48:05.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:48:05.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:48:05.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:48:05.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:48:05.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:48:05.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:48:05.306 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:48:05.547 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:48:05.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:48:05.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:48:05.991 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:48:05.991 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:48:06.294 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:48:06.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:48:36.318 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:48:36.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:48:36.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:48:36.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:48:36.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:48:36.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:48:36.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-05-29T20:48:36.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:48:36.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-05-29T20:48:36.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:48:36.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:48:36.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:48:36.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-05-29T20:48:40.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-05-29T20:48:40.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:48:40.159 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:48:40.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:48:40.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:48:40.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:48:40.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:48:40.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:48:40.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:48:40.179 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:48:40.179 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:48:40.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:48:40.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:48:40.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:48:40.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:48:40.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:48:40.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:48:40.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:48:40.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:48:40.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:48:40.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:48:40.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:48:40.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:48:40.495 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:48:33
2026-05-29T20:48:40.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72829, datetime.datetime(2026, 5, 29, 20, 48, 33), datetime.datetime(2026, 5, 29, 20, 48, 33), 'salt', 9.52, 71.73, None, 21.59, 36.93, 4.84, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:48:40.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:48:40.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:48:40.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:48:33, diff=7.501606s, valid=True
2026-05-29T20:48:40.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:48:40.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:48:40.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:49:12, diff=-31.495466s, valid=True
2026-05-29T20:48:40.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:48:40.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:48:40.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:48:29, diff=11.511222s, valid=True
2026-05-29T20:48:40.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:48:40.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:48:40.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:48:40.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:48:40.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:48:40.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:48:40.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:49:12, diff=-31.485656s, valid=True
2026-05-29T20:48:40.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:48:40.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:48:40.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:48:40.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013162.515028s, valid=True
2026-05-29T20:48:40.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:48:40.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:48:40.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:48:40.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:48:40.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:48:40.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:48:40.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:48:40.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:48:40.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:48:40.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:48:40.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:48:40.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:48:40.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:48:40.833 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:48:41.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:48:41.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:48:41.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:48:41.554 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:48:41.554 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:48:41.776 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:48:41.777 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:49:11.807 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:49:11.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:49:11.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:49:12.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:49:12.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:49:12.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:49:12.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-05-29T20:49:12.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:49:12.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-05-29T20:49:12.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:49:12.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:49:12.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:49:12.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-05-29T20:49:14.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-05-29T20:49:14.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:49:14.870 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:49:14.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:49:14.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:49:14.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:49:14.893 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:49:14.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:49:14.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:49:14.893 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:49:14.893 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:49:14.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:49:14.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:49:14.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:49:15.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:49:15.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:49:15.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:49:15.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:49:15.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:49:15.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:49:15.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:49:15.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:49:15.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:49:15.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:49:04
2026-05-29T20:49:15.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72830, datetime.datetime(2026, 5, 29, 20, 49, 4), datetime.datetime(2026, 5, 29, 20, 49, 3), 'salt', 9.49, 71.56, None, 21.52, 36.84, 4.88, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:49:15.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:49:15.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:49:15.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:49:03, diff=12.212637s, valid=True
2026-05-29T20:49:15.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:49:15.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:49:15.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:49:12, diff=3.215461s, valid=True
2026-05-29T20:49:15.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:49:15.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:49:15.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:48:59, diff=16.222208s, valid=True
2026-05-29T20:49:15.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:49:15.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:49:15.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:49:15.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:49:15.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:49:15.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:49:15.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:49:12, diff=3.225239s, valid=True
2026-05-29T20:49:15.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:49:15.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:49:15.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:49:15.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013197.2259s, valid=True
2026-05-29T20:49:15.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:49:15.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:49:15.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:49:15.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:49:15.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:49:15.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:49:15.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:49:15.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:49:15.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:49:15.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:49:15.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:49:15.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:49:15.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:49:15.544 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:49:15.752 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:49:16.095 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:49:16.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:49:16.195 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:49:16.195 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:49:16.415 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:49:16.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:49:46.445 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:49:46.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:49:46.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:49:46.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:49:46.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:49:47.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:49:47.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-05-29T20:49:47.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:49:47.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-05-29T20:49:47.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:49:47.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:49:47.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:49:47.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-05-29T20:51:08.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-05-29T20:51:08.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:51:08.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:51:08.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:51:08.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:51:08.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:51:08.451 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:51:08.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:51:08.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:51:08.452 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:51:08.452 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:51:08.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:51:08.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:51:08.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:51:08.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:51:08.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:51:08.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:51:08.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:51:08.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:51:08.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:51:08.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:51:08.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:51:08.718 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:51:08.776 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:51:04
2026-05-29T20:51:08.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72834, datetime.datetime(2026, 5, 29, 20, 51, 4), datetime.datetime(2026, 5, 29, 20, 51, 4), 'salt', 9.55, 71.5, None, 21.74, 34.98, 4.89, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:51:08.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:51:08.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:51:08.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:51:04, diff=4.78281s, valid=True
2026-05-29T20:51:08.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:51:08.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:51:08.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:51:12, diff=-3.214322s, valid=True
2026-05-29T20:51:08.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:51:08.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:51:08.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:51:01, diff=7.792357s, valid=True
2026-05-29T20:51:08.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:51:08.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:51:08.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:51:08.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:51:08.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:51:08.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:51:08.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:51:12, diff=-3.204614s, valid=True
2026-05-29T20:51:08.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:51:08.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:51:08.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:51:08.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013310.796046s, valid=True
2026-05-29T20:51:08.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:51:08.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:51:08.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:51:08.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:51:08.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:51:08.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:51:08.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:51:08.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:51:08.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:51:08.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:51:08.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:51:09.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:51:09.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:51:09.185 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:51:09.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:51:09.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:51:09.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:51:09.850 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:51:09.851 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:51:10.029 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:51:10.029 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:51:40.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:51:40.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:51:40.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:51:40.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:51:40.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:51:40.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:51:40.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-05-29T20:51:40.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:51:40.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-05-29T20:51:40.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:51:40.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:51:40.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:51:40.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T20:51:43.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-05-29T20:51:43.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:51:43.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:51:43.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:51:43.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:51:43.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:51:43.790 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:51:43.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:51:43.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:51:43.790 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:51:43.790 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:51:43.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:51:43.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:51:43.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:51:43.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:51:43.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:51:44.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:51:44.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:51:44.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:51:44.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:51:44.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:51:44.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:51:44.064 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:51:44.123 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:51:35
2026-05-29T20:51:44.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72835, datetime.datetime(2026, 5, 29, 20, 51, 35), datetime.datetime(2026, 5, 29, 20, 51, 34), 'salt', 9.52, 71.46, None, 21.81, 36.15, 4.89, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:51:44.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:51:44.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:51:44.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:51:34, diff=10.129186s, valid=True
2026-05-29T20:51:44.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:51:44.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:51:44.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:52:12, diff=-27.867934s, valid=True
2026-05-29T20:51:44.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:51:44.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:51:44.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:51:33, diff=11.138722s, valid=True
2026-05-29T20:51:44.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:51:44.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:51:44.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:51:44.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:51:44.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:51:44.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:51:44.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:52:12, diff=-27.858209s, valid=True
2026-05-29T20:51:44.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:51:44.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:51:44.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:51:44.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013346.142451s, valid=True
2026-05-29T20:51:44.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:51:44.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:51:44.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:51:44.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:51:44.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:51:44.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:51:44.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:51:44.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:51:44.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:51:44.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:51:44.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:51:44.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:51:44.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:51:44.468 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:51:44.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:51:45.044 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:51:45.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:51:45.148 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:51: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-05-29T20:51:45.327 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:51:45.327 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:52:15.355 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:52:15.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:52:15.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:52:15.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:52:15.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:52:16.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:52:16.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-05-29T20:52:16.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:52:16.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T20:52:16.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:52:16.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:52:16.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:52:16.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T20:52:19.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-05-29T20:52:19.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:52:19.650 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:52:19.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:52:19.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:52:19.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:52:19.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:52:19.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:52:19.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:52:19.672 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:52:19.672 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:52:19.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:52:19.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:52:19.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:52:19.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:52:19.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:52:19.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:52:19.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:52:19.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:52:19.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:52:19.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:52:19.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:52:19.936 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:52:19.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:52:05
2026-05-29T20:52:19.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72836, datetime.datetime(2026, 5, 29, 20, 52, 5), datetime.datetime(2026, 5, 29, 20, 52, 5), 'salt', 9.52, 71.53, None, 22.83, 34.54, 4.88, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:52:19.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:52:19.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:52:20.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:52:05, diff=15.00219s, valid=True
2026-05-29T20:52:20.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:52:20.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:52:20.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:52:12, diff=8.005121s, valid=True
2026-05-29T20:52:20.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:52:20.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:52:20.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:52:04, diff=16.012163s, valid=True
2026-05-29T20:52:20.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:52:20.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:52:20.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:52:20.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:52:20.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:52:20.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:52:20.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:52:12, diff=8.01572s, valid=True
2026-05-29T20:52:20.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:52:20.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:52:20.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:52:20.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013382.01646s, valid=True
2026-05-29T20:52:20.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:52:20.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:52:20.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:52:20.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:52:20.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:52:20.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:52:20.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:52:20.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:52:20.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:52:20.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:52:20.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:52:20.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:52:20.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:52:20.408 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:52:20.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:52:21.002 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:52:21.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:52:21.103 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:52:21.103 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:52:21.280 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:52:21.280 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:52:51.311 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:52:51.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:52:51.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:52:51.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:52:51.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:52:51.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:52:51.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-05-29T20:52:51.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:52:51.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-05-29T20:52:51.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:52:51.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:52:51.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:52:51.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-05-29T20:52:57.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T20:52:57.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:52:57.250 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:52:57.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:52:57.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:52:57.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:52:57.270 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:52:57.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:52:57.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:52:57.271 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:52:57.271 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:52:57.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:52:57.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:52:57.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:52:57.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:52:57.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:52:57.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:52:57.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:52:57.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:52:57.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:52:57.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:52:57.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:52:57.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:52:57.596 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:52:35
2026-05-29T20:52:57.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72837, datetime.datetime(2026, 5, 29, 20, 52, 35), datetime.datetime(2026, 5, 29, 20, 52, 35), 'salt', 9.52, 71.43, None, 22.76, 32.73, 4.9, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:52:57.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:52:57.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:52:57.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:52:35, diff=22.602107s, valid=True
2026-05-29T20:52:57.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:52:57.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:52:57.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:53:12, diff=-14.395019s, valid=True
2026-05-29T20:52:57.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:52:57.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:52:57.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:52:31, diff=26.611672s, valid=True
2026-05-29T20:52:57.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:52:57.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:52:57.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:52:57.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:52:57.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:52:57.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:52:57.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:53:12, diff=-14.385252s, valid=True
2026-05-29T20:52:57.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:52:57.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:52:57.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:52:57.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013419.615412s, valid=True
2026-05-29T20:52:57.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:52:57.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:52:57.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:52:57.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:52:57.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:52:57.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:52:57.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:52:57.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:52:57.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:52:57.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:52:57.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:52:57.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:52:57.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:52:57.936 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:52:58.154 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:52:58.504 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:52:58.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:52:58.605 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:52:58.605 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:52:58.855 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:52:58.855 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:53:28.885 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:53:28.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:53:28.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:53:29.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:53:29.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:53:29.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:53:29.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-05-29T20:53:29.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:53:29.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-05-29T20:53:29.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:53:29.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:53:29.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:53:29.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-05-29T20:54:02.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-05-29T20:54:02.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:54:02.278 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:54:02.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:54:02.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:54:02.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:54:02.298 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:54:02.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:54:02.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:54:02.299 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:54:02.299 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:54:02.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:54:02.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:54:02.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:54:02.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:54:02.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:54:02.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:54:02.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:54:02.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:54:02.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:54:02.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:54:02.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:54:02.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:54:02.694 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:53:36
2026-05-29T20:54:02.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72839, datetime.datetime(2026, 5, 29, 20, 53, 36), datetime.datetime(2026, 5, 29, 20, 53, 35), 'salt', 9.62, 71.3, None, 22.12, 37.28, 4.93, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:54:02.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:54:02.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:54:02.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:53:35, diff=27.700796s, valid=True
2026-05-29T20:54:02.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:54:02.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:54:02.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:54:12, diff=-9.296331s, valid=True
2026-05-29T20:54:02.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:54:02.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:54:02.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:53:31, diff=31.710455s, valid=True
2026-05-29T20:54:02.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:54:02.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:54:02.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:54:02.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:54:02.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:54:02.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:54:02.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:54:12, diff=-9.286332s, valid=True
2026-05-29T20:54:02.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:54:02.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:54:02.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:54:02.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013484.71433s, valid=True
2026-05-29T20:54:02.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:54:02.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:54:02.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:54:02.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:54:02.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:54:02.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:54:02.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:54:02.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:54:02.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:54:02.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:54:02.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:54:02.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:54:02.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:54:03.033 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:54:03.249 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:54:03.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:54:03.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:54: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-05-29T20:54: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-05-29T20:54:03.885 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:54:03.885 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:54:33.915 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:54:33.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:54:33.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:54:34.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:54:34.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:54:34.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:54:34.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-05-29T20:54:34.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:54:34.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-05-29T20:54:34.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:54:34.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:54:34.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:54:34.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T20:54:42.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-05-29T20:54:42.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:54:42.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:54:42.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:54:42.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:54:42.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:54:42.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:54:42.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:54:42.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:54:42.074 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:54:42.074 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:54:42.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:54:42.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:54:42.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:54:42.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:54:42.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:54:42.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:54:42.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:54:42.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:54:42.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:54:42.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:54:42.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:54:42.325 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:54:42.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:54:36
2026-05-29T20:54:42.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72841, datetime.datetime(2026, 5, 29, 20, 54, 36), datetime.datetime(2026, 5, 29, 20, 54, 36), 'salt', 9.55, 71.4, None, 20.61, 33.81, 4.9, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:54:42.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:54:42.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:54:42.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:54:36, diff=6.39126s, valid=True
2026-05-29T20:54:42.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:54:42.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:54:42.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:55:12, diff=-29.605876s, valid=True
2026-05-29T20:54:42.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:54:42.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:54:42.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:54:32, diff=10.400914s, valid=True
2026-05-29T20:54:42.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:54:42.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:54:42.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:54:42.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:54:42.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:54:42.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:54:42.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:55:12, diff=-29.596029s, valid=True
2026-05-29T20:54:42.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:54:42.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:54:42.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:54:42.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013524.404638s, valid=True
2026-05-29T20:54:42.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:54:42.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:54:42.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:54:42.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:54:42.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:54:42.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:54:42.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:54:42.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:54:42.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:54:42.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:54:42.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:54:42.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:54:42.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:54:42.719 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:54:42.958 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:54:43.316 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:54:43.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:54:43.433 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:54:43.433 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:54:43.624 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:54:43.624 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:55:13.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:55:13.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:55:13.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:55:14.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:55:14.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:55:14.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:55:14.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-05-29T20:55:14.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:55:14.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-05-29T20:55:14.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:55:14.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:55:14.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:55:14.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-05-29T20:55:16.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-05-29T20:55:16.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:55:16.757 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:55:16.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:55:16.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:55:16.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:55:16.778 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:55:16.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:55:16.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:55:16.778 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:55:16.778 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:55:16.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:55:16.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:55:16.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:55:16.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:55:16.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:55:16.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:55:16.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:55:17.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:55:17.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:55:17.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:55:17.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:55:17.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:55:17.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:55:06
2026-05-29T20:55:17.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72842, datetime.datetime(2026, 5, 29, 20, 55, 6), datetime.datetime(2026, 5, 29, 20, 55, 6), 'salt', 9.55, 71.43, None, 21.14, 35.03, 4.9, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:55:17.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:55:17.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:55:17.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:55:06, diff=11.102538s, valid=True
2026-05-29T20:55:17.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:55:17.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:55:17.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:55:12, diff=5.105358s, valid=True
2026-05-29T20:55:17.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:55:17.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:55:17.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:55:02, diff=15.111966s, valid=True
2026-05-29T20:55:17.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:55:17.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:55:17.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:55:17.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:55:17.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:55:17.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:55:17.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:55:12, diff=5.114968s, valid=True
2026-05-29T20:55:17.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:55:17.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:55:17.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:55:17.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013559.115612s, valid=True
2026-05-29T20:55:17.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:55:17.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:55:17.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:55:17.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:55:17.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:55:17.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:55:17.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:55:17.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:55:17.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:55:17.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:55:17.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:55:17.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:55:17.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:55:17.440 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:55:17.656 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:55:18.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:55:18.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:55:18.115 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:55:18.115 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:55:18.352 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:55:18.352 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:55:48.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:55:48.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:55:48.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:55:48.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:55:48.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:55:48.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:55:48.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-05-29T20:55:48.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:55:48.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-05-29T20:55:48.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:55:48.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:55:48.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:55:48.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-05-29T20:55:51.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-05-29T20:55:51.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:55:51.311 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:55:51.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:55:51.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:55:51.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:55:51.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:55:51.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:55:51.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:55:51.330 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:55:51.330 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:55:51.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:55:51.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:55:51.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:55:51.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:55:51.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:55:51.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:55:51.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:55:51.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:55:51.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:55:51.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:55:51.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:55:51.590 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:55:51.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:55:36
2026-05-29T20:55:51.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72843, datetime.datetime(2026, 5, 29, 20, 55, 36), datetime.datetime(2026, 5, 29, 20, 55, 36), 'salt', 9.59, 71.46, None, 21.42, 32.99, 4.9, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:55:51.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:55:51.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:55:51.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:55:36, diff=15.656105s, valid=True
2026-05-29T20:55:51.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:55:51.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:55:51.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:56:12, diff=-20.34102s, valid=True
2026-05-29T20:55:51.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:55:51.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:55:51.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:55:34, diff=17.665647s, valid=True
2026-05-29T20:55:51.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:55:51.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:55:51.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:55:51.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:55:51.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:55:51.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:55:51.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:56:12, diff=-20.331311s, valid=True
2026-05-29T20:55:51.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:55:51.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:55:51.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:55:51.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013593.669344s, valid=True
2026-05-29T20:55:51.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:55:51.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:55:51.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:55:51.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:55:51.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:55:51.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:55:51.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:55:51.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:55:51.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:55:51.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:55:51.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:55:51.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:55:51.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:55:51.986 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:55:52.200 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:55:52.606 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:55:52.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:55:52.706 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:55:52.706 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:55:52.964 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:55:52.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:56:22.994 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:56:22.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:56:22.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:56:23.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:56:23.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:56:23.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:56:23.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-05-29T20:56:23.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:56:23.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-05-29T20:56:23.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:56:23.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:56:23.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:56:23.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-05-29T20:56:26.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-05-29T20:56:26.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:56:26.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:56:26.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:56:26.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:56:26.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:56:26.371 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:56:26.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:56:26.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:56:26.371 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:56:26.371 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:56:26.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:56:26.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:56:26.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:56:26.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:56:26.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:56:26.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:56:26.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:56:26.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:56:26.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:56:26.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:56:26.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:56:26.624 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:56:26.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:56:07
2026-05-29T20:56:26.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72844, datetime.datetime(2026, 5, 29, 20, 56, 7), datetime.datetime(2026, 5, 29, 20, 56, 6), 'salt', 9.52, 71.4, None, 21.52, 34.61, 4.91, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:56:26.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:56:26.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:56:26.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:56:06, diff=20.698638s, valid=True
2026-05-29T20:56:26.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:56:26.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:56:26.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:56:12, diff=14.701481s, valid=True
2026-05-29T20:56:26.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:56:26.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:56:26.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:56:05, diff=21.708246s, valid=True
2026-05-29T20:56:26.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:56:26.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:56:26.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:56:26.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:56:26.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:56:26.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:56:26.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:56:12, diff=14.711245s, valid=True
2026-05-29T20:56:26.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:56:26.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:56:26.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:56:26.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013628.711904s, valid=True
2026-05-29T20:56:26.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:56:26.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:56:26.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:56:26.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:56:26.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:56:26.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:56:26.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:56:26.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:56:26.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:56:26.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:56:26.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:56:26.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:56:26.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:56:27.030 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:56:27.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:56:27.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:56:27.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:56:27.692 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:56:27.692 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:56:27.935 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:56:27.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:56:57.959 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:56:57.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:56:57.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:56:58.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:56:58.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:56:58.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:56:58.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-05-29T20:56:58.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:56:58.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-05-29T20:56:58.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:56:58.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:56:58.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:56:58.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-05-29T20:57:01.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T20:57:01.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:57:01.160 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:57:01.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:57:01.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:57:01.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:57:01.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:57:01.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:57:01.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:57:01.182 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:57:01.182 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:57:01.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:57:01.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:57:01.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:57:01.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:57:01.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:57:01.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:57:01.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:57:01.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:57:01.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:57:01.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:57:01.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:57:01.434 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:57:01.495 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:56:37
2026-05-29T20:57:01.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72845, datetime.datetime(2026, 5, 29, 20, 56, 37), datetime.datetime(2026, 5, 29, 20, 56, 37), 'salt', 9.52, 71.3, None, 21.81, 33.03, 4.93, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:57:01.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:57:01.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:57:01.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:56:37, diff=24.501411s, valid=True
2026-05-29T20:57:01.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:57:01.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:57:01.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:57:12, diff=-10.495759s, valid=True
2026-05-29T20:57:01.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:57:01.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:57:01.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:56:36, diff=25.510976s, valid=True
2026-05-29T20:57:01.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:57:01.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:57:01.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:57:01.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:57:01.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:57:01.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:57:01.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:57:12, diff=-10.485955s, valid=True
2026-05-29T20:57:01.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:57:01.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:57:01.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:57:01.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013663.514722s, valid=True
2026-05-29T20:57:01.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:57:01.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:57:01.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:57:01.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:57:01.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:57:01.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:57:01.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:57:01.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:57:01.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:57:01.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:57:01.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:57:01.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:57:01.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:57:01.832 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:57:02.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:57:02.464 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:57:02.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:57:02.566 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:57:02.566 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:57:02.744 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:57:02.744 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:57:32.747 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:57:32.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:57:32.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:57:33.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:57:33.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:57:33.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:57:33.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-05-29T20:57:33.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:57:33.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-05-29T20:57:33.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:57:33.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:57:33.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:57:33.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-05-29T20:57:36.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-05-29T20:57:36.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:57:36.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:57:36.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:57:36.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:57:36.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:57:36.872 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:57:36.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:57:36.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:57:36.872 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:57:36.872 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:57:36.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:57:36.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:57:36.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:57:37.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:57:37.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:57:37.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:57:37.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:57:37.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:57:37.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:57:37.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:57:37.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:57:37.124 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:57:37.186 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:57:07
2026-05-29T20:57:37.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72846, datetime.datetime(2026, 5, 29, 20, 57, 7), datetime.datetime(2026, 5, 29, 20, 57, 7), 'salt', 9.55, 71.17, None, 21.14, 30.55, 4.95, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:57:37.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:57:37.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:57:37.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:57:07, diff=30.192922s, valid=True
2026-05-29T20:57:37.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:57:37.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:57:37.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:57:12, diff=25.195779s, valid=True
2026-05-29T20:57:37.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:57:37.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:57:37.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:57:04, diff=33.202483s, valid=True
2026-05-29T20:57:37.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:57:37.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:57:37.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:57:37.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:57:37.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:57:37.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:57:37.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:57:12, diff=25.205552s, valid=True
2026-05-29T20:57:37.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:57:37.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:57:37.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:57:37.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013699.206267s, valid=True
2026-05-29T20:57:37.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:57:37.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:57:37.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:57:37.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:57:37.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:57:37.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:57:37.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:57:37.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:57:37.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:57:37.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:57:37.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:57:37.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:57:37.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:57:37.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:57:37.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:57:38.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:57:38.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:57:38.202 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:57:38.202 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:57:38.385 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:57:38.385 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:58:08.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:58:08.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:58:08.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:58:08.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:58:08.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:58:09.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:58:09.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-05-29T20:58:09.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:58:09.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-05-29T20:58:09.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:58:09.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:58:09.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:58:09.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-05-29T20:58:12.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-05-29T20:58:12.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:58:12.066 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:58:12.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:58:12.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:58:12.088 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:58:12.088 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:58:12.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:58:12.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:58:12.089 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:58:12.089 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:58:12.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:58:12.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:58:12.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:58:12.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:58:12.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:58:12.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:58:12.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:58:12.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:58:12.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:58:12.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:58:12.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:58:12.344 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:58:12.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:58:08
2026-05-29T20:58:12.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72848, datetime.datetime(2026, 5, 29, 20, 58, 8), datetime.datetime(2026, 5, 29, 20, 58, 7), 'salt', 9.59, 71.13, None, 22.58, 31.67, 4.97, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:58:12.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:58:12.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:58:12.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:58:07, diff=5.409268s, valid=True
2026-05-29T20:58:12.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:58:12.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:58:12.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:58:12, diff=0.412108s, valid=True
2026-05-29T20:58:12.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:58:12.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:58:12.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:58:04, diff=8.418798s, valid=True
2026-05-29T20:58:12.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:58:12.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:58:12.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:58:12.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:58:12.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:58:12.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:58:12.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:58:12, diff=0.421828s, valid=True
2026-05-29T20:58:12.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:58:12.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:58:12.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:58:12.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013734.422489s, valid=True
2026-05-29T20:58:12.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:58:12.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:58:12.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:58:12.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:58:12.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:58:12.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:58:12.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:58:12.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:58:12.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:58:12.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:58:12.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:58:12.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:58:12.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:58:12.741 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:58:13.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:58:13.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:58:13.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:58:13.500 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:58:13.500 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:58:13.683 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:58:13.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:58:43.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:58:43.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:58:43.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:58:44.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:58:44.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:58:44.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:58:44.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-05-29T20:58:44.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:58:44.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-05-29T20:58:44.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:58:44.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:58:44.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:58:44.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-05-29T20:58: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-05-29T20:58:47.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:58:47.382 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:58:47.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:58:47.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:58:47.402 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:58:47.403 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:58:47.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:58:47.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:58:47.403 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:58:47.403 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:58:47.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:58:47.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T20:58:47.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:58:47.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T20:58:47.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:58:47.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:58:47.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:58:47.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T20:58:47.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:58:47.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:58:47.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:58:47.661 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:58:47.719 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:58:38
2026-05-29T20:58:47.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72849, datetime.datetime(2026, 5, 29, 20, 58, 38), datetime.datetime(2026, 5, 29, 20, 58, 37), 'salt', 9.55, 71.03, None, 22.3, 31.2, 4.98, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:58:47.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:58:47.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T20:58:47.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:58:37, diff=10.72603s, valid=True
2026-05-29T20:58:47.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:58:47.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:58:47.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:59:12, diff=-24.27112s, valid=True
2026-05-29T20:58:47.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:58:47.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T20:58:47.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:58:35, diff=12.735562s, valid=True
2026-05-29T20:58:47.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:58:47.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:58:47.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:58:47.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:58:47.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:58:47.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T20:58:47.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:59:12, diff=-24.261366s, valid=True
2026-05-29T20:58:47.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:58:47.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:58:47.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:58:47.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013769.739299s, valid=True
2026-05-29T20:58:47.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:58:47.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:58:47.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:58:47.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:58:47.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:58:47.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:58:47.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:58:47.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:58:47.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:58:47.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:58:47.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:58:47.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:58:48.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:58:48.056 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:58:48.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:58:48.640 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:58:48.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:58:48.741 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:58:48.741 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:58:48.924 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:58:48.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T20:59:18.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T20:59:18.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T20:59:18.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T20:59:19.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T20:59:19.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T20:59:19.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T20:59:19.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-05-29T20:59:19.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T20:59:19.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-05-29T20:59:19.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T20:59:19.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T20:59:19.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T20:59:19.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-05-29T20:59:58.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T20:59:58.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T20:59:58.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T20:59:58.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T20:59:58.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T20:59:58.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T20:59:58.197 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T20:59:58.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T20:59:58.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T20:59:58.198 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T20:59:58.198 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T20:59:58.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T20:59:58.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T20:59:58.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T20:59:58.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T20:59:58.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:59:58.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:59:58.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T20:59:58.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T20:59:58.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T20:59:58.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T20:59:58.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T20:59:58.452 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T20:59:58.513 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 20:59:38
2026-05-29T20:59:58.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72851, datetime.datetime(2026, 5, 29, 20, 59, 38), datetime.datetime(2026, 5, 29, 20, 59, 38), 'salt', 9.62, 70.73, None, 22.83, 31.65, 5.05, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T20:59:58.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T20:59:58.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T20:59:58.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:59:38, diff=20.519597s, valid=True
2026-05-29T20:59:58.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T20:59:58.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:59:58.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:00:12, diff=-13.477586s, valid=True
2026-05-29T20:59:58.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T20:59:58.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T20:59:58.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 20:59:35, diff=23.529123s, valid=True
2026-05-29T20:59:58.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T20:59:58.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:59:58.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T20:59:58.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T20:59:58.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T20:59:58.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T20:59:58.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:00:12, diff=-13.467861s, valid=True
2026-05-29T20:59:58.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T20:59:58.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T20:59:58.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T20:59:58.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013840.532812s, valid=True
2026-05-29T20:59:58.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T20:59:58.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T20:59:58.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T20:59:58.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T20:59:58.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T20:59:58.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T20:59:58.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T20:59:58.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T20:59:58.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T20:59:58.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T20:59:58.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T20:59:58.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T20:59:58.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T20:59:58.917 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T20:59:59.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:59:59.477 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T20:59:59.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T20:59:59.584 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T20:59:59.584 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T20:59:59.809 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T20:59:59.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:00:29.839 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:00:29.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:00:29.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:00:30.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:00:30.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:00:30.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:00:30.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T21:00:30.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:00:30.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-05-29T21:00:30.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:00:30.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:00:30.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:00:30.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-05-29T21:01:04.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-05-29T21:01:04.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:01:04.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:01:04.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:01:04.223 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:01:04.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:01:04.236 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:01:04.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:01:04.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:01:04.236 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:01:04.236 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:01:04.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:01:04.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:01:04.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:01:04.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:01:04.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:01:04.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:01:04.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:01:04.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:01:04.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:01:04.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:01:04.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:01:04.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:01:04.581 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:00:39
2026-05-29T21:01:04.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72853, datetime.datetime(2026, 5, 29, 21, 0, 39), datetime.datetime(2026, 5, 29, 21, 0, 38), 'salt', 9.59, 70.44, None, 21.0, 26.63, 5.11, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:01:04.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:01:04.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:01:04.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:00:38, diff=26.587933s, valid=True
2026-05-29T21:01:04.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:01:04.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:01:04.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:01:12, diff=-7.409268s, valid=True
2026-05-29T21:01:04.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:01:04.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:01:04.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:00:38, diff=26.597466s, valid=True
2026-05-29T21:01:04.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:01:04.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:01:04.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:01:04.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:01:04.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:01:04.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:01:04.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:01:12, diff=-7.399508s, valid=True
2026-05-29T21:01:04.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:01:04.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:01:04.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:01:04.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013906.601157s, valid=True
2026-05-29T21:01:04.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:01:04.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:01:04.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:01:04.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:01:04.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:01:04.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:01:04.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:01:04.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:01:04.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:01:04.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:01:04.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:01:04.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:01:04.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:01:04.921 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:01:05.136 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:01:05.482 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:01:05.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:01:05.584 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:01:05.584 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:01:05.850 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:01:05.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:01:35.880 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:01:35.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:01:35.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:01:36.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:01:36.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:01:36.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:01:36.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-05-29T21:01:36.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:01:36.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T21:01:36.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:01:36.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:01:36.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:01:36.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-05-29T21:01:39.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T21:01:39.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:01:39.828 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:01:39.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:01:39.838 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:01:39.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:01:39.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:01:39.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:01:39.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:01:39.850 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:01:39.850 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:01:39.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:01:39.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:01:39.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:01:40.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:01:40.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:01:40.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:01:40.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:01:40.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:01:40.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:01:40.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:01:40.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:01:40.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:01:40.183 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:01:39
2026-05-29T21:01:40.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72855, datetime.datetime(2026, 5, 29, 21, 1, 39), datetime.datetime(2026, 5, 29, 21, 1, 39), 'salt', 9.69, 70.27, None, 21.28, 28.81, 5.15, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:01:40.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:01:40.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:01:40.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:01:39, diff=1.189474s, valid=True
2026-05-29T21:01:40.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:01:40.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:01:40.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:02:12, diff=-31.807561s, valid=True
2026-05-29T21:01:40.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:01:40.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:01:40.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:01:37, diff=3.19923s, valid=True
2026-05-29T21:01:40.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:01:40.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:01:40.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:01:40.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:01:40.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:01:40.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:01:40.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:02:12, diff=-31.797676s, valid=True
2026-05-29T21:01:40.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:01:40.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:01:40.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:01:40.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1013942.20301s, valid=True
2026-05-29T21:01:40.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:01:40.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:01:40.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:01:40.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:01:40.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:01:40.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:01:40.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:01:40.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:01:40.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:01:40.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:01:40.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:01:40.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:01:40.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:01:40.593 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:01:40.816 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:01:41.176 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:01:41.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:01:41.282 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:01:41.282 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:01:41.528 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:01:41.528 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:02:11.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:02:11.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:02:11.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:02:11.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:02:11.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:02:11.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:02:11.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-05-29T21:02:12.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:02:12.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-05-29T21:02:12.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:02:12.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:02:12.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:02:12.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-05-29T21:02:46.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-05-29T21:02:46.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:02:46.331 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:02:46.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:02:46.339 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:02:46.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:02:46.351 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:02:46.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:02:46.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:02:46.352 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:02:46.352 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:02:46.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:02:46.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:02:46.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:02:46.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:02:46.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:02:46.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:02:46.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:02:46.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:02:46.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:02:46.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:02:46.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:02:46.617 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:02:46.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:02:40
2026-05-29T21:02:46.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72857, datetime.datetime(2026, 5, 29, 21, 2, 40), datetime.datetime(2026, 5, 29, 21, 2, 39), 'salt', 9.72, 70.3, None, 22.97, 32.19, 5.14, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:02:46.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:02:46.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:02:46.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:02:39, diff=7.681632s, valid=True
2026-05-29T21:02:46.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:02:46.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:02:46.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:03:12, diff=-25.315516s, valid=True
2026-05-29T21:02:46.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:02:46.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:02:46.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:02:37, diff=9.691257s, valid=True
2026-05-29T21:02:46.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:02:46.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:02:46.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:02:46.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:02:46.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:02:46.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:02:46.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:03:12, diff=-25.305704s, valid=True
2026-05-29T21:02:46.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:02:46.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:02:46.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:02:46.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014008.694959s, valid=True
2026-05-29T21:02:46.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:02:46.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:02:46.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:02:46.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:02:46.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:02:46.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:02:46.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:02:46.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:02:46.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:02:46.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:02:46.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:02:46.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:02:46.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:02:47.025 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:02:47.251 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:02:47.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:02:47.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:02:47.715 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:02:47.715 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:02:47.800 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:02:47.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:03:17.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:03:17.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:03:17.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:03:18.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:03:18.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:03:18.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:03: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-05-29T21:03:18.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:03:18.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-05-29T21:03:18.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:03:18.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:03:18.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:03:18.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-05-29T21:03:21.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-05-29T21:03:21.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:03:21.364 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:03:21.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:03:21.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:03:21.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:03:21.385 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:03:21.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:03:21.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:03:21.386 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:03:21.386 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:03:21.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:03:21.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:03:21.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:03:21.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:03:21.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:03:21.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:03:21.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:03:21.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:03:21.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:03:21.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:03:21.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:03:21.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:03:21.783 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:03:10
2026-05-29T21:03:21.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72858, datetime.datetime(2026, 5, 29, 21, 3, 10), datetime.datetime(2026, 5, 29, 21, 3, 9), 'salt', 9.59, 70.24, None, 22.02, 30.29, 5.15, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:03:21.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:03:21.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:03:21.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:03:09, diff=12.789656s, valid=True
2026-05-29T21:03:21.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:03:21.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:03:21.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:03:12, diff=9.792497s, valid=True
2026-05-29T21:03:21.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:03:21.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:03:21.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:03:08, diff=13.799089s, valid=True
2026-05-29T21:03:21.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:03:21.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:03:21.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:03:21.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:03:21.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:03:21.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:03:21.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:03:12, diff=9.802137s, valid=True
2026-05-29T21:03:21.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:03:21.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:03:21.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:03:21.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014043.802795s, valid=True
2026-05-29T21:03:21.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:03:21.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:03:21.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:03:21.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:03:21.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:03:21.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:03:21.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:03:21.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:03:21.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:03:21.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:03:22.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:03:22.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:03:22.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:03:22.136 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:03:22.354 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:03:22.707 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:03:22.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:03:22.810 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:03:22.810 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:03:22.896 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:03:22.896 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:03:52.925 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:03:52.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:03:52.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:03:53.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:03:53.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:03:53.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:03:53.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-05-29T21:03:53.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:03:53.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-05-29T21:03:53.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:03:53.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:03:53.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:03:53.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-05-29T21:03:55.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-05-29T21:03:55.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:03:55.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:03:55.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:03:55.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:03:55.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:03:55.757 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:03:55.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:03:55.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:03:55.757 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:03:55.758 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:03:55.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:03:55.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:03:55.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:03:55.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:03:55.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:03:55.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:03:55.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:03:56.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:03:56.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:03:56.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:03:56.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:03:56.013 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:03:56.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:03:40
2026-05-29T21:03:56.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72859, datetime.datetime(2026, 5, 29, 21, 3, 40), datetime.datetime(2026, 5, 29, 21, 3, 40), 'salt', 9.69, 70.27, None, 22.65, 29.77, 5.15, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:03:56.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:03:56.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:03:56.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:03:40, diff=16.088558s, valid=True
2026-05-29T21:03:56.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:03:56.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:03:56.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:04:12, diff=-15.90855s, valid=True
2026-05-29T21:03:56.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:03:56.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:03:56.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:03:38, diff=18.098274s, valid=True
2026-05-29T21:03:56.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:03:56.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:03:56.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:03:56.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:03:56.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:03:56.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:03:56.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:04:12, diff=-15.898569s, valid=True
2026-05-29T21:03:56.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:03:56.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:03:56.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:03:56.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014078.102116s, valid=True
2026-05-29T21:03:56.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:03:56.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:03:56.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:03:56.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:03:56.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:03:56.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:03:56.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:03:56.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:03:56.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:03:56.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:03:56.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:03:56.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:03:56.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:03:56.419 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:03:56.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:03:56.979 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:03:57.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:03:57.081 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:03:57.081 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:03:57.975 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:03:57.975 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:04:27.998 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:04:27.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:04:27.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:04:28.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:04:28.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:04:28.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:04:28.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-05-29T21:04:28.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:04:28.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-05-29T21:04:28.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:04:28.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:04:28.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:04:28.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-05-29T21:04:38.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-05-29T21:04:38.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:04:38.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:04:38.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:04:38.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:04:38.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:04:38.342 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:04:38.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:04:38.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:04:38.342 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:04:38.342 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:04:38.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:04:38.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:04:38.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:04:38.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:04:38.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:04:38.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:04:38.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:04:38.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:04:38.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:04:38.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:04:38.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:04:38.609 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:04:38.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:04:10
2026-05-29T21:04:38.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72860, datetime.datetime(2026, 5, 29, 21, 4, 10), datetime.datetime(2026, 5, 29, 21, 4, 10), 'salt', 9.65, 70.34, None, 22.37, 28.86, 5.12, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:04:38.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:04:38.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:04:38.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:04:10, diff=28.679981s, valid=True
2026-05-29T21:04:38.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:04:38.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:04:38.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:04:12, diff=26.682793s, valid=True
2026-05-29T21:04:38.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:04:38.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:04:38.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:04:08, diff=30.689396s, valid=True
2026-05-29T21:04:38.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:04:38.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:04:38.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:04:38.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:04:38.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:04:38.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:04:38.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:04:12, diff=26.692441s, valid=True
2026-05-29T21:04:38.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:04:38.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:04:38.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:04:38.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014120.693109s, valid=True
2026-05-29T21:04:38.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:04:38.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:04:38.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:04:38.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:04:38.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:04:38.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:04:38.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:04:38.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:04:38.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:04:38.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:04:38.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:04:38.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:04:38.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:04:39.007 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:04:39.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:04:39.566 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:04:39.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:04:39.668 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:04:39.668 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:04:39.854 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:04:39.855 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:05:09.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:05:09.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:05:09.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:05:09.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:05:09.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:05:10.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:05:10.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-05-29T21:05:10.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:05:10.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-05-29T21:05:10.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:05:10.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:05:10.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:05:10.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-05-29T21:05:13.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T21:05:13.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:05:13.136 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:05:13.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:05:13.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:05:13.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:05:13.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:05:13.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:05:13.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:05:13.158 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:05:13.158 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:05:13.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:05:13.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:05:13.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:05:13.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:05:13.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:05:13.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:05:13.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:05:13.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:05:13.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:05:13.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:05:13.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:05:13.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:05:13.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:05:11
2026-05-29T21:05:13.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72862, datetime.datetime(2026, 5, 29, 21, 5, 11), datetime.datetime(2026, 5, 29, 21, 5, 10), 'salt', 9.59, 70.2, None, 22.79, 35.24, 5.15, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:05:13.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:05:13.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:05:13.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:05:10, diff=3.496371s, valid=True
2026-05-29T21:05:13.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:05:13.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:05:13.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:05:12, diff=1.499293s, valid=True
2026-05-29T21:05:13.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:05:13.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:05:13.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:05:08, diff=5.506083s, valid=True
2026-05-29T21:05:13.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:05:13.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:05:13.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:05:13.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:05:13.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:05:13.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:05:13.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:05:12, diff=1.509161s, valid=True
2026-05-29T21:05:13.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:05:13.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:05:13.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:05:13.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014155.509836s, valid=True
2026-05-29T21:05:13.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:05:13.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:05:13.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:05:13.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:05:13.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:05:13.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:05:13.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:05:13.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:05:13.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:05:13.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:05:13.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:05:13.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:05:13.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:05:13.827 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:05:14.044 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:05:14.452 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:05:14.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:05:14.555 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:05:14.555 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:05:14.742 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:05:14.742 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:05:44.762 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:05:44.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:05:44.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:05:45.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:05:45.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:05:45.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:05:45.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-05-29T21:05:45.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:05:45.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-05-29T21:05:45.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:05:45.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:05:45.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:05:45.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-05-29T21:05:58.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-05-29T21:05:58.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:05:58.306 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:05:58.306 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:05:58.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:05:58.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:05:58.328 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:05:58.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:05:58.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:05:58.329 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:05:58.329 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:05:58.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:05:58.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:05:58.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:05:58.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:05:58.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:05:58.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:05:58.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:05:58.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:05:58.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:05:58.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:05:58.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:05:58.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:05:58.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:05:41
2026-05-29T21:05:58.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72863, datetime.datetime(2026, 5, 29, 21, 5, 41), datetime.datetime(2026, 5, 29, 21, 5, 40), 'salt', 9.69, 70.3, None, 22.9, 29.4, 5.14, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:05:58.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:05:58.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:05:58.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:05:40, diff=18.660085s, valid=True
2026-05-29T21:05:58.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:05:58.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:05:58.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:06:12, diff=-13.337071s, valid=True
2026-05-29T21:05:58.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:05:58.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:05:58.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:05:39, diff=19.669659s, valid=True
2026-05-29T21:05:58.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:05:58.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:05:58.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:05:58.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:05:58.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:05:58.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:05:58.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:06:12, diff=-13.327295s, valid=True
2026-05-29T21:05:58.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:05:58.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:05:58.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:05:58.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014200.673371s, valid=True
2026-05-29T21:05:58.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:05:58.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:05:58.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:05:58.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:05:58.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:05:58.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:05:58.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:05:58.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:05:58.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:05:58.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:05:58.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:05:58.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:05:58.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:05:58.991 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:05:59.211 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:05:59.559 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:05:59.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:05:59.664 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:05:59.664 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:05:59.909 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:05:59.909 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:06:29.938 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:06:29.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:06:29.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:06:30.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:06:30.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:06:30.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:06:30.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-05-29T21:06:30.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:06:30.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-05-29T21:06:30.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:06:30.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:06:30.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:06:30.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-05-29T21:06:35.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T21:06:35.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:06:35.957 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:06:35.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:06:35.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:06:35.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:06:35.977 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:06:35.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:06:35.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:06:35.978 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:06:35.978 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:06:35.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:06:36.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:06:36.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:06:36.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:06:36.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:06:36.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:06:36.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:06:36.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:06:36.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:06:36.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:06:36.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:06:36.254 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:06:36.317 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:06:11
2026-05-29T21:06:36.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72864, datetime.datetime(2026, 5, 29, 21, 6, 11), datetime.datetime(2026, 5, 29, 21, 6, 11), 'salt', 9.59, 70.37, None, 22.41, 29.21, 5.12, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:06:36.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:06:36.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:06:36.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:06:11, diff=25.32386s, valid=True
2026-05-29T21:06:36.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:06:36.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:06:36.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:06:12, diff=24.327205s, valid=True
2026-05-29T21:06:36.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:06:36.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:06:36.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:06:09, diff=27.336382s, valid=True
2026-05-29T21:06:36.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:06:36.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:06:36.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:06:36.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:06:36.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:06:36.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:06:36.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:06:12, diff=24.340707s, valid=True
2026-05-29T21:06:36.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:06:36.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:06:36.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:06:36.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014238.34138s, valid=True
2026-05-29T21:06:36.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:06:36.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:06:36.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:06:36.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:06:36.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:06:36.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:06:36.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:06:36.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:06:36.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:06:36.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:06:36.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:06:36.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:06:36.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:06:36.697 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:06:36.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:06:37.360 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:06:37.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:06:37.462 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:06:37.462 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:06:37.709 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:06:37.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:07:07.739 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:07:07.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:07:07.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:07:07.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:07:07.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:07:08.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:07:08.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T21:07:08.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:07:08.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-05-29T21:07:08.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:07:08.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:07:08.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:07:08.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-05-29T21:07:10.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-05-29T21:07:10.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:07:10.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:07:10.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:07:10.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:07:10.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:07:10.638 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:07:10.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:07:10.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:07:10.638 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:07:10.638 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:07:10.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:07:10.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:07:10.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:07:10.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:07:10.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:07:10.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:07:10.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:07:10.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:07:10.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:07:10.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:07:10.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:07:10.909 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:07:10.969 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:06:41
2026-05-29T21:07:10.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72865, datetime.datetime(2026, 5, 29, 21, 6, 41), datetime.datetime(2026, 5, 29, 21, 6, 41), 'salt', 9.49, 70.24, None, 22.69, 32.05, 5.14, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:07:10.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:07:10.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:07:10.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:06:41, diff=29.97556s, valid=True
2026-05-29T21:07:10.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:07:10.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:07:10.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:07:12, diff=-1.021618s, valid=True
2026-05-29T21:07:10.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:07:10.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:07:10.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:06:39, diff=31.985061s, valid=True
2026-05-29T21:07:10.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:07:10.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:07:10.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:07:10.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:07:10.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:07:10.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:07:10.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:07:12, diff=-1.011908s, valid=True
2026-05-29T21:07:10.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:07:10.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:07:10.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:07:10.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014272.98876s, valid=True
2026-05-29T21:07:10.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:07:10.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:07:10.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:07:10.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:07:10.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:07:11.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:07:11.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:07:11.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:07:11.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:07:11.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:07:11.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:07:11.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:07:11.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:07:11.305 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:07:11.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:07:11.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:07:11.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:07:11.967 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:07:11.967 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:07:12.224 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:07:12.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:07:42.238 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:07:42.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:07:42.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:07:42.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:07:42.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:07:42.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:07:42.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T21:07:42.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:07:42.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-05-29T21:07:42.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:07:42.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:07:42.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:07:42.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-05-29T21:07:53.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-05-29T21:07:53.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:07:53.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:07:53.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:07:53.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:07:53.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:07:53.610 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:07:53.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:07:53.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:07:53.610 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:07:53.610 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:07:53.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:07:53.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:07:53.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:07:53.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:07:53.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:07:53.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:07:53.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:07:53.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:07:53.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:07:53.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:07:53.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:07:53.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:07:53.922 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:07:42
2026-05-29T21:07:53.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72867, datetime.datetime(2026, 5, 29, 21, 7, 42), datetime.datetime(2026, 5, 29, 21, 7, 41), 'salt', 9.52, 69.94, None, 21.17, 31.88, 5.2, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:07:53.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:07:53.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:07:53.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:07:41, diff=12.929052s, valid=True
2026-05-29T21:07:53.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:07:53.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:07:53.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:08:12, diff=-18.068132s, valid=True
2026-05-29T21:07:53.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:07:53.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:07:53.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:07:40, diff=13.938407s, valid=True
2026-05-29T21:07:53.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:07:53.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:07:53.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:07:53.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:07:53.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:07:53.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:07:53.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:08:12, diff=-18.05858s, valid=True
2026-05-29T21:07:53.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:07:53.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:07:53.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:07:53.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014315.94209s, valid=True
2026-05-29T21:07:53.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:07:53.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:07:53.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:07:53.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:07:53.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:07:54.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:07:54.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:07:54.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:07:54.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:07:54.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:07:54.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:07:54.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:07:54.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:07:54.325 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:07:54.541 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:07:54.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:07:54.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:07:54.996 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:07:54.996 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:07:55.175 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:07:55.175 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:08:25.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:08:25.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:08:25.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:08:25.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:08:25.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:08:25.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:08:25.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T21:08:25.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:08:25.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-05-29T21:08:25.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:08:25.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:08:25.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:08:25.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-05-29T21:08:29.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-05-29T21:08:29.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:08:29.550 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:08:29.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:08:29.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:08:29.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:08:29.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:08:29.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:08:29.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:08:29.572 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:08:29.572 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:08:29.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:08:29.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:08:29.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:08:29.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:08:29.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:08:29.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:08:29.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:08:29.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:08:29.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:08:29.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:08:29.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:08:29.829 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:08:29.890 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:08:12
2026-05-29T21:08:29.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72868, datetime.datetime(2026, 5, 29, 21, 8, 12), datetime.datetime(2026, 5, 29, 21, 8, 11), 'salt', 9.62, 69.87, None, 21.95, 31.86, 5.22, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:08:29.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:08:29.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:08:29.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:08:11, diff=18.896594s, valid=True
2026-05-29T21:08:29.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:08:29.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:08:29.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:08:12, diff=17.899559s, valid=True
2026-05-29T21:08:29.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:08:29.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:08:29.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:08:10, diff=19.906205s, valid=True
2026-05-29T21:08:29.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:08:29.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:08:29.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:08:29.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:08:29.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:08:29.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:08:29.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:08:12, diff=17.909421s, valid=True
2026-05-29T21:08:29.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:08:29.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:08:29.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:08:29.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014351.910239s, valid=True
2026-05-29T21:08:29.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:08:29.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:08:29.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:08:29.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:08:29.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:08:29.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:08:29.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:08:29.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:08:29.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:08:30.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:08:30.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:08:30.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:08:30.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:08:30.239 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:08:30.456 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:08:30.800 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:08:30.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:08:30.897 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:08:30.897 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:08:31.076 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:08:31.076 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:09:01.106 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:09:01.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:09:01.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:09:01.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:09:01.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:09:01.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:09:01.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-05-29T21:09:01.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:09:01.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-05-29T21:09:01.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:09:01.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:09:01.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:09:01.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T21:09:35.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-05-29T21:09:35.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:09:35.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:09:35.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:09:35.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:09:35.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:09:35.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:09:35.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:09:35.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:09:35.159 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:09:35.159 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:09:35.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:09:35.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:09:35.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:09:35.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:09:35.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:09:35.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:09:35.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:09:35.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:09:35.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:09:35.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:09:35.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:09:35.419 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:09:35.478 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:09:12
2026-05-29T21:09:35.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72870, datetime.datetime(2026, 5, 29, 21, 9, 12), datetime.datetime(2026, 5, 29, 21, 9, 12), 'salt', 9.59, 69.67, None, 22.34, 30.92, 5.26, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:09:35.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:09:35.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:09:35.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:09:12, diff=23.485082s, valid=True
2026-05-29T21:09:35.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:09:35.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:09:35.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:09:12, diff=23.48794s, valid=True
2026-05-29T21:09:35.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:09:35.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:09:35.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:09:12, diff=23.494921s, valid=True
2026-05-29T21:09:35.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:09:35.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:09:35.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:09:35.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:09:35.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:09:35.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:09:35.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:09:12, diff=23.498835s, valid=True
2026-05-29T21:09:35.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:09:35.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:09:35.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:09:35.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014417.499688s, valid=True
2026-05-29T21:09:35.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:09:35.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:09:35.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:09:35.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:09:35.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:09:35.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:09:35.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:09:35.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:09:35.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:09:35.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:09:35.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:09:35.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:09:35.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:09:35.892 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:09:36.113 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:09:36.471 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:09:36.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:09:36.574 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:09:36.574 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:09:36.844 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:09:36.844 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:10:06.873 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:10:06.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:10:06.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:10:07.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:10:07.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:10:07.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:10:07.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-05-29T21:10:07.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:10:07.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-05-29T21:10:07.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:10:07.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:10:07.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:10:07.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-05-29T21:10:10.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-05-29T21:10:10.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:10:10.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:10:10.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:10:10.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:10:10.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:10:10.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:10:10.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:10:10.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:10:10.816 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:10:10.816 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:10:10.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:10:10.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:10:10.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:10:10.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:10:10.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:10:11.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:10:11.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:10:11.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:10:11.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:10:11.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:10:11.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:10:11.076 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:10:11.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:09:43
2026-05-29T21:10:11.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72871, datetime.datetime(2026, 5, 29, 21, 9, 43), datetime.datetime(2026, 5, 29, 21, 9, 42), 'salt', 9.62, 69.67, None, 22.94, 36.55, 5.26, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:10:11.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:10:11.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:10:11.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:09:42, diff=29.143438s, valid=True
2026-05-29T21:10:11.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:10:11.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:10:11.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:10:12, diff=-0.853646s, valid=True
2026-05-29T21:10:11.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:10:11.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:10:11.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:09:41, diff=30.153093s, valid=True
2026-05-29T21:10:11.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:10:11.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:10:11.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:10:11.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:10:11.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:10:11.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:10:11.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:10:12, diff=-0.843794s, valid=True
2026-05-29T21:10:11.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:10:11.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:10:11.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:10:11.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014453.156897s, valid=True
2026-05-29T21:10:11.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:10:11.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:10:11.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:10:11.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:10:11.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:10:11.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:10:11.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:10:11.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:10:11.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:10:11.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:10:11.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:10:11.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:10:11.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:10:11.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:10:11.717 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:10:12.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:10:12.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:10:12.158 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:10:12.158 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:10:12.400 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:10:12.400 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:10:42.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:10:42.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:10:42.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:10:42.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:10:42.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:10:42.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:10:42.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-05-29T21:10:42.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:10:42.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-05-29T21:10:42.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:10:42.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:10:42.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:10:42.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-05-29T21:10:45.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-05-29T21:10:45.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:10:45.205 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:10:45.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:10:45.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:10:45.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:10:45.224 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:10:45.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:10:45.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:10:45.225 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:10:45.225 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:10:45.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:10:45.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:10:45.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:10:45.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:10:45.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:10:45.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:10:45.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:10:45.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:10:45.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:10:45.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:10:45.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:10:45.485 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:10:45.543 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:10:43
2026-05-29T21:10:45.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72873, datetime.datetime(2026, 5, 29, 21, 10, 43), datetime.datetime(2026, 5, 29, 21, 10, 43), 'salt', 9.72, 69.71, None, 22.37, 29.56, 5.26, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:10:45.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:10:45.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:10:45.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:10:43, diff=2.551504s, valid=True
2026-05-29T21:10:45.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:10:45.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:10:45.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:11:12, diff=-26.445648s, valid=True
2026-05-29T21:10:45.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:10:45.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:10:45.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:10:41, diff=4.561348s, valid=True
2026-05-29T21:10:45.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:10:45.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:10:45.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:10:45.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:10:45.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:10:45.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:10:45.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:11:12, diff=-26.434567s, valid=True
2026-05-29T21:10:45.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:10:45.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:10:45.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:10:45.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014487.566577s, valid=True
2026-05-29T21:10:45.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:10:45.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:10:45.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:10:45.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:10:45.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:10:45.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:10:45.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:10:45.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:10:45.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:10:45.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:10:45.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:10:45.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:10:45.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:10:45.956 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:10:46.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:10:46.547 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:10:46.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:10:46.649 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:10:46.649 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:10:46.830 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:10:46.830 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:11:16.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:11:16.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:11:16.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:11:17.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:11:17.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:11:17.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:11:17.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-05-29T21:11:17.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:11:17.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-05-29T21:11:17.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:11:17.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:11:17.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:11:17.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-05-29T21:12:43.328 [ERROR] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] processing LCO all-sky image: HTTPSConnectionPool(host='s3.us-west-2.amazonaws.com', port=443): Read timed out.
2026-05-29T21:12:43.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:12:43.332 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:12:43.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:12:43.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:12:43.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:12:43.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:12:43.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:12:43.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:12:43.354 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:12:43.354 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:12:43.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:12:43.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:12:43.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:12:43.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:12:43.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:12:43.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:12:43.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:12:43.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:12:43.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:12:43.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:12:43.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:12:43.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:12:43.688 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:12:14
2026-05-29T21:12:43.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72876, datetime.datetime(2026, 5, 29, 21, 12, 14), datetime.datetime(2026, 5, 29, 21, 12, 13), 'salt', 9.62, 69.41, None, 22.9, 30.97, 5.32, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:12:43.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:12:43.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:12:43.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:12:13, diff=30.694589s, valid=True
2026-05-29T21:12:43.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:12:43.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:12:43.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:12:12, diff=31.697437s, valid=True
2026-05-29T21:12:43.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:12:43.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:12:43.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:12:12, diff=31.704203s, valid=True
2026-05-29T21:12:43.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:12:43.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:12:43.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:12:43.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:12:43.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:12:43.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:12:43.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:12:12, diff=31.70718s, valid=True
2026-05-29T21:12:43.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:12:43.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:12:43.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:12:43.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014605.707846s, valid=True
2026-05-29T21:12:43.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:12:43.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:12:43.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:12:43.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:12:43.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:12:43.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:12:43.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:12:43.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:12:43.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:12:43.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:12:43.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:12:43.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:12:43.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:12:44.035 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:12:44.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:12:44.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:12:44.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:12:44.730 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:12:44.730 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:12:44.915 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:12:44.915 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:13:14.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:13:14.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:13:14.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:13:15.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:13:15.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:13:15.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:13:15.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T21:13:15.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:13:15.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-05-29T21:13:15.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:13:15.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:13:15.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:13:15.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-05-29T21:13:17.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T21:13:17.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:13:17.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:13:17.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:13:17.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:13:17.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:13:17.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:13:17.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:13:17.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:13:17.795 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:13:17.795 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:13:17.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:13:17.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:13:17.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:13:18.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:13:18.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:13:18.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:13:18.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:13:18.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:13:18.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:13:18.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:13:18.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:13:18.123 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:13:18.181 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:13:14
2026-05-29T21:13:18.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72878, datetime.datetime(2026, 5, 29, 21, 13, 14), datetime.datetime(2026, 5, 29, 21, 13, 14), 'salt', 9.55, 68.91, None, 22.09, 33.03, 5.41, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:13:18.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:13:18.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:13:18.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:13:14, diff=4.187859s, valid=True
2026-05-29T21:13:18.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:13:18.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:13:18.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:13:12, diff=6.190692s, valid=True
2026-05-29T21:13:18.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:13:18.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:13:18.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:13:13, diff=5.1974s, valid=True
2026-05-29T21:13:18.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:13:18.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:13:18.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:13:18.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:13:18.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:13:18.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:13:18.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:13:12, diff=6.200406s, valid=True
2026-05-29T21:13:18.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:13:18.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:13:18.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:13:18.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014640.201071s, valid=True
2026-05-29T21:13:18.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:13:18.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:13:18.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:13:18.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:13:18.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:13:18.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:13:18.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:13:18.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:13:18.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:13:18.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:13:18.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:13:18.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:13:18.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:13:18.526 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:13:18.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:13:19.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:13:19.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:13:19.205 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:13:19.205 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:13:19.426 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:13:19.426 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:13:49.439 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:13:49.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:13:49.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:13:49.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:13:49.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:13:49.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:13:49.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-05-29T21:13:49.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:13:49.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-05-29T21:13:49.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:13:49.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:13:49.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:13:49.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-05-29T21:14:27.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-05-29T21:14:27.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:14:27.190 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:14:27.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:14:27.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:14:27.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:14:27.211 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:14:27.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:14:27.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:14:27.212 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:14:27.212 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:14:27.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:14:27.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:14:27.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:14:27.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:14:27.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:14:27.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:14:27.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:14:27.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:14:27.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:14:27.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:14:27.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:14:27.462 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:14:27.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:14:15
2026-05-29T21:14:27.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72880, datetime.datetime(2026, 5, 29, 21, 14, 15), datetime.datetime(2026, 5, 29, 21, 14, 14), 'salt', 9.59, 68.74, None, 21.98, 29.98, 5.45, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:14:27.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:14:27.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:14:27.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:14:14, diff=13.527187s, valid=True
2026-05-29T21:14:27.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:14:27.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:14:27.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:14:12, diff=15.530029s, valid=True
2026-05-29T21:14:27.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:14:27.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:14:27.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:14:13, diff=14.536467s, valid=True
2026-05-29T21:14:27.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:14:27.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:14:27.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:14:27.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:14:27.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:14:27.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:14:27.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:14:12, diff=15.539455s, valid=True
2026-05-29T21:14:27.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:14:27.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:14:27.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:14:27.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014709.540126s, valid=True
2026-05-29T21:14:27.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:14:27.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:14:27.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:14:27.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:14:27.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:14:27.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:14:27.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:14:27.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:14:27.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:14:27.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:14:27.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:14:27.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:14:27.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:14:27.863 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:14:28.080 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:14:28.454 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:14:28.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:14:28.629 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:14:28.629 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:14:28.847 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:14:28.847 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:14:58.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:14:58.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:14:58.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:14:59.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:14:59.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:14:59.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:14:59.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-05-29T21:14:59.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:14:59.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-05-29T21:14:59.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:14:59.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:14:59.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:14:59.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-05-29T21:15:01.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-05-29T21:15:01.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:15:01.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:15:01.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:15:01.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:15:01.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:15:01.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:15:01.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:15:01.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:15:01.841 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:15:01.841 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:15:01.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:15:01.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:15:01.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:15:02.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:15:02.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:15:02.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:15:02.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:15:02.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:15:02.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:15:02.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:15:02.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:15:02.093 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:15:02.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:14:45
2026-05-29T21:15:02.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72881, datetime.datetime(2026, 5, 29, 21, 14, 45), datetime.datetime(2026, 5, 29, 21, 14, 45), 'salt', 9.55, 68.64, None, 22.02, 28.67, 5.47, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:15:02.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:15:02.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:15:02.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:14:45, diff=17.158498s, valid=True
2026-05-29T21:15:02.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:15:02.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:15:02.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:15:12, diff=-9.838625s, valid=True
2026-05-29T21:15:02.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:15:02.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:15:02.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:14:43, diff=19.168037s, valid=True
2026-05-29T21:15:02.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:15:02.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:15:02.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:15:02.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:15:02.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:15:02.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:15:02.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:15:12, diff=-9.828904s, valid=True
2026-05-29T21:15:02.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:15:02.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:15:02.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:15:02.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014744.171755s, valid=True
2026-05-29T21:15:02.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:15:02.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:15:02.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:15:02.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:15:02.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:15:02.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:15:02.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:15:02.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:15:02.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:15:02.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:15:02.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:15:02.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:15:02.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:15:02.487 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:15:02.702 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:15:03.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:15:03.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:15:03.150 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:15:03.150 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:15:03.235 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:15:03.235 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:15:33.260 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:15:33.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:15:33.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:15:33.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:15:33.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:15:33.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:15:33.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-05-29T21:15:33.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:15:33.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-05-29T21:15:33.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:15:33.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:15:33.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:15:33.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-05-29T21:15:38.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-05-29T21:15:38.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:15:38.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:15:38.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:15:38.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:15:38.208 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:15:38.209 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:15:38.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:15:38.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:15:38.210 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:15:38.210 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:15:38.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:15:38.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:15:38.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:15:38.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:15:38.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:15:38.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:15:38.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:15:38.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:15:38.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:15:38.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:15:38.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:15:38.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:15:38.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:15:15
2026-05-29T21:15:38.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72882, datetime.datetime(2026, 5, 29, 21, 15, 15), datetime.datetime(2026, 5, 29, 21, 15, 15), 'salt', 9.69, 68.45, None, 22.09, 28.64, 5.52, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:15:38.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:15:38.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:15:38.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:15:15, diff=23.53663s, valid=True
2026-05-29T21:15:38.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:15:38.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:15:38.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:15:12, diff=26.539481s, valid=True
2026-05-29T21:15:38.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:15:38.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:15:38.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:15:13, diff=25.546265s, valid=True
2026-05-29T21:15:38.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:15:38.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:15:38.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:15:38.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:15:38.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:15:38.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:15:38.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:15:12, diff=26.549297s, valid=True
2026-05-29T21:15:38.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:15:38.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:15:38.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:15:38.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014780.54997s, valid=True
2026-05-29T21:15:38.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:15:38.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:15:38.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:15:38.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:15:38.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:15:38.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:15:38.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:15:38.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:15:38.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:15:38.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:15:38.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:15:38.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:15:38.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:15:38.865 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:15:39.150 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:15:39.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:15:39.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:15:39.597 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:15:39.597 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:15:39.778 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:15:39.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:16:09.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:16:09.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:16:09.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:16:10.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:16:10.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:16:10.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:16:10.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-05-29T21:16:10.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:16:10.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-05-29T21:16:10.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:16:10.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:16:10.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:16:10.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-05-29T21:16:12.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-05-29T21:16:12.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:16:12.626 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:16:12.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:16:12.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:16:12.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:16:12.645 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:16:12.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:16:12.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:16:12.646 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:16:12.646 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:16:12.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:16:12.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:16:12.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:16:12.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:16:12.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:16:12.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:16:12.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:16:12.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:16:12.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:16:12.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:16:12.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:16:12.903 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:16:12.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:15:45
2026-05-29T21:16:12.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72883, datetime.datetime(2026, 5, 29, 21, 15, 45), datetime.datetime(2026, 5, 29, 21, 15, 45), 'salt', 9.69, 68.35, None, 21.59, 30.31, 5.54, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:16:12.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:16:12.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:16:12.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:15:45, diff=27.968981s, valid=True
2026-05-29T21:16:12.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:16:12.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:16:12.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:16:12, diff=0.971804s, valid=True
2026-05-29T21:16:12.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:16:12.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:16:12.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:15:44, diff=28.97855s, valid=True
2026-05-29T21:16:12.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:16:12.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:16:12.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:16:12.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:16:12.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:16:12.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:16:12.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:16:12, diff=0.981575s, valid=True
2026-05-29T21:16:12.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:16:12.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:16:12.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:16:12.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014814.982268s, valid=True
2026-05-29T21:16:12.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:16:12.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:16:12.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:16:12.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:16:12.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:16:13.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:16:13.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:16:13.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:16:13.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:16:13.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:16:13.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:16:13.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:16:13.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:16:13.303 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:16:13.516 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:16:13.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:16:13.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:16:13.964 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:16:13.964 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:16:14.235 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:16:14.235 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:16:44.265 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:16:44.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:16:44.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:16:44.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:16:44.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:16:44.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:16:44.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-05-29T21:16:44.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:16:44.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-05-29T21:16:44.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:16:44.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:16:44.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:16:44.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-05-29T21:16:48.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-05-29T21:16:48.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:16:48.843 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:16:48.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:16:48.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:16:48.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:16:48.864 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:16:48.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:16:48.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:16:48.864 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:16:48.864 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:16:48.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:16:48.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:16:48.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:16:49.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:16:49.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:16:49.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:16:49.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:16:49.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:16:49.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:16:49.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:16:49.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:16:49.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:16:49.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:16:46
2026-05-29T21:16:49.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72885, datetime.datetime(2026, 5, 29, 21, 16, 46), datetime.datetime(2026, 5, 29, 21, 16, 45), 'salt', 9.72, 67.75, None, 22.02, 28.17, 5.67, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:16:49.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:16:49.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:16:49.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:16:45, diff=4.183353s, valid=True
2026-05-29T21:16:49.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:16:49.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:16:49.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:17:12, diff=-22.813808s, valid=True
2026-05-29T21:16:49.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:16:49.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:16:49.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:16:44, diff=5.192977s, valid=True
2026-05-29T21:16:49.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:16:49.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:16:49.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:16:49.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:16:49.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:16:49.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:16:49.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:17:12, diff=-22.803981s, valid=True
2026-05-29T21:16:49.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:16:49.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:16:49.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:16:49.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014851.19669s, valid=True
2026-05-29T21:16:49.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:16:49.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:16:49.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:16:49.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:16:49.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:16:49.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:16:49.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:16:49.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:16:49.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:16:49.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:16:49.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:16:49.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:16:49.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:16:49.515 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:16:49.797 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:16:50.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:16:50.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:16:50.262 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:16:50.262 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:16:50.441 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:16:50.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:17:20.471 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:17:20.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:17:20.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:17:20.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:17:20.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:17:20.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:17:20.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-05-29T21:17:20.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:17:20.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-05-29T21:17:20.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:17:20.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:17:20.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:17:20.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-05-29T21:17:23.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-05-29T21:17:23.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:17:23.522 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:17:23.522 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:17:23.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:17:23.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:17:23.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:17:23.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:17:23.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:17:23.543 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:17:23.543 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:17:23.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:17:23.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:17:23.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:17:23.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:17:23.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:17:23.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:17:23.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:17:23.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:17:23.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:17:23.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:17:23.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:17:23.802 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:17:23.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:17:16
2026-05-29T21:17:23.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72886, datetime.datetime(2026, 5, 29, 21, 17, 16), datetime.datetime(2026, 5, 29, 21, 17, 16), 'salt', 9.72, 67.65, None, 22.65, 30.31, 5.69, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:17:23.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:17:23.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:17:23.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:17:16, diff=7.869534s, valid=True
2026-05-29T21:17:23.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:17:23.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:17:23.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:17:12, diff=11.872403s, valid=True
2026-05-29T21:17:23.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:17:23.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:17:23.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:17:14, diff=9.879088s, valid=True
2026-05-29T21:17:23.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:17:23.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:17:23.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:17:23.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:17:23.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:17:23.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:17:23.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:17:12, diff=11.882124s, valid=True
2026-05-29T21:17:23.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:17:23.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:17:23.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:17:23.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014885.882789s, valid=True
2026-05-29T21:17:23.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:17:23.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:17:23.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:17:23.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:17:23.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:17:23.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:17:23.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:17:23.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:17:23.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:17:24.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:17:24.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:17:24.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:17:24.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:17:24.199 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:17:24.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:17:24.756 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:17:24.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:17: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-05-29T21:17: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-05-29T21:17:25.048 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:17:25.048 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:17:55.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:17:55.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:17:55.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:17:55.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:17:55.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:17:55.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:17:55.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-05-29T21:17:55.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:17:55.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-05-29T21:17:55.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:17:55.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:17:55.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:17:55.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-05-29T21:17:57.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-05-29T21:17:57.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:17:57.919 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:17:57.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:17:57.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:17:57.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:17:57.940 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:17:57.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:17:57.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:17:57.941 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:17:57.941 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:17:57.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:17:58.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:17:58.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:17:58.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:17:58.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:17:58.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:17:58.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:17:58.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:17:58.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:17:58.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:17:58.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:17:58.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:17:58.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:17:46
2026-05-29T21:17:58.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72887, datetime.datetime(2026, 5, 29, 21, 17, 46), datetime.datetime(2026, 5, 29, 21, 17, 46), 'salt', 9.72, 67.55, None, 21.7, 28.78, 5.71, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:17:58.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:17:58.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:17:58.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:17:46, diff=12.252641s, valid=True
2026-05-29T21:17:58.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:17:58.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:17:58.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:18:12, diff=-13.744551s, valid=True
2026-05-29T21:17:58.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:17:58.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:17:58.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:17:45, diff=13.262154s, valid=True
2026-05-29T21:17:58.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:17:58.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:17:58.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:17:58.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:17:58.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:17:58.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:17:58.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:18:12, diff=-13.734811s, valid=True
2026-05-29T21:17:58.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:17:58.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:17:58.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:17:58.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1014920.265854s, valid=True
2026-05-29T21:17:58.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:17:58.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:17:58.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:17:58.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:17:58.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:17:58.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:17:58.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:17:58.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:17:58.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:17:58.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:17:58.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:17:58.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:17:58.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:17:58.654 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:17:58.871 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:17:59.221 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:17:59.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:17: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-05-29T21:17: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-05-29T21:17:59.518 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:17:59.518 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:18:29.548 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:18:29.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:18:29.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:18:29.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:18:29.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:18:30.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:18:30.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-05-29T21:18:30.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:18:30.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-05-29T21:18:30.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:18:30.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:18:30.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:18:30.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-05-29T21:19:52.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T21:19:52.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:19:52.993 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:19:52.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:19:53.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:19:53.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:19:53.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:19:53.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:19:53.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:19:53.015 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:19:53.015 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:19:53.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:19:53.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:19:53.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:19:53.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:19:53.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:19:53.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:19:53.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:19:53.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:19:53.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:19:53.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:19:53.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:19:53.274 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:19:53.334 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:19:47
2026-05-29T21:19:53.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72891, datetime.datetime(2026, 5, 29, 21, 19, 47), datetime.datetime(2026, 5, 29, 21, 19, 47), 'salt', 9.79, 67.28, None, 22.58, 28.93, 5.77, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:19:53.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:19:53.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:19:53.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:19:47, diff=6.340217s, valid=True
2026-05-29T21:19:53.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:19:53.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:19:53.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:20:12, diff=-18.656959s, valid=True
2026-05-29T21:19:53.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:19:53.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:19:53.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:19:45, diff=8.34987s, valid=True
2026-05-29T21:19:53.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:19:53.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:19:53.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:19:53.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:19:53.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:19:53.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:19:53.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:20:12, diff=-18.647138s, valid=True
2026-05-29T21:19:53.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:19:53.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:19:53.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:19:53.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015035.353519s, valid=True
2026-05-29T21:19:53.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:19:53.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:19:53.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:19:53.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:19:53.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:19:53.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:19:53.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:19:53.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:19:53.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:19:53.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:19:53.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:19:53.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:19:53.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:19:53.670 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:19:53.883 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:19:54.231 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:19:54.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:19:54.333 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:19:54.333 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:19:54.526 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:19:54.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:20:24.556 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:20:24.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:20:24.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:20:24.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:20:24.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:20:25.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:20:25.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-05-29T21:20:25.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:20:25.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-05-29T21:20:25.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:20:25.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:20:25.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:20:25.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-05-29T21:20:27.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-05-29T21:20:27.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:20:27.671 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:20:27.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:20:27.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:20:27.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:20:27.692 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:20:27.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:20:27.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:20:27.692 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:20:27.692 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:20:27.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:20:27.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:20:27.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:20:27.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:20:27.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:20:27.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:20:27.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:20:27.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:20:27.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:20:27.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:20:27.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:20:27.947 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:20:28.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:20:17
2026-05-29T21:20:28.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72892, datetime.datetime(2026, 5, 29, 21, 20, 17), datetime.datetime(2026, 5, 29, 21, 20, 17), 'salt', 9.69, 67.25, None, 22.62, 28.55, 5.77, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:20:28.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:20:28.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:20:28.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:20:17, diff=11.013833s, valid=True
2026-05-29T21:20:28.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:20:28.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:20:28.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:20:12, diff=16.016674s, valid=True
2026-05-29T21:20:28.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:20:28.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:20:28.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:20:16, diff=12.023293s, valid=True
2026-05-29T21:20:28.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:20:28.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:20:28.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:20:28.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:20:28.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:20:28.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:20:28.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:20:12, diff=16.026351s, valid=True
2026-05-29T21:20:28.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:20:28.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:20:28.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:20:28.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015070.027019s, valid=True
2026-05-29T21:20:28.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:20:28.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:20:28.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:20:28.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:20:28.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:20:28.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:20:28.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:20:28.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:20:28.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:20:28.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:20:28.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:20:28.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:20:28.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:20:28.422 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:20:28.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:20:28.986 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:20:29.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:20:29.086 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:20:29.086 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:20:29.267 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:20:29.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:20:59.297 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:20:59.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:20:59.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:20:59.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:20:59.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:20:59.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:20:59.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-05-29T21:20:59.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:20:59.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-05-29T21:20:59.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:20:59.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:20:59.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:20:59.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-05-29T21:21:02.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-05-29T21:21:02.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:21:02.100 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:21:02.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:21:02.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:21:02.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:21:02.128 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:21:02.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:21:02.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:21:02.128 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:21:02.128 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:21:02.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:21:02.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:21:02.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:21:02.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:21:02.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:21:02.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:21:02.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:21:02.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:21:02.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:21:02.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:21:02.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:21:02.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:21:02.438 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:20:48
2026-05-29T21:21:02.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72893, datetime.datetime(2026, 5, 29, 21, 20, 48), datetime.datetime(2026, 5, 29, 21, 20, 47), 'salt', 9.72, 67.32, None, 21.56, 26.95, 5.75, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:21:02.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:21:02.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:21:02.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:20:47, diff=15.444286s, valid=True
2026-05-29T21:21:02.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:21:02.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:21:02.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:21:12, diff=-9.552914s, valid=True
2026-05-29T21:21:02.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:21:02.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:21:02.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:20:46, diff=16.453815s, valid=True
2026-05-29T21:21:02.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:21:02.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:21:02.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:21:02.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:21:02.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:21:02.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:21:02.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:21:12, diff=-9.543182s, valid=True
2026-05-29T21:21:02.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:21:02.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:21:02.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:21:02.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015104.457464s, valid=True
2026-05-29T21:21:02.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:21:02.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:21:02.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:21:02.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:21:02.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:21:02.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:21:02.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:21:02.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:21:02.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:21:02.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:21:02.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:21:02.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:21:02.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:21:02.772 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:21:02.986 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:21:03.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:21:03.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:21: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-05-29T21:21: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-05-29T21:21:03.685 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:21:03.685 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:21:33.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:21:33.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:21:33.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:21:33.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:21:33.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:21:34.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:21:34.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-05-29T21:21:34.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:21:34.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-05-29T21:21:34.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:21:34.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:21:34.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:21:34.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-05-29T21:21:40.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-05-29T21:21:40.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:21:40.447 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:21:40.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:21:40.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:21:40.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:21:40.465 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:21:40.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:21:40.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:21:40.466 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:21:40.466 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:21:40.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:21:40.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:21:40.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:21:40.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:21:40.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:21:40.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:21:40.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:21:40.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:21:40.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:21:40.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:21:40.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:21:40.723 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:21:40.791 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:21:18
2026-05-29T21:21:40.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72894, datetime.datetime(2026, 5, 29, 21, 21, 18), datetime.datetime(2026, 5, 29, 21, 21, 17), 'salt', 9.75, 67.25, None, 22.37, 27.87, 5.77, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:21:40.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:21:40.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:21:40.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:21:17, diff=23.797276s, valid=True
2026-05-29T21:21:40.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:21:40.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:21:40.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:21:12, diff=28.800125s, valid=True
2026-05-29T21:21:40.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:21:40.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:21:40.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:21:16, diff=24.806803s, valid=True
2026-05-29T21:21:40.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:21:40.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:21:40.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:21:40.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:21:40.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:21:40.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:21:40.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:21:12, diff=28.809823s, valid=True
2026-05-29T21:21:40.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:21:40.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:21:40.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:21:40.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015142.810478s, valid=True
2026-05-29T21:21:40.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:21:40.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:21:40.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:21:40.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:21:40.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:21:40.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:21:40.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:21:40.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:21:40.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:21:41.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:21:41.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:21:41.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:21:41.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:21:41.194 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:21:41.407 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:21:41.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:21:41.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:21:41.857 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:21:41.857 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:21:42.043 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:21:42.043 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:22:12.043 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:22:12.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:22:12.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:22:12.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:22:12.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:22:12.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:22:12.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-05-29T21:22:12.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:22: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-05-29T21:22:12.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:22:12.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:22:12.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:22:12.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-05-29T21:22:47.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-05-29T21:22:47.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:22:47.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:22:47.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:22:47.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:22:47.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:22:47.507 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:22:47.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:22:47.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:22:47.507 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:22:47.507 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:22:47.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:22:47.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:22:47.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:22:47.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:22:47.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:22:47.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:22:47.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:22:47.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:22:47.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:22:47.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:22:47.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:22:47.769 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:22:47.827 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:22:18
2026-05-29T21:22:47.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72896, datetime.datetime(2026, 5, 29, 21, 22, 18), datetime.datetime(2026, 5, 29, 21, 22, 18), 'salt', 9.75, 67.22, None, 22.34, 25.45, 5.77, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:22:47.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:22:47.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:22:47.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:22:18, diff=29.834274s, valid=True
2026-05-29T21:22:47.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:22:47.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:22:47.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:22:12, diff=35.83716s, valid=True
2026-05-29T21:22:47.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:22:47.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:22:47.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:22:17, diff=30.843916s, valid=True
2026-05-29T21:22:47.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:22:47.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:22:47.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:22:47.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:22:47.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:22:47.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:22:47.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:22:12, diff=35.846998s, valid=True
2026-05-29T21:22:47.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:22:47.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:22:47.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:22:47.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015209.847677s, valid=True
2026-05-29T21:22:47.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:22:47.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:22:47.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:22:47.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:22:47.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:22:47.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:22:47.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:22:47.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:22:47.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:22:47.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:22:48.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:22:48.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:22:48.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:22:48.168 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:22:48.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:22:48.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:22:48.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:22:48.849 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:22:48.849 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:22:49.104 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:22:49.105 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:23:19.130 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:23:19.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:23:19.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:23:19.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:23:19.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:23:19.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:23:19.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-05-29T21:23:19.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:23:19.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-05-29T21:23:19.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:23:19.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:23:19.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:23:19.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-05-29T21:23:22.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-05-29T21:23:22.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:23:22.114 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:23:22.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:23:22.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:23:22.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:23:22.134 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:23:22.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:23:22.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:23:22.135 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:23:22.135 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:23:22.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:23:22.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:23:22.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:23:22.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:23:22.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:23:22.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:23:22.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:23:22.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:23:22.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:23:22.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:23:22.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:23:22.463 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:23:22.522 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:23:19
2026-05-29T21:23:22.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72898, datetime.datetime(2026, 5, 29, 21, 23, 19), datetime.datetime(2026, 5, 29, 21, 23, 18), 'salt', 9.72, 67.35, None, 22.09, 26.86, 5.75, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:23:22.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:23:22.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:23:22.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:23:18, diff=4.529551s, valid=True
2026-05-29T21:23:22.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:23:22.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:23:22.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:23:12, diff=10.53238s, valid=True
2026-05-29T21:23:22.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:23:22.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:23:22.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:23:17, diff=5.539298s, valid=True
2026-05-29T21:23:22.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:23:22.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:23:22.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:23:22.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:23:22.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:23:22.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:23:22.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:23:12, diff=10.542352s, valid=True
2026-05-29T21:23:22.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:23:22.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:23:22.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:23:22.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015244.543017s, valid=True
2026-05-29T21:23:22.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:23:22.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:23:22.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:23:22.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:23:22.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:23:22.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:23:22.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:23:22.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:23:22.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:23:22.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:23:22.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:23:22.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:23:22.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:23:22.869 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:23:23.094 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:23:23.463 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:23:23.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:23:23.571 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:23:23.571 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:23:23.765 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:23:23.765 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:23:53.795 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:23:53.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:23:53.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:23:54.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:23:54.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:23:54.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:23:54.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-05-29T21:23:54.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:23:54.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-05-29T21:23:54.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:23:54.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:23:54.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:23:54.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T21:23: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-05-29T21:23:56.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:23:56.619 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:23:56.619 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:23:56.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:23:56.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:23:56.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:23:56.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:23:56.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:23:56.640 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:23:56.640 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:23:56.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:23:56.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:23:56.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:23:56.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:23:56.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:23:56.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:23:56.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:23:56.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:23:56.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:23:56.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:23:56.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:23:56.894 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:23:56.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:23:49
2026-05-29T21:23:56.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72899, datetime.datetime(2026, 5, 29, 21, 23, 49), datetime.datetime(2026, 5, 29, 21, 23, 48), 'salt', 9.79, 67.42, None, 21.95, 25.4, 5.74, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:23:56.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:23:56.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:23:56.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:23:48, diff=8.959997s, valid=True
2026-05-29T21:23:56.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:23:56.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:23:56.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:24:12, diff=-15.037157s, valid=True
2026-05-29T21:23:56.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:23:56.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:23:56.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:23:47, diff=9.9697s, valid=True
2026-05-29T21:23:56.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:23:56.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:23:56.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:23:56.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:23:56.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:23:56.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:23:56.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:24:12, diff=-15.027243s, valid=True
2026-05-29T21:23:56.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:23:56.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:23:56.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:23:56.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015278.973424s, valid=True
2026-05-29T21:23:56.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:23:56.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:23:56.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:23:56.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:23:56.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:23:57.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:23:57.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:23:57.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:23:57.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:23:57.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:23:57.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:23:57.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:23:57.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:23:57.293 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:23:57.508 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:23:57.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:23:57.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:23:57.959 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:23:57.959 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:23:58.148 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:23:58.148 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:24:28.178 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:24:28.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:24:28.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:24:28.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:24:28.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:24:28.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:24:28.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-05-29T21:24:28.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:24:28.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-05-29T21:24:28.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:24:28.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:24:28.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:24:28.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-05-29T21:24:31.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-05-29T21:24:31.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:24:31.020 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:24:31.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:24:31.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:24:31.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:24:31.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:24:31.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:24:31.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:24:31.041 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:24:31.041 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:24:31.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:24:31.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:24:31.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:24:31.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:24:31.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:24:31.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:24:31.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:24:31.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:24:31.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:24:31.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:24:31.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:24:31.301 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:24:31.359 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:24:19
2026-05-29T21:24:31.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72900, datetime.datetime(2026, 5, 29, 21, 24, 19), datetime.datetime(2026, 5, 29, 21, 24, 19), 'salt', 9.72, 67.45, None, 22.79, 27.87, 5.73, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:24:31.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:24:31.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:24:31.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:24:19, diff=12.365667s, valid=True
2026-05-29T21:24:31.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:24:31.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:24:31.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:24:12, diff=19.36853s, valid=True
2026-05-29T21:24:31.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:24:31.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:24:31.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:24:18, diff=13.375341s, valid=True
2026-05-29T21:24:31.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:24:31.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:24:31.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:24:31.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:24:31.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:24:31.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:24:31.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:24:12, diff=19.378422s, valid=True
2026-05-29T21:24:31.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:24:31.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:24:31.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:24:31.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015313.379104s, valid=True
2026-05-29T21:24:31.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:24:31.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:24:31.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:24:31.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:24:31.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:24:31.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:24:31.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:24:31.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:24:31.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:24:31.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:24:31.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:24:31.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:24:31.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:24:31.707 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:24:31.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:24:32.315 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:24:32.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:24:32.418 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:24:32.418 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:24:32.604 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:24:32.604 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:25:02.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:25:02.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:25:02.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:25:02.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:25:02.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:25:03.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:25:03.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-05-29T21:25:03.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:25:03.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T21:25:03.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:25:03.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:25:03.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:25:03.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-05-29T21:25:05.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-05-29T21:25:05.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:25:05.335 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:25:05.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:25:05.345 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:25:05.357 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:25:05.357 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:25:05.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:25:05.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:25:05.357 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:25:05.358 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:25:05.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:25:05.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:25:05.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:25:05.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:25:05.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:25:05.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:25:05.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:25:05.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:25:05.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:25:05.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:25:05.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:25:05.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:25:05.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:24:49
2026-05-29T21:25:05.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72901, datetime.datetime(2026, 5, 29, 21, 24, 49), datetime.datetime(2026, 5, 29, 21, 24, 49), 'salt', 9.65, 67.39, None, 22.12, 27.89, 5.73, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:25:05.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:25:05.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:25:05.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:24:49, diff=16.682837s, valid=True
2026-05-29T21:25:05.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:25:05.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:25:05.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:25:12, diff=-6.314388s, valid=True
2026-05-29T21:25:05.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:25:05.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:25:05.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:24:48, diff=17.695939s, valid=True
2026-05-29T21:25:05.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:25:05.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:25:05.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:25:05.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:25:05.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:25:05.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:25:05.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:25:12, diff=-6.299153s, valid=True
2026-05-29T21:25:05.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:25:05.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:25:05.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:25:05.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015347.701951s, valid=True
2026-05-29T21:25:05.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:25:05.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:25:05.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:25:05.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:25:05.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:25:05.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:25:05.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:25:05.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:25:05.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:25:05.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:25:05.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:25:05.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:25:05.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:25:06.030 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:25:06.271 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:25:06.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:25:06.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:25: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-05-29T21:25: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-05-29T21:25:07.034 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:25:07.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:25:37.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:25:37.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:25:37.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:25:37.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:25:37.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:25:37.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:25:37.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-05-29T21:25:37.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:25:37.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T21:25:37.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:25:37.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:25:37.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:25:37.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-05-29T21:25:40.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-05-29T21:25:40.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:25:40.154 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:25:40.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:25:40.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:25:40.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:25:40.178 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:25:40.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:25:40.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:25:40.179 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:25:40.179 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:25:40.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:25:40.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:25:40.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:25:40.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:25:40.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:25:40.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:25:40.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:25:40.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:25:40.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:25:40.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:25:40.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:25:40.454 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:25:40.512 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:25:19
2026-05-29T21:25:40.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72902, datetime.datetime(2026, 5, 29, 21, 25, 19), datetime.datetime(2026, 5, 29, 21, 25, 19), 'salt', 9.72, 67.39, None, 22.02, 28.34, 5.74, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:25:40.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:25:40.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:25:40.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:25:19, diff=21.51883s, valid=True
2026-05-29T21:25:40.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:25:40.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:25:40.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:25:12, diff=28.5217s, valid=True
2026-05-29T21:25:40.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:25:40.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:25:40.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:25:18, diff=22.531975s, valid=True
2026-05-29T21:25:40.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:25:40.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:25:40.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:25:40.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:25:40.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:25:40.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:25:40.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:25:12, diff=28.535034s, valid=True
2026-05-29T21:25:40.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:25:40.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:25:40.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:25:40.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015382.535697s, valid=True
2026-05-29T21:25:40.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:25:40.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:25:40.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:25:40.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:25:40.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:25:40.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:25:40.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:25:40.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:25:40.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:25:40.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:25:40.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:25:40.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:25:40.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:25:40.862 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:25:41.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:25:41.449 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:25:41.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:25:41.550 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:25:41.550 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:25:41.738 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:25:41.738 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:26:11.760 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:26:11.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:26:11.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:26:12.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:26:12.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:26:12.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:26:12.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-05-29T21:26:12.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:26:12.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-05-29T21:26:12.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:26:12.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:26:12.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:26:12.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-05-29T21:26:15.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-05-29T21:26:15.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:26:15.432 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:26:15.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:26:15.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:26:15.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:26:15.454 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:26:15.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:26:15.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:26:15.454 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:26:15.454 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:26:15.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:26:15.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:26:15.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:26:15.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:26:15.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:26:15.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:26:15.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:26:15.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:26:15.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:26:15.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:26:15.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:26:15.732 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:26:15.791 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:25:50
2026-05-29T21:26:15.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72903, datetime.datetime(2026, 5, 29, 21, 25, 50), datetime.datetime(2026, 5, 29, 21, 25, 49), 'salt', 9.59, 67.45, None, 22.65, 25.87, 5.72, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:26:15.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:26:15.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:26:15.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:25:49, diff=26.797768s, valid=True
2026-05-29T21:26:15.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:26:15.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:26:15.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:26:12, diff=3.800625s, valid=True
2026-05-29T21:26:15.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:26:15.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:26:15.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:25:48, diff=27.807373s, valid=True
2026-05-29T21:26:15.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:26:15.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:26:15.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:26:15.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:26:15.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:26:15.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:26:15.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:26:12, diff=3.81043s, valid=True
2026-05-29T21:26:15.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:26:15.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:26:15.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:26:15.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015417.8111s, valid=True
2026-05-29T21:26:15.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:26:15.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:26:15.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:26:15.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:26:15.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:26:15.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:26:15.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:26:15.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:26:15.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:26:15.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:26:16.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:26:16.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:26:16.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:26:16.222 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:26:16.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:26:16.814 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:26:16.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:26:16.914 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:26:16.914 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:26:17.179 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:26:17.180 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:26:47.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:26:47.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:26:47.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:26:47.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:26:47.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:26:47.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:26:47.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-05-29T21:26:47.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:26:47.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-05-29T21:26:47.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:26:47.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:26:47.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:26:47.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-05-29T21:28:00.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T21:28:00.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:28:00.048 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:28:00.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:28:00.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:28:00.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:28:00.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:28:00.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:28:00.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:28:00.070 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:28:00.070 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:28:00.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:28:00.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:28:00.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:28:00.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:28:00.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:28:00.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:28:00.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:28:00.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:28:00.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:28:00.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:28:00.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:28:00.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:28:00.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:27:51
2026-05-29T21:28:00.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72907, datetime.datetime(2026, 5, 29, 21, 27, 51), datetime.datetime(2026, 5, 29, 21, 27, 50), 'salt', 9.66, 67.52, None, 22.23, 28.2, 5.71, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:28:00.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:28:00.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:28:00.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:27:50, diff=10.391573s, valid=True
2026-05-29T21:28:00.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:28:00.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:28:00.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:28:12, diff=-11.604878s, valid=True
2026-05-29T21:28:00.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:28:00.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:28:00.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:27:49, diff=11.401949s, valid=True
2026-05-29T21:28:00.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:28:00.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:28:00.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:28:00.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:28:00.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:28:00.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:28:00.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:28:12, diff=-11.594939s, valid=True
2026-05-29T21:28:00.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:28:00.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:28:00.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:28:00.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015522.40573s, valid=True
2026-05-29T21:28:00.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:28:00.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:28:00.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:28:00.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:28:00.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:28:00.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:28:00.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:28:00.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:28:00.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:28:00.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:28:00.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:28:00.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:28:00.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:28:00.740 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:28:00.964 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:28:01.319 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:28:01.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:28:01.425 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:28:01.425 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:28:01.615 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:28:01.615 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:28:31.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:28:31.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:28:31.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:28:32.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:28:32.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:28:32.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:28:32.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T21:28:32.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:28:32.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-05-29T21:28:32.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:28:32.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:28:32.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:28:32.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-05-29T21:28:34.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-05-29T21:28:34.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:28:34.868 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:28:34.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:28:34.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:28:34.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:28:34.889 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:28:34.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:28:34.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:28:34.889 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:28:34.889 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:28:34.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:28:34.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:28:34.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:28:35.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:28:35.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:28:35.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:28:35.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:28:35.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:28:35.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:28:35.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:28:35.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:28:35.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:28:35.213 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:28:21
2026-05-29T21:28:35.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72908, datetime.datetime(2026, 5, 29, 21, 28, 21), datetime.datetime(2026, 5, 29, 21, 28, 20), 'salt', 9.56, 67.49, None, 23.32, 29.3, 5.72, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:28:35.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:28:35.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:28:35.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:28:20, diff=15.219709s, valid=True
2026-05-29T21:28:35.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:28:35.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:28:35.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:28:12, diff=23.22251s, valid=True
2026-05-29T21:28:35.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:28:35.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:28:35.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:28:19, diff=16.229301s, valid=True
2026-05-29T21:28:35.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:28:35.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:28:35.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:28:35.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:28:35.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:28:35.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:28:35.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:28:12, diff=23.232345s, valid=True
2026-05-29T21:28:35.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:28:35.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:28:35.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:28:35.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015557.233017s, valid=True
2026-05-29T21:28:35.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:28:35.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:28:35.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:28:35.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:28:35.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:28:35.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:28:35.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:28:35.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:28:35.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:28:35.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:28:35.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:28:35.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:28:35.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:28:35.635 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:28:35.855 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:28:36.263 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:28:36.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:28:36.366 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:28:36.366 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:28:36.629 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:28:36.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:29:06.660 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:29:06.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:29:06.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:29:06.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:29:06.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:29:07.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:29:07.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-05-29T21:29:07.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:29:07.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-05-29T21:29:07.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:29:07.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:29:07.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:29:07.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-05-29T21:29:10.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-05-29T21:29:10.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:29:10.864 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:29:10.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:29:10.874 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:29:10.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:29:10.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:29:10.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:29:10.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:29:10.886 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:29:10.886 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:29:10.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:29:10.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:29:10.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:29:11.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:29:11.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:29:11.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:29:11.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:29:11.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:29:11.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:29:11.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:29:11.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:29:11.143 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:29:11.202 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:28:51
2026-05-29T21:29:11.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72909, datetime.datetime(2026, 5, 29, 21, 28, 51), datetime.datetime(2026, 5, 29, 21, 28, 51), 'salt', 9.59, 67.32, None, 23.18, 29.68, 5.75, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:29:11.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:29:11.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:29:11.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:28:51, diff=20.208243s, valid=True
2026-05-29T21:29:11.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:29:11.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:29:11.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:29:12, diff=-0.788922s, valid=True
2026-05-29T21:29:11.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:29:11.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:29:11.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:28:49, diff=22.218011s, valid=True
2026-05-29T21:29:11.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:29:11.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:29:11.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:29:11.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:29:11.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:29:11.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:29:11.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:29:12, diff=-0.778927s, valid=True
2026-05-29T21:29:11.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:29:11.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:29:11.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:29:11.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015593.221749s, valid=True
2026-05-29T21:29:11.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:29:11.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:29:11.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:29:11.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:29:11.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:29:11.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:29:11.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:29:11.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:29:11.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:29:11.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:29:11.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:29:11.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:29:11.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:29:11.551 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:29:11.766 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:29:12.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:29:12.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:29:12.229 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:29:12.229 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:29:12.502 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:29:12.502 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:29:42.532 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:29:42.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:29:42.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:29:42.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:29:42.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:29:43.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:29:43.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-05-29T21:29:43.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:29:43.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-05-29T21:29:43.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:29:43.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:29:43.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:29: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-05-29T21:30: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-05-29T21:30:28.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:30:28.839 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:30:28.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:30:28.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:30:28.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:30:28.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:30:28.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:30:28.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:30:28.860 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:30:28.860 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:30:28.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:30:28.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:30:28.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:30:29.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:30:29.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:30:29.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:30:29.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:30:29.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:30:29.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:30:29.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:30:29.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:30:29.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:30:29.175 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:30:22
2026-05-29T21:30:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72912, datetime.datetime(2026, 5, 29, 21, 30, 22), datetime.datetime(2026, 5, 29, 21, 30, 22), 'salt', 9.69, 67.25, None, 21.88, 26.95, 5.77, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:30:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:30:29.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:30:29.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:30:22, diff=7.181697s, valid=True
2026-05-29T21:30:29.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:30:29.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:30:29.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:30:12, diff=17.185359s, valid=True
2026-05-29T21:30:29.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:30:29.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:30:29.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:30:20, diff=9.19536s, valid=True
2026-05-29T21:30:29.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:30:29.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:30:29.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:30:29.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:30:29.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:30:29.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:30:29.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:30:12, diff=17.198569s, valid=True
2026-05-29T21:30:29.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:30:29.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:30:29.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:30:29.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015671.199263s, valid=True
2026-05-29T21:30:29.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:30:29.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:30:29.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:30:29.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:30:29.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:30:29.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:30:29.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:30:29.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:30:29.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:30:29.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:30:29.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:30:29.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:30:29.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:30:29.593 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:30:29.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:30:30.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:30:30.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:30:30.328 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:30:30.329 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:30:30.515 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:30:30.516 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:31:00.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:31:00.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:31:00.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:31:00.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:31:00.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:31:01.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:31:01.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-05-29T21:31:01.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:31:01.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T21:31:01.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:31:01.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:31:01.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:31:01.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-05-29T21:31:03.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-05-29T21:31:03.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:31:03.460 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:31:03.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:31:03.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:31:03.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:31:03.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:31:03.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:31:03.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:31:03.481 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:31:03.481 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:31:03.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:31:03.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:31:03.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:31:03.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:31:03.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:31:03.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:31:03.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:31:03.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:31:03.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:31:03.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:31:03.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:31:03.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:31:03.819 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:30:52
2026-05-29T21:31:03.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72913, datetime.datetime(2026, 5, 29, 21, 30, 52), datetime.datetime(2026, 5, 29, 21, 30, 52), 'salt', 9.69, 67.22, None, 22.34, 32.19, 5.78, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:31:03.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:31:03.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:31:03.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:30:52, diff=11.826866s, valid=True
2026-05-29T21:31:03.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:31:03.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:31:03.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:31:12, diff=-8.170096s, valid=True
2026-05-29T21:31:03.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:31:03.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:31:03.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:30:50, diff=13.837344s, valid=True
2026-05-29T21:31:03.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:31:03.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:31:03.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:31:03.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:31:03.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:31:03.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:31:03.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:31:12, diff=-8.15921s, valid=True
2026-05-29T21:31:03.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:31:03.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:31:03.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:31:03.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015705.841586s, valid=True
2026-05-29T21:31:03.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:31:03.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:31:03.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:31:03.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:31:03.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:31:03.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:31:03.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:31:03.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:31:03.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:31:03.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:31:04.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:31:04.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:31:04.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:31:04.224 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:31:04.453 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:31:04.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:31:04.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:31:04.949 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:31:04.949 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:31:05.206 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:31:05.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:31:35.236 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:31:35.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:31:35.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:31:35.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:31:35.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:31:35.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:31: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-05-29T21:31:35.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:31:35.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-05-29T21:31:35.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:31:35.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:31:35.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:31:35.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-05-29T21:31:38.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-05-29T21:31:38.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:31:38.132 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:31:38.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:31:38.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:31:38.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:31:38.152 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:31:38.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:31:38.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:31:38.152 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:31:38.152 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:31:38.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:31:38.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:31:38.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:31:38.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:31:38.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:31:38.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:31:38.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:31:38.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:31:38.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:31:38.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:31:38.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:31:38.409 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:31:38.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:31:22
2026-05-29T21:31:38.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72914, datetime.datetime(2026, 5, 29, 21, 31, 22), datetime.datetime(2026, 5, 29, 21, 31, 22), 'salt', 9.62, 67.05, None, 23.01, 31.01, 5.81, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:31:38.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:31:38.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:31:38.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:31:22, diff=16.473684s, valid=True
2026-05-29T21:31:38.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:31:38.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:31:38.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:31:12, diff=26.476467s, valid=True
2026-05-29T21:31:38.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:31:38.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:31:38.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:31:22, diff=16.48315s, valid=True
2026-05-29T21:31:38.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:31:38.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:31:38.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:31:38.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:31:38.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:31:38.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:31:38.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:31:12, diff=26.487608s, valid=True
2026-05-29T21:31:38.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:31:38.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:31:38.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:31:38.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015740.488966s, valid=True
2026-05-29T21:31:38.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:31:38.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:31:38.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:31:38.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:31:38.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:31:38.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:31:38.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:31:38.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:31:38.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:31:38.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:31:38.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:31:38.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:31:38.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:31:38.810 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:31:39.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:31:39.394 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:31:39.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:31:39.494 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:31:39.494 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:31:39.680 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:31:39.680 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:32:09.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:32:09.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:32:09.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:32:10.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:32:10.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:32:10.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:32:10.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-05-29T21:32:10.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:32:10.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-05-29T21:32:10.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:32:10.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:32:10.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:32:10.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-05-29T21:32:12.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T21:32:12.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:32:12.570 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:32:12.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:32:12.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:32:12.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:32:12.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:32:12.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:32:12.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:32:12.593 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:32:12.593 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:32:12.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:32:12.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:32:12.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:32:12.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:32:12.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:32:12.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:32:12.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:32:12.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:32:12.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:32:12.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:32:12.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:32:12.861 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:32:12.919 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:31:53
2026-05-29T21:32:12.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72915, datetime.datetime(2026, 5, 29, 21, 31, 53), datetime.datetime(2026, 5, 29, 21, 31, 52), 'salt', 9.75, 67.15, None, 22.79, 33.53, 5.79, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:32:12.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:32:12.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:32:12.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:31:52, diff=20.925596s, valid=True
2026-05-29T21:32:12.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:32:12.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:32:12.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:32:12, diff=0.928465s, valid=True
2026-05-29T21:32:12.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:32:12.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:32:12.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:31:51, diff=21.935293s, valid=True
2026-05-29T21:32:12.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:32:12.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:32:12.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:32:12.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:32:12.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:32:12.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:32:12.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:32:12, diff=0.938357s, valid=True
2026-05-29T21:32:12.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:32:12.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:32:12.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:32:12.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015774.939023s, valid=True
2026-05-29T21:32:12.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:32:12.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:32:12.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:32:12.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:32:12.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:32:12.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:32:12.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:32:12.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:32:13.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:32:13.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:32:13.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:32:13.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:32:13.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:32:13.263 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:32:13.498 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:32:13.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:32:14.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:32:14.008 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:32:14.008 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:32:14.230 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:32:14.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:32:44.254 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:32:44.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:32:44.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:32:44.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:32:44.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:32:44.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:32:44.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-05-29T21:32:44.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:32: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-05-29T21:32:44.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:32:44.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:32:44.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:32:44.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-05-29T21:32:47.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T21:32:47.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:32:47.242 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:32:47.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:32:47.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:32:47.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:32:47.263 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:32:47.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:32:47.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:32:47.264 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:32:47.264 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:32:47.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:32:47.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:32:47.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:32:47.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:32:47.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:32:47.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:32:47.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:32:47.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:32:47.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:32:47.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:32:47.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:32:47.517 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:32:47.575 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:32:23
2026-05-29T21:32:47.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72916, datetime.datetime(2026, 5, 29, 21, 32, 23), datetime.datetime(2026, 5, 29, 21, 32, 23), 'salt', 9.69, 67.12, None, 21.91, 28.43, 5.8, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:32:47.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:32:47.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:32:47.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:32:23, diff=24.581804s, valid=True
2026-05-29T21:32:47.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:32:47.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:32:47.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:32:12, diff=35.584666s, valid=True
2026-05-29T21:32:47.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:32:47.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:32:47.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:32:22, diff=25.591497s, valid=True
2026-05-29T21:32:47.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:32:47.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:32:47.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:32:47.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:32:47.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:32:47.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:32:47.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:32:12, diff=35.594548s, valid=True
2026-05-29T21:32:47.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:32:47.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:32:47.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:32:47.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015809.59525s, valid=True
2026-05-29T21:32:47.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:32:47.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:32:47.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:32:47.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:32:47.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:32:47.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:32:47.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:32:47.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:32:47.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:32:47.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:32:47.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:32:47.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:32:47.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:32:47.911 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:32:48.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:32:48.473 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:32:48.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:32:48.577 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:32:48.577 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:32:48.764 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:32:48.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:33:18.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:33:18.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:33:18.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:33:19.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:33:19.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:33:19.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:33:19.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-05-29T21:33:19.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:33:19.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-05-29T21:33:19.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:33:19.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:33:19.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:33:19.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-05-29T21:33:22.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-05-29T21:33:22.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:33:22.416 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:33:22.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:33:22.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:33:22.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:33:22.438 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:33:22.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:33:22.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:33:22.439 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:33:22.439 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:33:22.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:33:22.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:33:22.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:33:22.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:33:22.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:33:22.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:33:22.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:33:22.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:33:22.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:33:22.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:33:22.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:33:22.693 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:33:22.753 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:32:54
2026-05-29T21:33:22.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72917, datetime.datetime(2026, 5, 29, 21, 32, 54), datetime.datetime(2026, 5, 29, 21, 32, 53), 'salt', 9.69, 67.19, None, 22.69, 31.06, 5.78, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:33:22.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:33:22.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:33:22.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:32:53, diff=29.759942s, valid=True
2026-05-29T21:33:22.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:33:22.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:33:22.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:33:12, diff=10.762812s, valid=True
2026-05-29T21:33:22.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:33:22.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:33:22.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:32:52, diff=30.7695s, valid=True
2026-05-29T21:33:22.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:33:22.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:33:22.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:33:22.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:33:22.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:33:22.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:33:22.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:33:12, diff=10.77259s, valid=True
2026-05-29T21:33:22.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:33:22.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:33:22.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:33:22.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015844.773262s, valid=True
2026-05-29T21:33:22.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:33:22.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:33:22.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:33:22.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:33:22.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:33:22.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:33:22.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:33:22.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:33:22.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:33:22.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:33:22.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:33:23.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:33:23.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:33:23.092 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:33:23.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:33:23.735 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:33:23.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:33:23.837 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:33:23.837 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:33:24.095 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:33:24.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:33:54.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:33:54.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:33:54.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:33:54.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:33:54.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:33:54.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:33:54.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-05-29T21:33:54.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:33:54.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-05-29T21:33:54.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:33:54.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:33:54.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:33:54.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-05-29T21:34:18.044 [ERROR] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] processing LCO all-sky image: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
2026-05-29T21:34:18.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:34:18.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:34:18.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:34:18.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:34:18.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:34:18.066 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:34:18.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:34:18.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:34:18.067 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:34:18.067 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:34:18.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:34:18.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:34:18.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:34:18.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:34:18.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:34:18.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:34:18.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:34:18.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:34:18.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:34:18.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:34:18.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:34:18.326 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:34:18.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:33:54
2026-05-29T21:34:18.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72919, datetime.datetime(2026, 5, 29, 21, 33, 54), datetime.datetime(2026, 5, 29, 21, 33, 54), 'salt', 9.72, 67.25, None, 22.65, 31.84, 5.77, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:34:18.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:34:18.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:34:18.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:33:54, diff=24.391417s, valid=True
2026-05-29T21:34:18.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:34:18.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:34:18.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:34:12, diff=6.394259s, valid=True
2026-05-29T21:34:18.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:34:18.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:34:18.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:33:53, diff=25.400965s, valid=True
2026-05-29T21:34:18.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:34:18.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:34:18.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:34:18.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:34:18.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:34:18.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:34:18.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:34:12, diff=6.403988s, valid=True
2026-05-29T21:34:18.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:34:18.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:34:18.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:34:18.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015900.404644s, valid=True
2026-05-29T21:34:18.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:34:18.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:34:18.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:34:18.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:34:18.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:34:18.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:34:18.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:34:18.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:34:18.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:34:18.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:34:18.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:34:18.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:34:18.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:34:18.725 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:34:18.943 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:34:19.296 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:34:19.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:34:19.400 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:34:19.400 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:34:19.673 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:34:19.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:34:49.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:34:49.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:34:49.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:34:49.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:34:49.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:34:50.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:34:50.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-05-29T21:34:50.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:34:50.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-05-29T21:34:50.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:34:50.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:34:50.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:34:50.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-05-29T21:35:20.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-05-29T21:35:20.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:35:20.638 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:35:20.638 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:35:20.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:35:20.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:35:20.659 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:35:20.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:35:20.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:35:20.660 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:35:20.660 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:35:20.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:35:20.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:35:20.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:35:20.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:35:20.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:35:20.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:35:20.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:35:20.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:35:20.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:35:20.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:35:20.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:35:20.927 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:35:20.985 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:34:54
2026-05-29T21:35:20.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72921, datetime.datetime(2026, 5, 29, 21, 34, 54), datetime.datetime(2026, 5, 29, 21, 34, 54), 'salt', 9.69, 67.45, None, 21.0, 32.09, 5.73, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:35:20.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:35:20.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:35:20.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:34:54, diff=26.99214s, valid=True
2026-05-29T21:35:20.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:35:20.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:35:20.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:35:12, diff=8.995011s, valid=True
2026-05-29T21:35:20.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:35:20.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:35:21.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:34:53, diff=28.001748s, valid=True
2026-05-29T21:35:21.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:35:21.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:35:21.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:35:21.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:35:21.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:35:21.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:35:21.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:35:12, diff=9.004825s, valid=True
2026-05-29T21:35:21.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:35:21.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:35:21.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:35:21.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1015963.00549s, valid=True
2026-05-29T21:35:21.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:35:21.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:35:21.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:35:21.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:35:21.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:35:21.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:35:21.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:35:21.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:35:21.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:35:21.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:35:21.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:35:21.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:35:21.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:35:21.400 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:35:21.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:35:21.962 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:35:22.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:35:22.062 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:35:22.062 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:35:22.244 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:35:22.244 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:35:52.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:35:52.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:35:52.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:35:52.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:35:52.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:35:52.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:35:52.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-05-29T21:35:52.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:35:52.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-05-29T21:35:52.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:35:52.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:35:52.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:35:52.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-05-29T21:36:56.752 [ERROR] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] processing LCO all-sky image: HTTPSConnectionPool(host='s3.us-west-2.amazonaws.com', port=443): Read timed out.
2026-05-29T21:36:56.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:36:56.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:36:56.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:36:56.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:36:56.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:36:56.777 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:36:56.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:36:56.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:36:56.777 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:36:56.777 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:36:56.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:36:56.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:36:56.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:36:56.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:36:56.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:36:57.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:36:57.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:36:57.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:36:57.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:36:57.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:36:57.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:36:57.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:36:57.108 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:36:55
2026-05-29T21:36:57.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72925, datetime.datetime(2026, 5, 29, 21, 36, 55), datetime.datetime(2026, 5, 29, 21, 36, 55), 'salt', 9.62, 67.88, None, 20.64, 30.59, 5.63, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:36:57.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:36:57.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:36:57.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:36:55, diff=2.114401s, valid=True
2026-05-29T21:36:57.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:36:57.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:36:57.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:37:12, diff=-14.88277s, valid=True
2026-05-29T21:36:57.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:36:57.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:36:57.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:36:54, diff=3.123836s, valid=True
2026-05-29T21:36:57.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:36:57.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:36:57.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:36:57.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:36:57.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:36:57.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:36:57.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:37:12, diff=-14.87313s, valid=True
2026-05-29T21:36:57.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:36:57.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:36:57.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:36:57.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016059.127534s, valid=True
2026-05-29T21:36:57.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:36:57.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:36:57.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:36:57.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:36:57.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:36:57.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:36:57.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:36:57.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:36:57.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:36:57.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:36:57.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:36:57.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:36:57.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:36:57.446 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:36:57.662 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:36:58.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:36:58.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:36: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-05-29T21:36: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-05-29T21:36:58.410 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:36:58.410 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:37:28.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:37:28.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:37:28.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:37:28.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:37:28.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:37:28.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:37:28.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-05-29T21:37:28.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:37:28.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T21:37:28.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:37:28.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:37:28.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:37:28.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-05-29T21:37:31.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-05-29T21:37:31.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:37:31.557 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:37:31.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:37:31.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:37:31.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:37:31.579 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:37:31.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:37:31.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:37:31.580 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:37:31.580 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:37:31.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:37:31.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:37:31.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:37:31.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:37:31.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:37:31.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:37:31.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:37:31.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:37:31.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:37:31.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:37:31.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:37:31.849 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:37:31.910 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:37:26
2026-05-29T21:37:31.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72926, datetime.datetime(2026, 5, 29, 21, 37, 26), datetime.datetime(2026, 5, 29, 21, 37, 25), 'salt', 9.62, 67.95, None, 22.02, 23.48, 5.62, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:37:31.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:37:31.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:37:31.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:37:25, diff=6.916673s, valid=True
2026-05-29T21:37:31.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:37:31.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:37:31.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:37:12, diff=19.919533s, valid=True
2026-05-29T21:37:31.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:37:31.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:37:31.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:37:24, diff=7.926212s, valid=True
2026-05-29T21:37:31.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:37:31.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:37:31.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:37:31.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:37:31.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:37:31.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:37:31.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:37:12, diff=19.929281s, valid=True
2026-05-29T21:37:31.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:37:31.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:37:31.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:37:31.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016093.929952s, valid=True
2026-05-29T21:37:31.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:37:31.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:37:31.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:37:31.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:37:31.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:37:31.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:37:31.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:37:31.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:37:32.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:37:32.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:37:32.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:37:32.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:37:32.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:37:32.330 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:37:32.542 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:37:32.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:37:32.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:37:32.987 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:37:32.987 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:37:33.254 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:37:33.254 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:38:03.285 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:38:03.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:38:03.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:38:03.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:38:03.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:38:03.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:38:03.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-05-29T21:38:03.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:38:03.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-05-29T21:38:03.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:38:03.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:38:03.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:38:03.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-05-29T21:38:13.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-05-29T21:38:13.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:38:13.225 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:38:13.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:38:13.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:38:13.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:38:13.248 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:38:13.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:38:13.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:38:13.248 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:38:13.248 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:38:13.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:38:13.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:38:13.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:38:13.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:38:13.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:38:13.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:38:13.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:38:13.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:38:13.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:38:13.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:38:13.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:38:13.505 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:38:13.565 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:37:56
2026-05-29T21:38:13.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72927, datetime.datetime(2026, 5, 29, 21, 37, 56), datetime.datetime(2026, 5, 29, 21, 37, 55), 'salt', 9.55, 67.88, None, 19.27, 29.3, 5.62, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:38:13.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:38:13.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:38:13.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:37:55, diff=18.571686s, valid=True
2026-05-29T21:38:13.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:38:13.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:38:13.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:38:12, diff=1.574571s, valid=True
2026-05-29T21:38:13.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:38:13.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:38:13.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:37:54, diff=19.58132s, valid=True
2026-05-29T21:38:13.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:38:13.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:38:13.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:38:13.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:38:13.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:38:13.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:38:13.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:38:12, diff=1.584434s, valid=True
2026-05-29T21:38:13.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:38:13.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:38:13.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:38:13.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016135.58512s, valid=True
2026-05-29T21:38:13.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:38:13.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:38:13.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:38:13.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:38:13.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:38:13.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:38:13.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:38:13.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:38:13.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:38:13.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:38:13.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:38:13.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:38:13.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:38:13.906 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:38:14.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:38:14.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:38:14.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:38:14.547 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:38:14.547 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:38:14.741 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:38:14.742 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:38:44.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:38:44.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:38:44.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:38:45.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:38:45.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:38:45.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:38:45.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-05-29T21:38:45.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:38:45.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-05-29T21:38:45.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:38:45.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:38:45.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:38:45.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-05-29T21:38:49.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-05-29T21:38:49.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:38:49.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:38:49.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:38:49.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:38:49.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:38:49.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:38:49.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:38:49.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:38:49.937 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:38:49.937 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:38:49.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:38:50.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:38:50.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:38:50.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:38:50.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:38:50.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:38:50.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:38:50.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:38:50.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:38:50.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:38:50.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:38:50.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:38:50.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:38:26
2026-05-29T21:38:50.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72928, datetime.datetime(2026, 5, 29, 21, 38, 26), datetime.datetime(2026, 5, 29, 21, 38, 26), 'salt', 9.62, 68.21, None, 20.78, 28.03, 5.56, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:38:50.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:38:50.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:38:50.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:38:26, diff=24.296669s, valid=True
2026-05-29T21:38:50.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:38:50.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:38:50.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:38:12, diff=38.299553s, valid=True
2026-05-29T21:38:50.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:38:50.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:38:50.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:38:24, diff=26.306301s, valid=True
2026-05-29T21:38:50.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:38:50.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:38:50.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:38:50.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:38:50.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:38:50.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:38:50.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:38:12, diff=38.309388s, valid=True
2026-05-29T21:38:50.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:38:50.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:38:50.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:38:50.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016172.310065s, valid=True
2026-05-29T21:38:50.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:38:50.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:38:50.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:38:50.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:38:50.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:38:50.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:38:50.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:38:50.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:38:50.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:38:50.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:38:50.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:38:50.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:38:50.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:38:50.698 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:38:50.906 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:38:51.249 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:38:51.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:38:51.350 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:38:51.350 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:38:51.573 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:38:51.573 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:39:21.591 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:39:21.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:39:21.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:39:21.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:39:21.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:39:22.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:39:22.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T21:39:22.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:39:22.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-05-29T21:39:22.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:39:22.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:39:22.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:39:22.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-05-29T21:39:25.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-05-29T21:39:25.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:39:25.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:39:25.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:39:25.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:39:25.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:39:25.223 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:39:25.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:39:25.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:39:25.223 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:39:25.223 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:39:25.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:39:25.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:39:25.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:39:25.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:39:25.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:39:25.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:39:25.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:39:25.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:39:25.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:39:25.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:39:25.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:39:25.486 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:39:25.544 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:38:56
2026-05-29T21:39:25.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72929, datetime.datetime(2026, 5, 29, 21, 38, 56), datetime.datetime(2026, 5, 29, 21, 38, 56), 'salt', 9.59, 68.21, None, 20.57, 28.95, 5.56, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:39:25.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:39:25.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:39:25.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:38:56, diff=29.551124s, valid=True
2026-05-29T21:39:25.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:39:25.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:39:25.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:39:12, diff=13.554004s, valid=True
2026-05-29T21:39:25.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:39:25.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:39:25.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:38:55, diff=30.560664s, valid=True
2026-05-29T21:39:25.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:39:25.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:39:25.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:39:25.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:39:25.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:39:25.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:39:25.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:39:12, diff=13.563694s, valid=True
2026-05-29T21:39:25.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:39:25.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:39:25.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:39:25.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016207.564345s, valid=True
2026-05-29T21:39:25.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:39:25.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:39:25.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:39:25.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:39:25.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:39:25.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:39:25.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:39:25.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:39:25.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:39:25.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:39:25.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:39:25.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:39:25.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:39:25.894 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:39:26.107 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:39:26.460 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:39:26.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:39:26.562 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:39:26.562 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:39:26.797 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:39:26.797 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:39:56.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:39:56.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:39:56.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:39:57.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:39:57.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:39:57.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:39:57.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-05-29T21:39:57.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:39:57.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-05-29T21:39:57.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:39:57.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:39:57.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:39:57.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-05-29T21:40:23.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-05-29T21:40:23.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:40:23.567 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:40:23.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:40:23.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:40:23.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:40:23.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:40:23.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:40:23.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:40:23.587 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:40:23.587 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:40:23.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:40:23.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:40:23.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:40:23.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:40:23.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:40:23.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T21:40:23.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:40:23.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T21:40:23.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:40:23.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:40:23.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:40:23.842 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:40:23.901 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:39:57
2026-05-29T21:40:23.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72931, datetime.datetime(2026, 5, 29, 21, 39, 57), datetime.datetime(2026, 5, 29, 21, 39, 56), 'salt', 9.59, 67.92, None, 20.89, 34.47, 5.63, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:40:23.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:40:23.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:40:23.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:39:56, diff=27.907269s, valid=True
2026-05-29T21:40:23.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:40:23.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T21:40:23.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:40:12, diff=11.910099s, valid=True
2026-05-29T21:40:23.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:40:23.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:40:23.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:39:56, diff=27.916736s, valid=True
2026-05-29T21:40:23.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:40:23.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:40:23.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:40:23.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:40:23.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:40:23.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T21:40:23.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:40:12, diff=11.919762s, valid=True
2026-05-29T21:40:23.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:40:23.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:40:23.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:40:23.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016265.920582s, valid=True
2026-05-29T21:40:23.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:40:23.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:40:23.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:40:23.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:40:23.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:40:23.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:40:23.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:40:23.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:40:24.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:40:24.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:40:24.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:40:24.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:40:24.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:40:24.253 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:40:24.463 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:40:24.809 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:40:24.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:40:24.915 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:40:24.915 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:40:25.066 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:40:25.066 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:40:55.070 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:40:55.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:40:55.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:40:55.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:40:55.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:40:55.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:40:55.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-05-29T21:40:55.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:40: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-05-29T21:40:55.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:40:55.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:40:55.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:40:55.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-05-29T21:41:11.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T21:41:11.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:41:11.125 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:41:11.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:41:11.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:41:11.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:41:11.147 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:41:11.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:41:11.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:41:11.148 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:41:11.148 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:41:11.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:41:11.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:41:11.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:41:11.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:41:11.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:41:11.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T21:41:11.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:41:11.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T21:41:11.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:41:11.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:41:11.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:41:11.419 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:41:11.480 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:40:58
2026-05-29T21:41:11.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72933, datetime.datetime(2026, 5, 29, 21, 40, 58), datetime.datetime(2026, 5, 29, 21, 40, 58), 'salt', 9.62, 68.18, None, 22.09, 29.72, 5.57, 832.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:41:11.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:41:11.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:41:11.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:40:58, diff=13.48639s, valid=True
2026-05-29T21:41:11.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:41:11.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T21:41:11.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:41:12, diff=-0.510768s, valid=True
2026-05-29T21:41:11.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:41:11.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:41:11.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:40:55, diff=16.495917s, valid=True
2026-05-29T21:41:11.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:41:11.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:41:11.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:41:11.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:41:11.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:41:11.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T21:41:11.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:41:12, diff=-0.500987s, valid=True
2026-05-29T21:41:11.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:41:11.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:41:11.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:41:11.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016313.499675s, valid=True
2026-05-29T21:41:11.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:41:11.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:41:11.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:41:11.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:41:11.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:41:11.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:41:11.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:41:11.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:41:11.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:41:11.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:41:11.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:41:11.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:41:11.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:41:11.828 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:41:12.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:41:12.397 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:41:12.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:41:12.561 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:41:12.561 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:41:12.823 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:41:12.824 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:41:42.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:41:42.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:41:42.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:41:43.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:41:43.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:41:43.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:41:43.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-05-29T21:41:43.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:41:43.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-05-29T21:41:43.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:41:43.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:41:43.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:41:43.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T21:41:45.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-05-29T21:41:45.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:41:45.809 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:41:45.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:41:45.818 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:41:45.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:41:45.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:41:45.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:41:45.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:41:45.833 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:41:45.833 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:41:45.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:41:45.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:41:45.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:41:46.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:41:46.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:41:46.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T21:41:46.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:41:46.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T21:41:46.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:41:46.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:41:46.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:41:46.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:41:46.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:41:30
2026-05-29T21:41:46.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72934, datetime.datetime(2026, 5, 29, 21, 41, 30), datetime.datetime(2026, 5, 29, 21, 41, 28), 'salt', 9.65, 68.18, None, 20.43, 29.82, 5.57, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:41:46.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:41:46.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:41:46.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:41:28, diff=18.193547s, valid=True
2026-05-29T21:41:46.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:41:46.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T21:41:46.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:41:12, diff=34.197357s, valid=True
2026-05-29T21:41:46.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:41:46.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:41:46.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:41:26, diff=20.214071s, valid=True
2026-05-29T21:41:46.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:41:46.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:41:46.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:41:46.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:41:46.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:41:46.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T21:41:46.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:41:12, diff=34.221445s, valid=True
2026-05-29T21:41:46.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:41:46.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:41:46.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:41:46.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016348.222946s, valid=True
2026-05-29T21:41:46.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:41:46.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:41:46.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:41:46.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:41:46.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:41:46.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:41:46.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:41:46.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:41:46.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:41:46.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:41:46.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:41:46.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:41:46.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:41:46.568 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:41:46.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:41:47.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:41:47.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:41:47.217 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:41:47.217 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:41:47.382 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:41:47.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:42:17.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:42:17.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:42:17.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:42:17.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:42:17.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:42:17.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:42:17.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-05-29T21:42:17.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:42:17.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-05-29T21:42:17.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:42:17.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:42:17.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:42:17.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-05-29T21:42:20.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-05-29T21:42:20.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:42:20.233 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:42:20.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:42:20.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:42:20.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:42:20.253 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:42:20.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:42:20.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:42:20.254 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:42:20.254 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:42:20.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:42:20.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:42:20.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:42:20.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:42:20.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:42:20.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T21:42:20.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:42:20.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-29T21:42:20.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:42:20.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:42:20.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:42:20.514 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:42:20.572 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:42:00
2026-05-29T21:42:20.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72935, datetime.datetime(2026, 5, 29, 21, 42), datetime.datetime(2026, 5, 29, 21, 42), 'salt', 9.62, 68.05, None, 19.76, 31.37, 5.6, 832.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:42:20.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:42:20.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:42:20.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:00, diff=20.579051s, valid=True
2026-05-29T21:42:20.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:42:20.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T21:42:20.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:12, diff=8.581937s, valid=True
2026-05-29T21:42:20.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:42:20.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:42:20.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:41:56, diff=24.588767s, valid=True
2026-05-29T21:42:20.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:42:20.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:42:20.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:42:20.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:42:20.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:42:20.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-29T21:42:20.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:12, diff=8.59192s, valid=True
2026-05-29T21:42:20.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:42:20.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:42:20.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:42:20.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016382.592595s, valid=True
2026-05-29T21:42:20.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:42:20.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:42:20.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:42:20.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:42:20.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:42:20.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:42:20.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:42:20.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:42:20.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:42:20.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:42:20.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:42:20.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:42:20.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:42:20.912 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:42:21.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:42:21.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:42:21.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:42:21.639 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:42:21.639 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:42:21.944 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:42:21.944 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:42:51.956 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:42:51.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:42:51.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:42:52.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:42:52.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:42:52.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:42:52.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-05-29T21:42:52.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:42:52.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-05-29T21:42:52.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:42:52.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:42:52.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:42:52.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-05-29T21:42:54.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-05-29T21:42:54.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:42:54.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:42:54.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:42:54.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:42:54.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:42:54.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:42:54.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:42:54.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:42:54.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:42:54.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:42:54.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:42:54.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:42:54.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:42:54.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:42:54.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:42:54.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T21:42:54.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:42:54.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T21:42:54.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:42:54.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:42:54.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:42:54.991 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:42:55.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:42:31
2026-05-29T21:42:55.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72936, datetime.datetime(2026, 5, 29, 21, 42, 31), datetime.datetime(2026, 5, 29, 21, 42, 31), 'salt', 9.65, 68.12, None, 19.05, 31.16, 5.58, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:42:55.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:42:55.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:42:55.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:31, diff=24.060323s, valid=True
2026-05-29T21:42:55.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:42:55.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T21:42:55.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:12, diff=43.063279s, valid=True
2026-05-29T21:42:55.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:42:55.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:42:55.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:26, diff=29.071263s, valid=True
2026-05-29T21:42:55.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:42:55.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:42:55.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:42:55.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:42:55.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:42:55.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T21:42:55.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:12, diff=43.074349s, valid=True
2026-05-29T21:42:55.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:42:55.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:42:55.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:42:55.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016417.075046s, valid=True
2026-05-29T21:42:55.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:42:55.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:42:55.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:42:55.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:42:55.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:42:55.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:42:55.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:42:55.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:42:55.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:42:55.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:42:55.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:42:55.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:42:55.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:42:55.431 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:42:55.654 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:42:56.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:42:56.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:42: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-05-29T21:42: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-05-29T21:42:56.372 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:42:56.372 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:43:26.380 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:43:26.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:43:26.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:43:26.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:43:26.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:43:26.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:43:26.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-05-29T21:43:26.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:43: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-05-29T21:43:27.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:43:27.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:43:27.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:43:27.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-05-29T21:43:29.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T21:43:29.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:43:29.375 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:43:29.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:43:29.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:43:29.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:43:29.396 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:43:29.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:43:29.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:43:29.397 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:43:29.397 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:43:29.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:43:29.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:43:29.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:43:29.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:43:29.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:43:29.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T21:43:29.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:43:29.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T21:43:29.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:43:29.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:43:29.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:43:29.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:43:29.706 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:43:01
2026-05-29T21:43:29.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72937, datetime.datetime(2026, 5, 29, 21, 43, 1), datetime.datetime(2026, 5, 29, 21, 43, 1), 'salt', 9.56, 68.18, None, 20.57, 28.97, 5.57, 832.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:43:29.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:43:29.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:43:29.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:43:01, diff=28.712224s, valid=True
2026-05-29T21:43:29.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:43:29.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T21:43:29.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:12, diff=77.715047s, valid=True
2026-05-29T21:43:29.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:43:29.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:43:29.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:57, diff=32.721746s, valid=True
2026-05-29T21:43:29.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:43:29.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:43:29.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:43:29.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:43:29.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:43:29.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T21:43:29.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:12, diff=77.724741s, valid=True
2026-05-29T21:43:29.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:43:29.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:43:29.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:43:29.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016451.725383s, valid=True
2026-05-29T21:43:29.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:43:29.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:43:29.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:43:29.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:43:29.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:43:29.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:43:29.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:43:29.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:43:29.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:43:29.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:43:29.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:43:29.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:43:30.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:43:30.144 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:43:30.354 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:43:30.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:43:30.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:43:30.802 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:43:30.802 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:43:31.071 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:43:31.071 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:44:01.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:44:01.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:44:01.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:44:01.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:44:01.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:44:01.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:44:01.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-05-29T21:44:01.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:44:01.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-05-29T21:44:01.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:44:01.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:44:01.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:44:01.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-05-29T21:44:03.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-05-29T21:44:03.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:44:03.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:44:03.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:44:03.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:44:03.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:44:03.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:44:03.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:44:03.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:44:03.847 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:44:03.847 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:44:03.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:44:03.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:44:03.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:44:04.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:44:04.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:44:04.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:44:04.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:44:04.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T21:44:04.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:44:04.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:44:04.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:44:04.099 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:44:04.160 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:44:02
2026-05-29T21:44:04.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72939, datetime.datetime(2026, 5, 29, 21, 44, 2), datetime.datetime(2026, 5, 29, 21, 44, 1), 'salt', 9.59, 68.25, None, 21.59, 32.52, 5.56, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:44:04.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:44:04.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:44:04.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:44:01, diff=3.16617s, valid=True
2026-05-29T21:44:04.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:44:04.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:44:04.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:12, diff=112.168942s, valid=True
2026-05-29T21:44:04.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:44:04.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:44:04.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:43:58, diff=6.175566s, valid=True
2026-05-29T21:44:04.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:44:04.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:44:04.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:44:04.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:44:04.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:44:04.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T21:44:04.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:12, diff=112.178565s, valid=True
2026-05-29T21:44:04.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:44:04.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:44:04.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:44:04.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016486.179227s, valid=True
2026-05-29T21:44:04.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:44:04.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:44:04.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:44:04.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:44:04.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:44:04.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:44:04.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:44:04.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:44:04.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:44:04.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:44:04.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:44:04.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:44:04.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:44:04.497 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:44:04.723 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:44:05.067 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:44:05.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:44: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-05-29T21:44: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-05-29T21:44:05.356 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:44:05.357 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:44:35.383 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:44:35.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:44:35.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:44:35.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:44:35.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:44:35.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:44:35.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-05-29T21:44:35.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:44:35.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T21:44:35.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:44:35.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:44:35.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:44:35.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-05-29T21:45:13.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T21:45:13.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:45:13.570 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:45:13.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:45:13.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:45:13.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:45:13.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:45:13.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:45:13.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:45:13.593 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:45:13.593 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:45:13.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:45:13.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:45:13.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:45:13.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:45:13.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:45:13.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:45:13.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:45:13.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T21:45:13.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:45:13.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:45:13.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:45:13.847 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:45:13.906 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:45:02
2026-05-29T21:45:13.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72941, datetime.datetime(2026, 5, 29, 21, 45, 2), datetime.datetime(2026, 5, 29, 21, 45, 2), 'salt', 9.59, 68.31, None, 21.21, 27.07, 5.54, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:45:13.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:45:13.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:45:13.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:45:02, diff=11.912796s, valid=True
2026-05-29T21:45:13.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:45:13.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:45:13.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:12, diff=181.915584s, valid=True
2026-05-29T21:45:13.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:45:13.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:45:13.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:45:01, diff=12.922172s, valid=True
2026-05-29T21:45:13.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:45:13.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:45:13.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:45:13.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:45:13.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:45:13.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T21:45:13.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:12, diff=181.925321s, valid=True
2026-05-29T21:45:13.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:45:13.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:45:13.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:45:13.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016555.926007s, valid=True
2026-05-29T21:45:13.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:45:13.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:45:13.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:45:13.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:45:13.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:45:13.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:45:13.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:45:13.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:45:14.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:45:14.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:45:14.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:45:14.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:45:14.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:45:14.334 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:45:14.551 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:45:14.897 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:45:15.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:45:15.003 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:45:15.003 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:45:15.196 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:45:15.196 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:45:45.226 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:45:45.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:45:45.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:45:45.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:45:45.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:45:45.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:45:45.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-05-29T21:45:45.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:45:45.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T21:45:45.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:45:45.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:45:45.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:45:45.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-05-29T21:46:23.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-05-29T21:46:23.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:46:23.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:46:23.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:46:23.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:46:23.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:46:23.066 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:46:23.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:46:23.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:46:23.066 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:46:23.066 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:46:23.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:46:23.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:46:23.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:46:23.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:46:23.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:46:23.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T21:46:23.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:46:23.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T21:46:23.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:46:23.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:46:23.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:46:23.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:46:23.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:46:03
2026-05-29T21:46:23.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72943, datetime.datetime(2026, 5, 29, 21, 46, 3), datetime.datetime(2026, 5, 29, 21, 46, 2), 'salt', 9.52, 68.15, None, 19.41, 27.33, 5.57, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:46:23.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:46:23.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:46:23.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:46:02, diff=21.389845s, valid=True
2026-05-29T21:46:23.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:46:23.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T21:46:23.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:12, diff=251.392625s, valid=True
2026-05-29T21:46:23.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:46:23.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:46:23.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:45:58, diff=25.399162s, valid=True
2026-05-29T21:46:23.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:46:23.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:46:23.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:46:23.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:46:23.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:46:23.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T21:46:23.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:12, diff=251.402182s, valid=True
2026-05-29T21:46:23.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:46:23.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:46:23.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:46:23.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016625.402847s, valid=True
2026-05-29T21:46:23.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:46:23.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:46:23.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:46:23.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:46:23.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:46:23.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:46:23.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:46:23.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:46:23.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:46:23.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:46:23.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:46:23.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:46:23.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:46:23.738 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:46:23.956 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:46:24.311 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:46:24.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:46:24.417 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:46:24.418 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:46:24.722 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:46:24.723 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:46:54.752 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:46:54.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:46:54.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:46:55.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:46:55.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:46:55.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:46:55.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-05-29T21:46:55.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:46:55.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-05-29T21:46:55.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:46:55.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:46:55.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:46:55.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-05-29T21:47:14.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T21:47:14.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:47:14.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:47:14.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:47:14.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:47:14.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:47:14.862 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:47:14.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:47:14.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:47:14.862 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:47:14.862 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:47:14.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:47:14.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:47:14.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:47:15.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:47:15.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:47:15.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:47:15.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:47:15.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:47:15.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:47:15.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:47:15.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:47:15.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:47:15.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:47:03
2026-05-29T21:47:15.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72945, datetime.datetime(2026, 5, 29, 21, 47, 3), datetime.datetime(2026, 5, 29, 21, 47, 3), 'salt', 9.59, 68.48, None, 21.7, 30.62, 5.51, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:47:15.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:47:15.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:47:15.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:47:03, diff=12.183912s, valid=True
2026-05-29T21:47:15.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:47:15.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:47:15.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:12, diff=303.186749s, valid=True
2026-05-29T21:47:15.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:47:15.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:47:15.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:46:59, diff=16.193481s, valid=True
2026-05-29T21:47:15.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:47:15.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:47:15.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:47:15.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:47:15.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:47:15.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:47:15.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:42:12, diff=303.196499s, valid=True
2026-05-29T21:47:15.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:47:15.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:47:15.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:47:15.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016677.197174s, valid=True
2026-05-29T21:47:15.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:47:15.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:47:15.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:47:15.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:47:15.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:47:15.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:47:15.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:47:15.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:47:15.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:47:15.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:47:15.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:47:15.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:47:15.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:47:15.578 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:47:15.807 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:47:16.149 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:47:16.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:47:16.250 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:47:16.250 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:47:16.530 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:47:16.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:47:46.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:47:46.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:47:46.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:47:46.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:47:46.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:47:46.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:47:46.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-05-29T21:47:47.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:47:47.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-05-29T21:47:47.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:47:47.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:47:47.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:47:47.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-05-29T21:48:29.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-05-29T21:48:29.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:48:29.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:48:29.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:48:29.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:48:29.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:48:29.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:48:29.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:48:29.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:48:29.127 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:48:29.127 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:48:29.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:48:29.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:48:29.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:48:29.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:48:29.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:48:29.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:48:29.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:48:29.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:48:29.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:48:29.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:48:29.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:48:29.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:48:29.452 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:48:04
2026-05-29T21:48:29.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72947, datetime.datetime(2026, 5, 29, 21, 48, 4), datetime.datetime(2026, 5, 29, 21, 48, 3), 'salt', 9.55, 68.61, None, 20.08, 29.93, 5.47, 832.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:48:29.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:48:29.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:48:29.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:48:03, diff=26.45816s, valid=True
2026-05-29T21:48:29.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:48:29.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:48:29.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:48:12, diff=17.460979s, valid=True
2026-05-29T21:48:29.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:48:29.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:48:29.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:47:59, diff=30.467585s, valid=True
2026-05-29T21:48:29.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:48:29.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:48:29.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:48:29.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:48:29.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:48:29.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:48:29.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:48:12, diff=17.470575s, valid=True
2026-05-29T21:48:29.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:48:29.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:48:29.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:48:29.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016751.471265s, valid=True
2026-05-29T21:48:29.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:48:29.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:48:29.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:48:29.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:48:29.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:48:29.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:48:29.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:48:29.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:48:29.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:48:29.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:48:29.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:48:29.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:48:29.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:48:29.787 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:48:30.042 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:48:30.389 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:48:30.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:48:30.491 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:48:30.491 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:48:30.579 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:48:30.579 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:49:00.609 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:49:00.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:49:00.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:49:01.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:49:01.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:49:01.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:49:01.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-05-29T21:49:01.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:49:01.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-05-29T21:49:01.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:49:01.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:49:01.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:49:01.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-05-29T21:49:03.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-05-29T21:49:03.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:49:03.783 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:49:03.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:49:03.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:49:03.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:49:03.804 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:49:03.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:49:03.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:49:03.805 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:49:03.805 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:49:03.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:49:04.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:49:04.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:49:04.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:49:04.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:49:04.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:49:04.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:49:04.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:49:04.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:49:04.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:49:04.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:49:04.192 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:49:04.266 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:48:34
2026-05-29T21:49:04.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72948, datetime.datetime(2026, 5, 29, 21, 48, 34), datetime.datetime(2026, 5, 29, 21, 48, 33), 'salt', 9.55, 68.58, None, 21.28, 28.36, 5.48, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:49:04.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:49:04.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:49:04.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:48:33, diff=31.273667s, valid=True
2026-05-29T21:49:04.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:49:04.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:49:04.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:49:12, diff=-7.722774s, valid=True
2026-05-29T21:49:04.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:49:04.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:49:04.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:48:30, diff=34.285565s, valid=True
2026-05-29T21:49:04.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:49:04.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:49:04.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:49:04.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:49:04.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:49:04.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:49:04.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:49:12, diff=-7.710701s, valid=True
2026-05-29T21:49:04.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:49:04.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:49:04.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:49:04.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016786.290125s, valid=True
2026-05-29T21:49:04.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:49:04.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:49:04.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:49:04.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:49:04.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:49:04.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:49:04.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:49:04.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:49:04.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:49:04.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:49:04.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:49:04.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:49:04.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:49:04.620 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:49:04.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:49:05.190 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:49:05.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:49: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-05-29T21:49:05.292 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:49:05.597 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:49:05.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:49:35.627 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:49:35.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:49:35.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:49:35.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:49:35.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:49:36.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:49:36.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-05-29T21:49:36.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:49:36.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-05-29T21:49:36.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:49:36.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:49:36.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:49:36.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-05-29T21:49:38.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-05-29T21:49:38.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:49:38.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:49:38.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:49:38.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:49:38.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:49:38.501 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:49:38.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:49:38.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:49:38.501 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:49:38.501 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:49:38.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:49:38.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:49:38.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:49:38.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:49:38.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:49:38.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T21:49:38.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:49:38.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T21:49:38.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:49:38.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:49:38.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:49:38.787 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:49:38.852 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:49:34
2026-05-29T21:49:38.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72950, datetime.datetime(2026, 5, 29, 21, 49, 34), datetime.datetime(2026, 5, 29, 21, 49, 34), 'salt', 9.46, 68.48, None, 19.62, 35.57, 5.51, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:49:38.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:49:38.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:49:38.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:49:34, diff=4.859009s, valid=True
2026-05-29T21:49:38.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:49:38.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T21:49:38.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:50:12, diff=-33.138156s, valid=True
2026-05-29T21:49:38.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:49:38.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:49:38.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:49:33, diff=5.868577s, valid=True
2026-05-29T21:49:38.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:49:38.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:49:38.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:49:38.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:49:38.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:49:38.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T21:49:38.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:50:12, diff=-33.128398s, valid=True
2026-05-29T21:49:38.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:49:38.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:49:38.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:49:38.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016820.87227s, valid=True
2026-05-29T21:49:38.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:49:38.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:49:38.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:49:38.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:49:38.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:49:38.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:49:38.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:49:38.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:49:38.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:49:39.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:49:39.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:49:39.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:49:39.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:49:39.192 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:49:39.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:49:39.744 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:49:39.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:49:39.909 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:49:39.909 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:49:40.112 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:49:40.112 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:50:10.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:50:10.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:50:10.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:50:10.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:50:10.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:50:10.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:50:10.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-05-29T21:50:10.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:50:10.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-05-29T21:50:10.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:50:10.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:50:10.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:50:10.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-05-29T21:50:13.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-05-29T21:50:13.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:50:13.139 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:50:13.139 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:50:13.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:50:13.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:50:13.160 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:50:13.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:50:13.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:50:13.161 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:50:13.161 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:50:13.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:50:13.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:50:13.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:50:13.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:50:13.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:50:13.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:50:13.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:50:13.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:50:13.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:50:13.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:50:13.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:50:13.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:50:13.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:50:04
2026-05-29T21:50:13.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72951, datetime.datetime(2026, 5, 29, 21, 50, 4), datetime.datetime(2026, 5, 29, 21, 50, 4), 'salt', 9.49, 68.55, None, 21.81, 31.39, 5.49, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:50:13.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:50:13.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:50:13.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:50:04, diff=9.48178s, valid=True
2026-05-29T21:50:13.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:50:13.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:50:13.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:50:12, diff=1.484545s, valid=True
2026-05-29T21:50:13.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:50:13.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:50:13.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:50:00, diff=13.491236s, valid=True
2026-05-29T21:50:13.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:50:13.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:50:13.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:50:13.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:50:13.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:50:13.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:50:13.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:50:12, diff=1.494266s, valid=True
2026-05-29T21:50:13.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:50:13.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:50:13.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:50:13.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016855.494939s, valid=True
2026-05-29T21:50:13.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:50:13.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:50:13.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:50:13.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:50:13.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:50:13.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:50:13.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:50:13.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:50:13.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:50:13.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:50:13.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:50:13.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:50:13.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:50:13.814 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:50:14.022 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:50:14.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:50:14.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:50:14.466 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:50:14.466 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:50:14.657 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:50:14.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:50:44.687 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:50:44.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:50:44.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:50:44.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:50:44.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:50:45.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:50:45.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-05-29T21:50:45.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:50:45.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-05-29T21:50:45.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:50:45.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:50:45.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:50:45.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-05-29T21:50:47.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T21:50:47.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:50:47.797 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:50:47.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:50:47.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:50:47.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:50:47.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:50:47.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:50:47.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:50:47.817 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:50:47.817 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:50:47.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:50:47.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:50:47.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:50:47.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:50:47.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:50:48.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:50:48.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:50:48.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:50:48.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:50:48.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:50:48.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:50:48.071 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:50:48.133 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:50:35
2026-05-29T21:50:48.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72952, datetime.datetime(2026, 5, 29, 21, 50, 35), datetime.datetime(2026, 5, 29, 21, 50, 34), 'salt', 9.55, 68.51, None, 22.76, 34.25, 5.49, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:50:48.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:50:48.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:50:48.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:50:34, diff=14.139328s, valid=True
2026-05-29T21:50:48.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:50:48.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:50:48.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:51:12, diff=-23.857806s, valid=True
2026-05-29T21:50:48.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:50:48.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:50:48.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:50:30, diff=18.148938s, valid=True
2026-05-29T21:50:48.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:50:48.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:50:48.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:50:48.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:50:48.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:50:48.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:50:48.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:51:12, diff=-23.847995s, valid=True
2026-05-29T21:50:48.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:50:48.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:50:48.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:50:48.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016890.152683s, valid=True
2026-05-29T21:50:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:50:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:50:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:50:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:50:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:50:48.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:50:48.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:50:48.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:50:48.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:50:48.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:50:48.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:50:48.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:50:48.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:50:48.471 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:50:48.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:50:49.113 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:50:49.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:50:49.214 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:50:49.214 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:50:49.468 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:50:49.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:51:19.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:51:19.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:51:19.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:51:19.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:51:19.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:51:19.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:51:19.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-05-29T21:51:19.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:51:19.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-05-29T21:51:19.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:51:19.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:51:19.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:51:19.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-05-29T21:51:22.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-05-29T21:51:22.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:51:22.352 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:51:22.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:51:22.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:51:22.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:51:22.373 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:51:22.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:51:22.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:51:22.373 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:51:22.373 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:51:22.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:51:22.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:51:22.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:51:22.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:51:22.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:51:22.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:51:22.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:51:22.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:51:22.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:51:22.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:51:22.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:51:22.628 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:51:22.690 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:51:05
2026-05-29T21:51:22.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72953, datetime.datetime(2026, 5, 29, 21, 51, 5), datetime.datetime(2026, 5, 29, 21, 51, 4), 'salt', 9.55, 68.41, None, 19.87, 33.74, 5.51, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:51:22.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:51:22.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:51:22.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:51:04, diff=18.697251s, valid=True
2026-05-29T21:51:22.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:51:22.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:51:22.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:51:12, diff=10.700179s, valid=True
2026-05-29T21:51:22.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:51:22.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:51:22.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:51:01, diff=21.707007s, valid=True
2026-05-29T21:51:22.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:51:22.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:51:22.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:51:22.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:51:22.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:51:22.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:51:22.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:51:12, diff=10.710069s, valid=True
2026-05-29T21:51:22.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:51:22.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:51:22.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:51:22.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016924.710753s, valid=True
2026-05-29T21:51:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:51:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:51:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:51:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:51:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:51:22.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:51:22.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:51:22.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:51:22.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:51:22.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:51:22.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:51:22.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:51:23.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:51:23.045 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:51:23.273 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:51:23.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:51:23.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:51:23.742 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:51:23.742 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:51:24.017 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:51:24.018 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:51:54.048 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:51:54.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:51:54.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:51:54.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:51:54.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:51:54.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:51:54.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-05-29T21:51:54.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:51:54.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-05-29T21:51:54.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:51:54.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:51:54.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:51:54.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-05-29T21:51:57.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-05-29T21:51:57.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:51:57.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:51:57.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:51:57.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:51:57.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:51:57.935 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:51:57.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:51:57.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:51:57.936 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:51:57.936 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:51:57.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:51:58.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:51:58.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:51:58.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:51:58.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:51:58.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:51:58.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:51:58.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:51:58.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:51:58.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:51:58.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:51:58.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:51:58.245 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:51:35
2026-05-29T21:51:58.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72954, datetime.datetime(2026, 5, 29, 21, 51, 35), datetime.datetime(2026, 5, 29, 21, 51, 35), 'salt', 9.55, 68.51, None, 19.97, 34.25, 5.49, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:51:58.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:51:58.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:51:58.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:51:35, diff=23.25192s, valid=True
2026-05-29T21:51:58.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:51:58.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:51:58.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:52:12, diff=-13.745215s, valid=True
2026-05-29T21:51:58.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:51:58.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:51:58.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:51:31, diff=27.261476s, valid=True
2026-05-29T21:51:58.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:51:58.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:51:58.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:51:58.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:51:58.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:51:58.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:51:58.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:52:12, diff=-13.735474s, valid=True
2026-05-29T21:51:58.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:51:58.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:51:58.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:51:58.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016960.265196s, valid=True
2026-05-29T21:51:58.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:51:58.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:51:58.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:51:58.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:51:58.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:51:58.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:51:58.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:51:58.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:51:58.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:51:58.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:51:58.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:51:58.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:51:58.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:51:58.650 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:51:58.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:51:59.210 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:51:59.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:51:59.311 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:51:59.311 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:51:59.883 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:51:59.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:52:29.910 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:52:29.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:52:29.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:52:30.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:52:30.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:52:30.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:52:30.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-05-29T21:52:30.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:52:30.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-05-29T21:52:30.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:52:30.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:52:30.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:52:30.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-05-29T21:52:32.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-05-29T21:52:32.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:52:32.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:52:32.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:52:32.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:52:32.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:52:32.953 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:52:32.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:52:32.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:52:32.954 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:52:32.954 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:52:32.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:52:33.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:52:33.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:52:33.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:52:33.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:52:33.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:52:33.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:52:33.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:52:33.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:52:33.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:52:33.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:52:33.214 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:52:33.273 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:52:05
2026-05-29T21:52:33.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72955, datetime.datetime(2026, 5, 29, 21, 52, 5), datetime.datetime(2026, 5, 29, 21, 52, 5), 'salt', 9.55, 68.58, None, 20.64, 36.11, 5.48, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:52:33.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:52:33.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:52:33.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:52:05, diff=28.279561s, valid=True
2026-05-29T21:52:33.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:52:33.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:52:33.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:52:12, diff=21.282388s, valid=True
2026-05-29T21:52:33.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:52:33.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:52:33.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:52:01, diff=32.289245s, valid=True
2026-05-29T21:52:33.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:52:33.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:52:33.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:52:33.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:52:33.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:52:33.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:52:33.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:52:12, diff=21.292312s, valid=True
2026-05-29T21:52:33.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:52:33.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:52:33.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:52:33.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1016995.292973s, valid=True
2026-05-29T21:52:33.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:52:33.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:52:33.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:52:33.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:52:33.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:52:33.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:52:33.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:52:33.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:52:33.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:52:33.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:52:33.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:52:33.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:52:33.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:52:33.609 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:52:33.824 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:52:34.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:52:34.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:52:34.278 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:52:34.279 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:52:34.365 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:52:34.365 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:53:04.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:53:04.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:53:04.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:53:04.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:53:04.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:53:04.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:53:04.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-05-29T21:53:04.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:53:04.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-05-29T21:53:04.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:53:04.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:53:04.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:53:04.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-05-29T21:53:07.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-05-29T21:53:07.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:53:07.232 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:53:07.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:53:07.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:53:07.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:53:07.253 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:53:07.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:53:07.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:53:07.254 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:53:07.254 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:53:07.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:53:07.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:53:07.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:53:07.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:53:07.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:53:07.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:53:07.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:53:07.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:53:07.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:53:07.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:53:07.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:53:07.505 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:53:07.564 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:53:06
2026-05-29T21:53:07.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72957, datetime.datetime(2026, 5, 29, 21, 53, 6), datetime.datetime(2026, 5, 29, 21, 53, 6), 'salt', 9.59, 68.74, None, 22.12, 29.61, 5.45, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:53:07.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:53:07.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:53:07.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:53:06, diff=1.570657s, valid=True
2026-05-29T21:53:07.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:53:07.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:53:07.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:53:12, diff=-4.426508s, valid=True
2026-05-29T21:53:07.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:53:07.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:53:07.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:53:04, diff=3.580196s, valid=True
2026-05-29T21:53:07.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:53:07.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:53:07.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:53:07.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:53:07.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:53:07.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:53:07.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:53:12, diff=-4.41675s, valid=True
2026-05-29T21:53:07.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:53:07.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:53:07.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:53:07.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017029.583936s, valid=True
2026-05-29T21:53:07.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:53:07.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:53:07.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:53:07.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:53:07.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:53:07.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:53:07.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:53:07.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:53:07.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:53:07.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:53:07.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:53:07.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:53:07.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:53:07.971 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:53:08.188 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:53:08.541 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:53:08.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:53:08.642 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:53:08.643 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:53:08.835 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:53:08.835 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:53:38.837 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:53:38.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:53:38.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:53:39.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:53:39.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:53:39.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:53:39.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-05-29T21:53:39.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:53:39.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-05-29T21:53:39.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:53:39.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:53:39.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:53:39.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-05-29T21:54:14.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-05-29T21:54:14.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:54:14.093 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:54:14.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:54:14.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:54:14.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:54:14.115 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:54:14.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:54:14.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:54:14.115 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:54:14.115 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:54:14.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:54:14.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:54:14.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:54:14.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:54:14.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:54:14.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:54:14.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:54:14.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:54:14.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:54:14.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:54:14.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:54:14.393 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:54:14.454 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:54:06
2026-05-29T21:54:14.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72959, datetime.datetime(2026, 5, 29, 21, 54, 6), datetime.datetime(2026, 5, 29, 21, 54, 6), 'salt', 9.52, 68.78, None, 20.71, 36.86, 5.44, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:54:14.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:54:14.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:54:14.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:54:06, diff=8.460201s, valid=True
2026-05-29T21:54:14.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:54:14.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:54:14.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:54:12, diff=2.463044s, valid=True
2026-05-29T21:54:14.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:54:14.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:54:14.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:54:03, diff=11.469754s, valid=True
2026-05-29T21:54:14.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:54:14.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:54:14.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:54:14.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:54:14.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:54:14.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:54:14.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:54:12, diff=2.472818s, valid=True
2026-05-29T21:54:14.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:54:14.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:54:14.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:54:14.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017096.473482s, valid=True
2026-05-29T21:54:14.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:54:14.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:54:14.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:54:14.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:54:14.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:54:14.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:54:14.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:54:14.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:54:14.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:54:14.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:54:14.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:54:14.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:54:14.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:54:14.797 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:54:15.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:54:15.385 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:54:15.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:54:15.485 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:54:15.485 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:54:15.707 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:54:15.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:54:45.737 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:54:45.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:54:45.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:54:46.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:54:46.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:54:46.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:54:46.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-05-29T21:54:46.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:54:46.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-05-29T21:54:46.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:54:46.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:54:46.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:54:46.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-05-29T21:54:48.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-05-29T21:54:48.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:54:48.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:54:48.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:54:48.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:54:48.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:54:48.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:54:48.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:54:48.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:54:48.772 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:54:48.772 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:54:48.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:54:48.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:54:48.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:54:48.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:54:48.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:54:48.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T21:54:48.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:54:49.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T21:54:49.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:54:49.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:54:49.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:54:49.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:54:49.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:54:37
2026-05-29T21:54:49.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72960, datetime.datetime(2026, 5, 29, 21, 54, 37), datetime.datetime(2026, 5, 29, 21, 54, 36), 'salt', 9.55, 68.71, None, 19.97, 35.19, 5.45, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:54:49.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:54:49.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:54:49.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:54:36, diff=13.106738s, valid=True
2026-05-29T21:54:49.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:54:49.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T21:54:49.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:55:12, diff=-22.890422s, valid=True
2026-05-29T21:54:49.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:54:49.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:54:49.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:54:33, diff=16.116321s, valid=True
2026-05-29T21:54:49.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:54:49.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:54:49.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:54:49.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:54:49.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:54:49.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T21:54:49.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:55:12, diff=-22.880663s, valid=True
2026-05-29T21:54:49.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:54:49.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:54:49.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:54:49.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017131.120007s, valid=True
2026-05-29T21:54:49.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:54:49.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:54:49.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:54:49.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:54:49.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:54:49.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:54:49.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:54:49.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:54:49.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:54:49.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:54:49.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:54:49.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:54:49.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:54:49.525 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:54:49.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:54:50.118 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:54:50.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:54:50.229 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:54:50.229 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:54:50.413 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:54:50.413 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:55:20.444 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:55:20.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:55:20.444 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:55:20.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:55:20.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:55:20.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:55:20.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-05-29T21:55:20.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:55:20.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-05-29T21:55:20.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:55:20.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:55:20.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:55:20.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-05-29T21:56:17.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-05-29T21:56:17.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:56:17.096 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:56:17.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:56:17.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:56:17.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:56:17.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:56:17.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:56:17.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:56:17.117 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:56:17.117 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:56:17.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:56:17.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:56:17.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:56:17.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:56:17.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:56:17.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:56:17.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:56:17.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:56:17.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:56:17.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:56:17.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:56:17.374 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:56:17.435 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:56:07
2026-05-29T21:56:17.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72963, datetime.datetime(2026, 5, 29, 21, 56, 7), datetime.datetime(2026, 5, 29, 21, 56, 7), 'salt', 9.49, 69.14, None, 21.49, 37.21, 5.37, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:56:17.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:56:17.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:56:17.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:56:07, diff=10.441165s, valid=True
2026-05-29T21:56:17.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:56:17.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:56:17.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:56:12, diff=5.443995s, valid=True
2026-05-29T21:56:17.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:56:17.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:56:17.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:56:04, diff=13.450791s, valid=True
2026-05-29T21:56:17.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:56:17.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:56:17.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:56:17.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:56:17.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:56:17.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:56:17.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:56:12, diff=5.453803s, valid=True
2026-05-29T21:56:17.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:56:17.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:56:17.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:56:17.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017219.454471s, valid=True
2026-05-29T21:56:17.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:56:17.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:56:17.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:56:17.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:56:17.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:56:17.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:56:17.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:56:17.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:56:17.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:56:17.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:56:17.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:56:17.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:56:17.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:56:17.771 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:56:17.984 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:56:18.332 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:56:18.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:56:18.432 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:56:18.432 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:56:18.692 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:56:18.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:56:48.722 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:56:48.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:56:48.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:56:48.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:56:48.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:56:49.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:56:49.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-05-29T21:56:49.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:56:49.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-05-29T21:56:49.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:56:49.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:56:49.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:56:49.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-05-29T21:58:18.542 [ERROR] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] processing LCO all-sky image: HTTPSConnectionPool(host='s3.us-west-2.amazonaws.com', port=443): Read timed out.
2026-05-29T21:58:18.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:58:18.546 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:58:18.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:58:18.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:58:18.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:58:18.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:58:18.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:58:18.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:58:18.568 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:58:18.568 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:58:18.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:58:18.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:58:18.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:58:18.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:58:18.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:58:18.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:58:18.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:58:18.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T21:58:18.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:58:18.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:58:18.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:58:18.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:58:18.900 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:58:08
2026-05-29T21:58:18.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72967, datetime.datetime(2026, 5, 29, 21, 58, 8), datetime.datetime(2026, 5, 29, 21, 58, 8), 'salt', 9.39, 69.54, None, 21.49, 33.13, 5.28, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:58:18.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:58:18.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:58:18.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:58:08, diff=10.906302s, valid=True
2026-05-29T21:58:18.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:58:18.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:58:18.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:58:12, diff=6.909127s, valid=True
2026-05-29T21:58:18.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:58:18.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:58:18.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:58:04, diff=14.915711s, valid=True
2026-05-29T21:58:18.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:58:18.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:58:18.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:58:18.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:58:18.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:58:18.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T21:58:18.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:58:12, diff=6.918742s, valid=True
2026-05-29T21:58:18.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:58:18.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:58:18.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:58:18.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017340.919389s, valid=True
2026-05-29T21:58:18.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:58:18.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:58:18.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:58:18.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:58:18.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:58:18.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:58:18.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:58:18.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:58:18.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:58:19.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:58:19.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:58:19.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:58:19.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:58:19.243 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:58:19.461 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:58:19.813 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:58:19.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:58:19.937 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:58:19.937 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:58:20.125 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:58:20.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:58:50.155 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:58:50.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:58:50.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:58:50.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:58:50.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:58:50.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:58:50.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-05-29T21:58:50.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:58:50.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-05-29T21:58:50.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:58:50.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:58:50.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:58:50.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-05-29T21:58:52.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-05-29T21:58:52.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:58:52.994 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:58:52.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:58:53.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:58:53.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:58:53.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:58:53.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:58:53.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:58:53.016 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:58:53.016 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:58:53.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:58:53.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T21:58:53.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:58:53.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T21:58:53.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:58:53.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T21:58:53.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:58:53.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T21:58:53.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:58:53.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:58:53.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:58:53.264 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:58:53.325 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:58:38
2026-05-29T21:58:53.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72968, datetime.datetime(2026, 5, 29, 21, 58, 38), datetime.datetime(2026, 5, 29, 21, 58, 38), 'salt', 9.39, 69.51, None, 20.92, 33.62, 5.29, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:58:53.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:58:53.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T21:58:53.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:58:38, diff=15.331699s, valid=True
2026-05-29T21:58:53.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:58:53.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T21:58:53.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:59:12, diff=-18.665487s, valid=True
2026-05-29T21:58:53.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:58:53.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T21:58:53.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:58:35, diff=18.341078s, valid=True
2026-05-29T21:58:53.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:58:53.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:58:53.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:58:53.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:58:53.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:58:53.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T21:58:53.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:59:12, diff=-18.655845s, valid=True
2026-05-29T21:58:53.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:58:53.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:58:53.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:58:53.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017375.344832s, valid=True
2026-05-29T21:58:53.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:58:53.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:58:53.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:58:53.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:58:53.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:58:53.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:58:53.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:58:53.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:58:53.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:58:53.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:58:53.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:58:53.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:58:53.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:58:53.663 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:58:53.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:58:54.283 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:58:54.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:58:54.382 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:58:54.382 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:58:54.566 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:58:54.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T21:59:24.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T21:59:24.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T21:59:24.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T21:59:24.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T21:59:24.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T21:59:25.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T21:59:25.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T21:59:25.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T21:59:25.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-05-29T21:59:25.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T21:59:25.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T21:59:25.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T21:59:25.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-05-29T21:59: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-05-29T21:59:52.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T21:59:52.197 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T21:59:52.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T21:59:52.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T21:59:52.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T21:59:52.217 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T21:59:52.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T21:59:52.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T21:59:52.218 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T21:59:52.218 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T21:59:52.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T21:59:52.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T21:59:52.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T21:59:52.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T21:59:52.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:59:52.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T21:59:52.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T21:59:52.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T21:59:52.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T21:59:52.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T21:59:52.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T21:59:52.492 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T21:59:52.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 21:59:39
2026-05-29T21:59:52.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72970, datetime.datetime(2026, 5, 29, 21, 59, 39), datetime.datetime(2026, 5, 29, 21, 59, 38), 'salt', 9.46, 69.38, None, 20.5, 33.9, 5.32, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T21:59:52.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T21:59:52.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T21:59:52.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:59:38, diff=14.559388s, valid=True
2026-05-29T21:59:52.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T21:59:52.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T21:59:52.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:00:12, diff=-19.437673s, valid=True
2026-05-29T21:59:52.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T21:59:52.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T21:59:52.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 21:59:36, diff=16.569187s, valid=True
2026-05-29T21:59:52.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T21:59:52.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:59:52.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T21:59:52.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T21:59:52.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T21:59:52.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T21:59:52.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:00:12, diff=-19.427758s, valid=True
2026-05-29T21:59:52.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T21:59:52.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T21:59:52.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T21:59:52.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017434.57291s, valid=True
2026-05-29T21:59:52.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T21:59:52.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T21:59:52.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T21:59:52.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T21:59:52.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T21:59:52.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T21:59:52.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T21:59:52.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T21:59:52.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T21:59:52.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T21:59:52.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T21:59:52.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T21:59:52.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T21:59:52.914 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T21:59:53.162 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:59:53.538 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T21:59:53.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T21:59:53.640 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T21:59:53.640 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T21:59:53.837 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T21:59:53.837 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:00:23.867 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:00:23.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:00:23.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:00:24.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:00:24.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:00:24.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:00:24.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-05-29T22:00:24.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:00:24.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-05-29T22:00:24.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:00:24.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:00:24.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:00:24.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-05-29T22:00:27.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-05-29T22:00:27.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:00:27.037 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:00:27.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:00:27.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:00:27.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:00:27.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:00:27.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:00:27.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:00:27.057 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:00:27.057 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:00:27.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:00:27.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:00:27.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:00:27.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:00:27.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:00:27.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:00:27.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:00:27.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:00:27.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:00:27.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:00:27.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:00:27.309 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:00:27.368 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:00:09
2026-05-29T22:00:27.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72971, datetime.datetime(2026, 5, 29, 22, 0, 9), datetime.datetime(2026, 5, 29, 22, 0, 9), 'salt', 9.49, 69.24, None, 20.85, 33.95, 5.34, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:00:27.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:00:27.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:00:27.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:00:09, diff=18.374253s, valid=True
2026-05-29T22:00:27.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:00:27.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:00:27.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:00:12, diff=15.377115s, valid=True
2026-05-29T22:00:27.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:00:27.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:00:27.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:00:06, diff=21.383831s, valid=True
2026-05-29T22:00:27.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:00:27.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:00:27.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:00:27.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:00:27.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:00:27.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:00:27.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:00:12, diff=15.386868s, valid=True
2026-05-29T22:00:27.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:00:27.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:00:27.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:00:27.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017469.387523s, valid=True
2026-05-29T22:00:27.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:00:27.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:00:27.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:00:27.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:00:27.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:00:27.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:00:27.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:00:27.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:00:27.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:00:27.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:00:27.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:00:27.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:00:27.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:00:27.705 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:00:27.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:00:28.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:00:28.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:00:28.438 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:00:28.438 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:00:28.628 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:00:28.629 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:00:58.659 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:00:58.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:00:58.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:00:58.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:00:58.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:00:59.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:00:59.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T22:00:59.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:00:59.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-05-29T22:00:59.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:00:59.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:00:59.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:00:59.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-05-29T22:01:41.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T22:01:41.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:01:41.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:01:41.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:01:41.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:01:41.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:01:41.591 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:01:41.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:01:41.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:01:41.592 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:01:41.592 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:01:41.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:01:41.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:01:41.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:01:41.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:01:41.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:01:41.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:01:41.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:01:41.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:01:41.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:01:41.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:01:41.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:01:41.845 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:01:41.903 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:01:40
2026-05-29T22:01:41.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72974, datetime.datetime(2026, 5, 29, 22, 1, 40), datetime.datetime(2026, 5, 29, 22, 1, 39), 'salt', 9.42, 69.21, None, 20.78, 35.45, 5.35, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:01:41.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:01:41.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:01:41.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:01:39, diff=2.910016s, valid=True
2026-05-29T22:01:41.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:01:41.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:01:41.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:02:12, diff=-30.087146s, valid=True
2026-05-29T22:01:41.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:01:41.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:01:41.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:01:38, diff=3.919599s, valid=True
2026-05-29T22:01:41.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:01:41.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:01:41.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:01:41.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:01:41.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:01:41.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:01:41.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:02:12, diff=-30.07736s, valid=True
2026-05-29T22:01:41.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:01:41.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:01:41.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:01:41.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017543.923333s, valid=True
2026-05-29T22:01:41.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:01:41.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:01:41.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:01:41.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:01:41.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:01:41.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:01:41.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:01:41.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:01:42.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:01:42.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:01:42.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:01:42.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:01:42.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:01:42.246 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:01:42.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:01:42.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:01:42.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:01:42.932 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:01:42.932 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:01:43.112 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:01:43.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:02:13.167 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:02:13.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:02:13.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:02:13.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:02:13.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:02:13.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:02:13.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-05-29T22:02:13.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:02:13.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-05-29T22:02:13.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:02:13.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:02:13.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:02:13.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-05-29T22:02:16.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-05-29T22:02:16.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:02:16.807 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:02:16.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:02:16.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:02:16.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:02:16.829 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:02:16.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:02:16.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:02:16.829 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:02:16.829 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:02:16.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:02:16.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:02:16.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:02:16.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:02:16.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:02:17.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:02:17.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:02:17.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:02:17.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:02:17.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:02:17.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:02:17.079 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:02:17.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:02:10
2026-05-29T22:02:17.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72975, datetime.datetime(2026, 5, 29, 22, 2, 10), datetime.datetime(2026, 5, 29, 22, 2, 9), 'salt', 9.32, 69.28, None, 19.55, 40.66, 5.33, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:02:17.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:02:17.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:02:17.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:02:09, diff=8.144154s, valid=True
2026-05-29T22:02:17.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:02:17.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:02:17.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:02:12, diff=5.146951s, valid=True
2026-05-29T22:02:17.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:02:17.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:02:17.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:02:09, diff=8.153577s, valid=True
2026-05-29T22:02:17.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:02:17.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:02:17.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:02:17.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:02:17.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:02:17.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:02:17.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:02:12, diff=5.156591s, valid=True
2026-05-29T22:02:17.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:02:17.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:02:17.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:02:17.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017579.157259s, valid=True
2026-05-29T22:02:17.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:02:17.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:02:17.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:02:17.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:02:17.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:02:17.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:02:17.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:02:17.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:02:17.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:02:17.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:02:17.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:02:17.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:02:17.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:02:17.546 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:02:17.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:02:18.107 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:02:18.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:02:18.206 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:02:18.206 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:02:18.390 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:02:18.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:02:48.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:02:48.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:02:48.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:02:48.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:02:48.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:02:49.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:02:49.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-05-29T22:02:49.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:02:49.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-05-29T22:02:49.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:02:49.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:02:49.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:02:49.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-05-29T22:02:51.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-05-29T22:02:51.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:02:51.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:02:51.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:02:51.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:02:51.523 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:02:51.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:02:51.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:02:51.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:02:51.525 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:02:51.525 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:02:51.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:02:51.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:02:51.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:02:51.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:02:51.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:02:51.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:02:51.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:02:51.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:02:51.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:02:51.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:02:51.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:02:51.825 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:02:51.886 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:02:40
2026-05-29T22:02:51.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72976, datetime.datetime(2026, 5, 29, 22, 2, 40), datetime.datetime(2026, 5, 29, 22, 2, 40), 'salt', 9.29, 69.41, None, 18.38, 36.37, 5.3, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:02:51.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:02:51.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:02:51.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:02:40, diff=11.894134s, valid=True
2026-05-29T22:02:51.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:02:51.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:02:51.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:03:12, diff=-20.103011s, valid=True
2026-05-29T22:02:51.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:02:51.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:02:51.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:02:38, diff=13.903838s, valid=True
2026-05-29T22:02:51.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:02:51.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:02:51.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:02:51.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:02:51.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:02:51.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:02:51.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:03:12, diff=-20.09313s, valid=True
2026-05-29T22:02:51.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:02:51.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:02:51.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:02:51.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017613.907527s, valid=True
2026-05-29T22:02:51.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:02:51.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:02:51.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:02:51.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:02:51.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:02:51.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:02:51.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:02:51.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:02:51.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:02:52.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:02:52.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:02:52.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:02:52.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:02:52.246 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:02:52.473 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:02:52.828 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:02:52.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:02:52.936 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:02:52.936 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:02:53.150 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:02:53.150 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:03:23.176 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:03:23.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:03:23.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:03:23.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:03:23.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:03:23.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:03:23.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-05-29T22:03:23.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:03:23.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-05-29T22:03:23.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:03:23.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:03:23.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:03:23.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-05-29T22:03:26.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-05-29T22:03:26.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:03:26.031 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:03:26.031 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:03:26.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:03:26.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:03:26.052 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:03:26.052 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:03:26.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:03:26.053 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:03:26.053 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:03:26.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:03:26.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:03:26.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:03:26.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:03:26.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:03:26.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:03:26.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:03:26.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:03:26.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:03:26.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:03:26.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:03:26.309 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:03:26.375 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:03:10
2026-05-29T22:03:26.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72977, datetime.datetime(2026, 5, 29, 22, 3, 10), datetime.datetime(2026, 5, 29, 22, 3, 10), 'salt', 9.36, 69.58, None, 20.43, 33.15, 5.27, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:03:26.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:03:26.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:03:26.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:03:10, diff=16.381754s, valid=True
2026-05-29T22:03:26.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:03:26.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:03:26.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:03:12, diff=14.385063s, valid=True
2026-05-29T22:03:26.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:03:26.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:03:26.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:03:08, diff=18.392235s, valid=True
2026-05-29T22:03:26.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:03:26.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:03:26.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:03:26.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:03:26.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:03:26.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:03:26.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:03:12, diff=14.39574s, valid=True
2026-05-29T22:03:26.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:03:26.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:03:26.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:03:26.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017648.396468s, valid=True
2026-05-29T22:03:26.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:03:26.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:03:26.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:03:26.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:03:26.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:03:26.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:03:26.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:03:26.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:03:26.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:03:26.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:03:26.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:03:26.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:03:26.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:03:26.798 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:03:27.021 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:03:27.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:03:27.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:03:27.485 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:03:27.485 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:03:27.641 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:03:27.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:03:57.662 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:03:57.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:03:57.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:03:58.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:03:58.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:03:58.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:03:58.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-05-29T22:03:58.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:03:58.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-05-29T22:03:58.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:03:58.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:03:58.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:03:58.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-05-29T22:04:00.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-05-29T22:04:00.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:04:00.964 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:04:00.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:04:00.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:04:00.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:04:00.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:04:00.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:04:00.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:04:00.987 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:04:00.987 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:04:00.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:04:01.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:04:01.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:04:01.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:04:01.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:04:01.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:04:01.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:04:01.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:04:01.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:04:01.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:04:01.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:04:01.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:04:01.301 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:03:41
2026-05-29T22:04:01.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72978, datetime.datetime(2026, 5, 29, 22, 3, 41), datetime.datetime(2026, 5, 29, 22, 3, 40), 'salt', 9.39, 69.67, None, 20.92, 33.27, 5.25, 832.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:04:01.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:04:01.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:04:01.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:03:40, diff=21.308537s, valid=True
2026-05-29T22:04:01.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:04:01.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:04:01.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:04:12, diff=-10.68811s, valid=True
2026-05-29T22:04:01.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:04:01.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:04:01.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:03:38, diff=23.318661s, valid=True
2026-05-29T22:04:01.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:04:01.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:04:01.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:04:01.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:04:01.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:04:01.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:04:01.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:04:12, diff=-10.678292s, valid=True
2026-05-29T22:04:01.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:04:01.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:04:01.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:04:01.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017683.322361s, valid=True
2026-05-29T22:04:01.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:04:01.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:04:01.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:04:01.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:04:01.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:04:01.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:04:01.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:04:01.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:04:01.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:04:01.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:04:01.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:04:01.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:04:01.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:04:01.677 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:04:01.890 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:04:02.237 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:04:02.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:04:02.337 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:04:02.337 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:04:02.596 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:04:02.596 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:04:32.599 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:04:32.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:04:32.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:04:32.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:04:32.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:04:33.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:04: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-05-29T22:04:33.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:04:33.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-05-29T22:04:33.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:04:33.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:04:33.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:04:33.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-05-29T22:05:01.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-05-29T22:05:01.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:05:01.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:05:01.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:05:01.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:05:01.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:05:01.256 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:05:01.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:05:01.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:05:01.257 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:05:01.257 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:05:01.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:05:01.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:05:01.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:05:01.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:05:01.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:05:01.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:05:01.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:05:01.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:05:01.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:05:01.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:05:01.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:05:01.510 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:05:01.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:04:41
2026-05-29T22:05:01.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72980, datetime.datetime(2026, 5, 29, 22, 4, 41), datetime.datetime(2026, 5, 29, 22, 4, 41), 'salt', 9.39, 69.51, None, 19.41, 41.67, 5.29, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:05:01.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:05:01.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:05:01.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:04:41, diff=20.574291s, valid=True
2026-05-29T22:05:01.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:05:01.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:05:01.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:05:12, diff=-10.422889s, valid=True
2026-05-29T22:05:01.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:05:01.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:05:01.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:04:39, diff=22.583756s, valid=True
2026-05-29T22:05:01.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:05:01.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:05:01.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:05:01.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:05:01.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:05:01.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:05:01.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:05:12, diff=-10.413223s, valid=True
2026-05-29T22:05:01.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:05:01.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:05:01.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:05:01.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017743.58743s, valid=True
2026-05-29T22:05:01.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:05:01.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:05:01.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:05:01.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:05:01.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:05:01.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:05:01.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:05:01.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:05:01.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:05:01.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:05:01.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:05:01.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:05:01.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:05:02.001 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:05:02.215 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:05:02.562 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:05:02.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:05:02.663 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:05:02.664 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:05:02.915 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:05:02.915 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:05:32.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:05:32.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:05:32.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:05:33.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:05:33.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:05:33.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:05:33.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-05-29T22:05:33.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:05:33.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-05-29T22:05:33.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:05:33.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:05:33.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:05:33.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-05-29T22:05:36.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-05-29T22:05:36.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:05:36.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:05:36.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:05:36.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:05:36.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:05:36.993 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:05:36.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:05:36.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:05:36.994 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:05:36.994 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:05:36.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:05:37.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:05:37.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:05:37.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:05:37.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:05:37.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:05:37.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:05:37.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:05:37.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:05:37.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:05:37.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:05:37.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:05:37.309 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:05:11
2026-05-29T22:05:37.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72981, datetime.datetime(2026, 5, 29, 22, 5, 11), datetime.datetime(2026, 5, 29, 22, 5, 11), 'salt', 9.32, 69.41, None, 19.94, 40.97, 5.3, 832.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:05:37.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:05:37.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:05:37.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:05:11, diff=26.315865s, valid=True
2026-05-29T22:05:37.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:05:37.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:05:37.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:05:12, diff=25.319051s, valid=True
2026-05-29T22:05:37.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:05:37.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:05:37.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:05:09, diff=28.325737s, valid=True
2026-05-29T22:05:37.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:05:37.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:05:37.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:05:37.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:05:37.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:05:37.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:05:37.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:05:12, diff=25.32876s, valid=True
2026-05-29T22:05:37.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:05:37.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:05:37.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:05:37.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017779.329425s, valid=True
2026-05-29T22:05:37.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:05:37.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:05:37.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:05:37.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:05:37.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:05:37.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:05:37.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:05:37.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:05:37.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:05:37.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:05:37.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:05:37.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:05:37.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:05:37.646 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:05:37.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:05:38.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:05:38.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:05:38.306 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:05:38.306 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:05:38.586 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:05:38.586 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:06:08.609 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:06:08.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:06:08.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:06:08.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:06:08.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:06:09.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:06:09.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-05-29T22:06:09.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:06:09.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-05-29T22:06:09.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:06:09.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:06:09.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:06:09.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T22:06:11.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-05-29T22:06:11.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:06:11.718 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:06:11.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:06:11.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:06:11.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:06:11.739 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:06:11.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:06:11.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:06:11.739 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:06:11.739 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:06:11.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:06:11.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:06:11.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:06:11.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:06:11.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:06:11.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:06:11.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:06:11.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:06:11.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:06:11.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:06:11.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:06:11.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:06:12.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:06:12
2026-05-29T22:06:12.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72983, datetime.datetime(2026, 5, 29, 22, 6, 12), datetime.datetime(2026, 5, 29, 22, 6, 11), 'salt', 9.39, 69.44, None, 20.89, 36.44, 5.3, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:06:12.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:06:12.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:06:12.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:06:11, diff=1.072335s, valid=True
2026-05-29T22:06:12.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:06:12.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:06:12.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:06:12, diff=0.075206s, valid=True
2026-05-29T22:06:12.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:06:12.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:06:12.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:06:11, diff=1.081838s, valid=True
2026-05-29T22:06:12.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:06:12.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:06:12.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:06:12.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:06:12.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:06:12.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:06:12.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:06:12, diff=0.084923s, valid=True
2026-05-29T22:06:12.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:06:12.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:06:12.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:06:12.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017814.085588s, valid=True
2026-05-29T22:06:12.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:06:12.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:06:12.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:06:12.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:06:12.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:06:12.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:06:12.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:06:12.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:06:12.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:06:12.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:06:12.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:06:12.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:06:12.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:06:12.411 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:06:12.637 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:06:12.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:06:13.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:06:13.097 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:06:13.097 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:06:13.405 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:06:13.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:06:43.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:06:43.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:06:43.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:06:43.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:06:43.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:06:44.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:06:44.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-05-29T22:06:44.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:06: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-05-29T22:06:44.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:06:44.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:06:44.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:06:44.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-05-29T22:06:46.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-05-29T22:06:46.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:06:46.656 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:06:46.656 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:06:46.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:06:46.676 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:06:46.676 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:06:46.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:06:46.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:06:46.677 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:06:46.677 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:06:46.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:06:46.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:06:46.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:06:46.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:06:46.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:06:46.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:06:46.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:06:46.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:06:46.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:06:46.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:06:46.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:06:46.950 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:06:47.009 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:06:42
2026-05-29T22:06:47.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72984, datetime.datetime(2026, 5, 29, 22, 6, 42), datetime.datetime(2026, 5, 29, 22, 6, 41), 'salt', 9.32, 69.34, None, 16.94, 39.89, 5.31, 832.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:06:47.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:06:47.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:06:47.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:06:41, diff=6.017661s, valid=True
2026-05-29T22:06:47.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:06:47.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:06:47.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:07:12, diff=-24.979472s, valid=True
2026-05-29T22:06:47.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:06:47.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:06:47.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:06:40, diff=7.027241s, valid=True
2026-05-29T22:06:47.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:06:47.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:06:47.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:06:47.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:06:47.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:06:47.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:06:47.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:07:12, diff=-24.96962s, valid=True
2026-05-29T22:06:47.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:06:47.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:06:47.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:06:47.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017849.031471s, valid=True
2026-05-29T22:06:47.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:06:47.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:06:47.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:06:47.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:06:47.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:06:47.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:06:47.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:06:47.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:06:47.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:06:47.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:06:47.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:06:47.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:06:47.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:06:47.382 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:06:47.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:06:48.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:06:48.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:06:48.136 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:06:48.136 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:06:48.416 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:06:48.416 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:07:18.445 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:07:18.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:07:18.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:07:18.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:07:18.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:07:19.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:07:19.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-05-29T22:07:19.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:07:19.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T22:07:19.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:07:19.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:07:19.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:07:19.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-05-29T22:07:51.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-05-29T22:07:51.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:07:51.387 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:07:51.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:07:51.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:07:51.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:07:51.406 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:07:51.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:07:51.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:07:51.407 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:07:51.407 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:07:51.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:07:51.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:07:51.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:07:51.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:07:51.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:07:51.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:07:51.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:07:51.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:07:51.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:07:51.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:07:51.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:07:51.667 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:07:51.728 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:07:42
2026-05-29T22:07:51.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72986, datetime.datetime(2026, 5, 29, 22, 7, 42), datetime.datetime(2026, 5, 29, 22, 7, 41), 'salt', 9.42, 69.67, None, 19.94, 38.57, 5.25, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:07:51.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:07:51.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:07:51.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:07:41, diff=10.734227s, valid=True
2026-05-29T22:07:51.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:07:51.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:07:51.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:08:12, diff=-20.262943s, valid=True
2026-05-29T22:07:51.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:07:51.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:07:51.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:07:40, diff=11.743804s, valid=True
2026-05-29T22:07:51.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:07:51.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:07:51.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:07:51.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:07:51.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:07:51.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:07:51.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:08:12, diff=-20.25317s, valid=True
2026-05-29T22:07:51.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:07:51.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:07:51.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:07:51.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017913.747494s, valid=True
2026-05-29T22:07:51.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:07:51.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:07:51.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:07:51.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:07:51.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:07:51.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:07:51.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:07:51.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:07:51.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:07:51.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:07:51.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:07:51.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:07:52.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:07:52.064 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:07:52.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:07:52.652 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:07:52.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:07:52.752 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:07:52.752 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:07:52.938 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:07:52.938 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:08:22.951 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:08:22.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:08:22.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:08:23.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:08:23.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:08:23.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:08:23.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-05-29T22:08:23.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:08:23.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-05-29T22:08:23.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:08:23.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:08:23.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:08:23.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-05-29T22:08:26.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-05-29T22:08:26.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:08:26.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:08:26.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:08:26.090 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:08:26.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:08:26.118 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:08:26.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:08:26.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:08:26.119 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:08:26.119 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:08:26.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:08:26.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:08:26.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:08:26.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:08:26.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:08:26.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:08:26.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:08:26.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:08:26.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:08:26.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:08:26.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:08:26.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:08:26.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:08:13
2026-05-29T22:08:26.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72987, datetime.datetime(2026, 5, 29, 22, 8, 13), datetime.datetime(2026, 5, 29, 22, 8, 12), 'salt', 9.46, 69.47, None, 19.87, 43.29, 5.3, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:08:26.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:08:26.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:08:26.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:08:12, diff=14.442419s, valid=True
2026-05-29T22:08:26.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:08:26.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:08:26.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:08:12, diff=14.445287s, valid=True
2026-05-29T22:08:26.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:08:26.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:08:26.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:08:10, diff=16.452111s, valid=True
2026-05-29T22:08:26.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:08:26.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:08:26.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:08:26.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:08:26.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:08:26.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:08:26.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:08:12, diff=14.45517s, valid=True
2026-05-29T22:08:26.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:08:26.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:08:26.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:08:26.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017948.455877s, valid=True
2026-05-29T22:08:26.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:08:26.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:08:26.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:08:26.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:08:26.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:08:26.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:08:26.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:08:26.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:08:26.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:08:26.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:08:26.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:08:26.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:08:26.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:08:26.846 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:08:27.131 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:08:27.477 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:08:27.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:08:27.576 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:08:27.576 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:08:27.773 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:08:27.773 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:08:57.803 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:08:57.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:08:57.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:08:58.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:08:58.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:08:58.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:08:58.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T22:08:58.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:08:58.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-05-29T22:08:58.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:08:58.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:08:58.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:08:58.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-05-29T22:09:00.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-05-29T22:09:00.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:09:00.926 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:09:00.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:09:00.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:09:00.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:09:00.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:09:00.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:09:00.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:09:00.948 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:09:00.948 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:09:00.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:09:01.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:09:01.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:09:01.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:09:01.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:09:01.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:09:01.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:09:01.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:09:01.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:09:01.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:09:01.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:09:01.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:09:01.272 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:08:43
2026-05-29T22:09:01.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72988, datetime.datetime(2026, 5, 29, 22, 8, 43), datetime.datetime(2026, 5, 29, 22, 8, 43), 'salt', 9.42, 69.44, None, 19.51, 37.16, 5.3, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:09:01.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:09:01.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:09:01.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:08:43, diff=18.279688s, valid=True
2026-05-29T22:09:01.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:09:01.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:09:01.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:09:12, diff=-10.717295s, valid=True
2026-05-29T22:09:01.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:09:01.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:09:01.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:08:40, diff=21.289444s, valid=True
2026-05-29T22:09:01.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:09:01.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:09:01.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:09:01.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:09:01.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:09:01.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:09:01.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:09:12, diff=-10.707449s, valid=True
2026-05-29T22:09:01.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:09:01.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:09:01.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:09:01.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1017983.293352s, valid=True
2026-05-29T22:09:01.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:09:01.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:09:01.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:09:01.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:09:01.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:09:01.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:09:01.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:09:01.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:09:01.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:09:01.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:09:01.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:09:01.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:09:01.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:09:01.614 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:09:01.868 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:09:02.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:09:02.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:09: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-05-29T22:09: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-05-29T22:09:02.511 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:09:02.511 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:09:32.541 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:09:32.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:09:32.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:09:32.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:09:32.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:09:33.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:09:33.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T22:09:33.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:09:33.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-05-29T22:09:33.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:09:33.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:09:33.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:09:33.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-05-29T22:10:27.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-05-29T22:10:27.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:10:27.341 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:10:27.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:10:27.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:10:27.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:10:27.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:10:27.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:10:27.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:10:27.361 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:10:27.361 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:10:27.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:10:27.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:10:27.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:10:27.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:10:27.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:10:27.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:10:27.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:10:27.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:10:27.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:10:27.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:10:27.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:10:27.620 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:10:27.682 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:10:14
2026-05-29T22:10:27.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72991, datetime.datetime(2026, 5, 29, 22, 10, 14), datetime.datetime(2026, 5, 29, 22, 10, 14), 'salt', 9.36, 69.91, None, 19.69, 33.71, 5.21, 832.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:10:27.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:10:27.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:10:27.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:10:14, diff=13.690869s, valid=True
2026-05-29T22:10:27.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:10:27.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:10:27.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:10:12, diff=15.693757s, valid=True
2026-05-29T22:10:27.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:10:27.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:10:27.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:10:12, diff=15.700588s, valid=True
2026-05-29T22:10:27.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:10:27.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:10:27.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:10:27.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:10:27.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:10:27.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:10:27.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:10:12, diff=15.703661s, valid=True
2026-05-29T22:10:27.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:10:27.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:10:27.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:10:27.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018069.704322s, valid=True
2026-05-29T22:10:27.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:10:27.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:10:27.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:10:27.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:10:27.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:10:27.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:10:27.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:10:27.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:10:27.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:10:27.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:10:27.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:10:27.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:10:28.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:10:28.133 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:10:28.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:10:28.740 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:10:28.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:10:28.851 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:10:28.851 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:10:29.042 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:10:29.042 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:10:59.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:10:59.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:10:59.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:10:59.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:10:59.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:10:59.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:10:59.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-05-29T22:10:59.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:10:59.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-05-29T22:10:59.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:10:59.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:10:59.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:10:59.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-05-29T22:11:02.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-05-29T22:11:02.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:11:02.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:11:02.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:11:02.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:11:02.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:11:02.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:11:02.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:11:02.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:11:02.180 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:11:02.180 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:11:02.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:11:02.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:11:02.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:11:02.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:11:02.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:11:02.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:11:02.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:11:02.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:11:02.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:11:02.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:11:02.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:11:02.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:11:02.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:10:44
2026-05-29T22:11:02.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72992, datetime.datetime(2026, 5, 29, 22, 10, 44), datetime.datetime(2026, 5, 29, 22, 10, 44), 'salt', 9.29, 70.01, None, 20.64, 35.62, 5.18, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:11:02.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:11:02.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:11:02.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:10:44, diff=18.510861s, valid=True
2026-05-29T22:11:02.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:11:02.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:11:02.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:11:12, diff=-9.486318s, valid=True
2026-05-29T22:11:02.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:11:02.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:11:02.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:10:43, diff=19.52038s, valid=True
2026-05-29T22:11:02.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:11:02.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:11:02.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:11:02.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:11:02.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:11:02.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:11:02.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:11:12, diff=-9.476539s, valid=True
2026-05-29T22:11:02.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:11:02.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:11:02.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:11:02.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018104.524137s, valid=True
2026-05-29T22:11:02.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:11:02.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:11:02.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:11:02.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:11:02.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:11:02.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:11:02.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:11:02.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:11:02.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:11:02.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:11:02.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:11:02.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:11:02.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:11:02.865 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:11:03.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:11:03.454 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:11:03.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:11:03.562 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:11:03.562 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:11:06.067 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:11:06.068 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:11:36.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:11:36.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:11:36.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:11:36.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:11:36.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:11:36.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:11:36.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T22:11:36.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:11:36.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-05-29T22:11:36.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:11:36.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:11:36.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:11: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-05-29T22:11:39.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T22:11:39.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:11:39.253 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:11:39.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:11:39.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:11:39.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:11:39.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:11:39.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:11:39.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:11:39.275 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:11:39.275 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:11:39.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:11:39.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:11:39.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:11:39.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:11:39.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:11:39.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:11:39.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:11:39.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:11:39.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:11:39.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:11:39.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:11:39.526 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:11:39.587 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:11:15
2026-05-29T22:11:39.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72993, datetime.datetime(2026, 5, 29, 22, 11, 15), datetime.datetime(2026, 5, 29, 22, 11, 14), 'salt', 9.26, 70.27, None, 22.44, 42.82, 5.13, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:11:39.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:11:39.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:11:39.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:11:14, diff=25.593683s, valid=True
2026-05-29T22:11:39.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:11:39.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:11:39.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:11:12, diff=27.596475s, valid=True
2026-05-29T22:11:39.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:11:39.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:11:39.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:11:12, diff=27.603206s, valid=True
2026-05-29T22:11:39.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:11:39.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:11:39.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:11:39.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:11:39.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:11:39.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:11:39.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:11:12, diff=27.606194s, valid=True
2026-05-29T22:11:39.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:11:39.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:11:39.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:11:39.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018141.606863s, valid=True
2026-05-29T22:11:39.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:11:39.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:11:39.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:11:39.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:11:39.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:11:39.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:11:39.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:11:39.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:11:39.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:11:39.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:11:39.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:11:39.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:11:39.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:11:40.029 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:11:40.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:11:40.599 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:11:40.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:11:40.699 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:11:40.699 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:11:40.960 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:11:40.960 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:12:10.983 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:12:10.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:12:10.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:12:11.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:12:11.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:12:11.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:12:11.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-05-29T22:12:11.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:12:11.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-05-29T22:12:11.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:12:11.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:12:11.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:12:11.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-05-29T22:12:29.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-05-29T22:12:29.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:12:29.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:12:29.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:12:29.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:12:29.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:12:29.500 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:12:29.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:12:29.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:12:29.501 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:12:29.501 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:12:29.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:12:29.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:12:29.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:12:29.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:12:29.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:12:29.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:12:29.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:12:29.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:12:29.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:12:29.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:12:29.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:12:29.759 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:12:29.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:12:15
2026-05-29T22:12:29.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72995, datetime.datetime(2026, 5, 29, 22, 12, 15), datetime.datetime(2026, 5, 29, 22, 12, 15), 'salt', 9.26, 70.21, None, 19.62, 39.25, 5.14, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:12:29.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:12:29.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:12:29.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:12:15, diff=14.823392s, valid=True
2026-05-29T22:12:29.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:12:29.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:12:29.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:12:12, diff=17.826275s, valid=True
2026-05-29T22:12:29.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:12:29.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:12:29.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:12:12, diff=17.833236s, valid=True
2026-05-29T22:12:29.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:12:29.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:12:29.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:12:29.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:12:29.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:12:29.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:12:29.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:12:12, diff=17.83701s, valid=True
2026-05-29T22:12:29.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:12:29.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:12:29.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:12:29.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018191.837772s, valid=True
2026-05-29T22:12:29.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:12:29.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:12:29.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:12:29.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:12:29.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:12:29.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:12:29.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:12:29.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:12:29.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:12:29.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:12:30.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:12:30.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:12:30.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:12:30.176 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:12:30.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:12:30.737 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:12:30.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:12:30.837 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:12:30.837 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:12:31.057 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:12:31.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:13:01.087 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:13:01.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:13:01.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:13:01.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:13:01.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:13:01.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:13:01.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-05-29T22:13:01.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:13:01.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-05-29T22:13:01.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:13:01.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:13:01.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:13:01.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-05-29T22:13:04.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-05-29T22:13:04.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:13:04.211 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:13:04.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:13:04.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:13:04.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:13:04.232 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:13:04.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:13:04.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:13:04.233 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:13:04.233 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:13:04.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:13:04.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:13:04.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:13:04.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:13:04.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:13:04.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:13:04.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:13:04.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:13:04.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:13:04.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:13:04.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:13:04.494 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:13:04.559 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:12:45
2026-05-29T22:13:04.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72996, datetime.datetime(2026, 5, 29, 22, 12, 45), datetime.datetime(2026, 5, 29, 22, 12, 45), 'salt', 9.26, 70.21, None, 19.51, 37.19, 5.14, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:13:04.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:13:04.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:13:04.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:12:45, diff=19.565385s, valid=True
2026-05-29T22:13:04.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:13:04.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:13:04.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:13:12, diff=-7.431725s, valid=True
2026-05-29T22:13:04.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:13:04.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:13:04.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:12:42, diff=22.575027s, valid=True
2026-05-29T22:13:04.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:13:04.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:13:04.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:13:04.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:13:04.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:13:04.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:13:04.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:13:12, diff=-7.42193s, valid=True
2026-05-29T22:13:04.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:13:04.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:13:04.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:13:04.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018226.578772s, valid=True
2026-05-29T22:13:04.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:13:04.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:13:04.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:13:04.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:13:04.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:13:04.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:13:04.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:13:04.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:13:04.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:13:04.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:13:04.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:13:04.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:13:04.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:13:04.967 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:13:05.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:13:05.527 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:13:05.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:13:05.627 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:13:05.627 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:13:05.823 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:13:05.824 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:13:35.853 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:13:35.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:13:35.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:13:36.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:13:36.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:13:36.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:13: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-05-29T22:13:36.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:13:36.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-05-29T22:13:36.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:13:36.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:13:36.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:13:36.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-05-29T22:14:18.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-05-29T22:14:18.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:14:18.996 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:14:18.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:14:19.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:14:19.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:14:19.016 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:14:19.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:14:19.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:14:19.016 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:14:19.016 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:14:19.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:14:19.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:14:19.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:14:19.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:14:19.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:14:19.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:14:19.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:14:19.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:14:19.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:14:19.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:14:19.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:14:19.282 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:14:19.340 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:14:16
2026-05-29T22:14:19.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(72999, datetime.datetime(2026, 5, 29, 22, 14, 16), datetime.datetime(2026, 5, 29, 22, 14, 16), 'salt', 9.22, 70.54, None, 18.98, 30.83, 5.07, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:14:19.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:14:19.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:14:19.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:14:16, diff=3.347094s, valid=True
2026-05-29T22:14:19.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:14:19.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:14:19.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:14:12, diff=7.349915s, valid=True
2026-05-29T22:14:19.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:14:19.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:14:19.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:14:13, diff=6.356612s, valid=True
2026-05-29T22:14:19.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:14:19.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:14:19.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:14:19.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:14:19.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:14:19.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:14:19.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:14:12, diff=7.359671s, valid=True
2026-05-29T22:14:19.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:14:19.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:14:19.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:14:19.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018301.360333s, valid=True
2026-05-29T22:14:19.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:14:19.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:14:19.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:14:19.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:14:19.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:14:19.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:14:19.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:14:19.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:14:19.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:14:19.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:14:19.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:14:19.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:14:19.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:14:19.697 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:14:19.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:14:20.294 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:14:20.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:14:20.397 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:14:20.397 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:14:20.583 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:14:20.583 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:14:50.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:14:50.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:14:50.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:14:51.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:14:51.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:14:51.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:14:51.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-05-29T22:14:51.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:14:51.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-05-29T22:14:51.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:14:51.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:14:51.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:14:51.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-05-29T22:14:53.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-05-29T22:14:53.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:14:53.953 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:14:53.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:14:53.961 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:14:53.972 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:14:53.972 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:14:53.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:14:53.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:14:53.973 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:14:53.973 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:14:53.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:14:54.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:14:54.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:14:54.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:14:54.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:14:54.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:14:54.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:14:54.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:14:54.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:14:54.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:14:54.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:14:54.225 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:14:54.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:14:47
2026-05-29T22:14:54.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73000, datetime.datetime(2026, 5, 29, 22, 14, 47), datetime.datetime(2026, 5, 29, 22, 14, 46), 'salt', 9.26, 70.47, None, 17.93, 41.69, 5.09, 832.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:14:54.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:14:54.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:14:54.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:14:46, diff=8.290713s, valid=True
2026-05-29T22:14:54.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:14:54.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:14:54.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:15:12, diff=-17.70651s, valid=True
2026-05-29T22:14:54.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:14:54.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:14:54.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:14:45, diff=9.300073s, valid=True
2026-05-29T22:14:54.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:14:54.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:14:54.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:14:54.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:14:54.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:14:54.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:14:54.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:15:12, diff=-17.69691s, valid=True
2026-05-29T22:14:54.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:14:54.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:14:54.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:14:54.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018336.30375s, valid=True
2026-05-29T22:14:54.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:14:54.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:14:54.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:14:54.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:14:54.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:14:54.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:14:54.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:14:54.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:14:54.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:14:54.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:14:54.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:14:54.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:14:54.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:14:54.625 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:14:54.841 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:14:55.192 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:14:55.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:14:55.293 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:14:55.293 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:14:55.482 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:14:55.482 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:15:25.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:15:25.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:15:25.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:15:25.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:15:25.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:15:25.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:15:25.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T22:15:25.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:15:25.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-05-29T22:15:25.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:15:25.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:15:25.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:15:25.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-05-29T22:15:28.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-05-29T22:15:28.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:15:28.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:15:28.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:15:28.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:15:28.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:15:28.642 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:15:28.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:15:28.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:15:28.642 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:15:28.642 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:15:28.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:15:28.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:15:28.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:15:28.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:15:28.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:15:28.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:15:28.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:15:28.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:15:28.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:15:28.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:15:28.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:15:28.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:15:28.945 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:15:17
2026-05-29T22:15:28.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73001, datetime.datetime(2026, 5, 29, 22, 15, 17), datetime.datetime(2026, 5, 29, 22, 15, 17), 'salt', 9.26, 70.27, None, 20.64, 38.01, 5.13, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:15:28.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:15:28.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:15:28.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:15:17, diff=11.951185s, valid=True
2026-05-29T22:15:28.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:15:28.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:15:28.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:15:12, diff=16.954137s, valid=True
2026-05-29T22:15:28.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:15:28.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:15:28.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:15:16, diff=12.960931s, valid=True
2026-05-29T22:15:28.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:15:28.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:15:28.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:15:28.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:15:28.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:15:28.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:15:28.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:15:12, diff=16.964038s, valid=True
2026-05-29T22:15:28.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:15:28.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:15:28.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:15:28.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018370.96473s, valid=True
2026-05-29T22:15:28.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:15:28.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:15:28.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:15:28.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:15:28.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:15:29.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:15:29.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:15:29.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:15:29.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:15:29.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:15:29.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:15:29.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:15:29.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:15:29.402 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:15:29.618 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:15:30.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:15:30.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:15: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-05-29T22:15: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-05-29T22:15:30.367 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:15:30.367 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:16:00.397 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:16:00.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:16:00.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:16:00.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:16:00.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:16:00.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:16:00.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T22:16:00.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:16:00.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-05-29T22:16:00.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:16:00.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:16:00.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:16:00.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-05-29T22:16:03.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-05-29T22:16:03.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:16:03.491 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:16:03.491 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:16:03.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:16:03.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:16:03.512 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:16:03.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:16:03.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:16:03.512 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:16:03.512 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:16:03.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:16:03.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:16:03.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:16:03.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:16:03.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:16:03.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:16:03.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:16:03.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:16:03.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:16:03.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:16:03.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:16:03.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:16:03.832 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:15:47
2026-05-29T22:16:03.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73002, datetime.datetime(2026, 5, 29, 22, 15, 47), datetime.datetime(2026, 5, 29, 22, 15, 47), 'salt', 9.26, 70.17, None, 19.3, 34.16, 5.15, 832.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:16:03.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:16:03.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:16:03.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:15:47, diff=16.838103s, valid=True
2026-05-29T22:16:03.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:16:03.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:16:03.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:16:12, diff=-8.15905s, valid=True
2026-05-29T22:16:03.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:16:03.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:16:03.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:15:44, diff=19.847809s, valid=True
2026-05-29T22:16:03.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:16:03.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:16:03.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:16:03.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:16:03.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:16:03.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:16:03.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:16:12, diff=-8.149154s, valid=True
2026-05-29T22:16:03.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:16:03.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:16:03.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:16:03.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018405.851507s, valid=True
2026-05-29T22:16:03.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:16:03.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:16:03.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:16:03.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:16:03.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:16:03.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:16:03.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:16:03.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:16:03.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:16:03.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:16:04.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:16:04.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:16:04.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:16:04.169 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:16:04.388 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:16:04.740 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:16:04.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:16:04.843 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:16:04.843 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:16:05.101 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:16:05.101 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:16:35.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:16:35.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:16:35.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:16:35.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:16:35.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:16:35.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:16:35.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T22:16:35.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:16:35.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-05-29T22:16:35.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:16:35.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:16:35.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:16: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-05-29T22:16:39.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-05-29T22:16:39.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:16:39.989 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:16:39.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:16:39.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:16:40.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:16:40.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:16:40.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:16:40.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:16:40.010 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:16:40.010 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:16:40.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:16:40.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:16:40.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:16:40.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:16:40.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:16:40.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:16:40.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:16:40.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:16:40.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:16:40.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:16:40.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:16:40.269 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:16:40.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:16:17
2026-05-29T22:16:40.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73003, datetime.datetime(2026, 5, 29, 22, 16, 17), datetime.datetime(2026, 5, 29, 22, 16, 17), 'salt', 9.29, 70.21, None, 20.85, 36.84, 5.14, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:16:40.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:16:40.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:16:40.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:16:17, diff=23.334454s, valid=True
2026-05-29T22:16:40.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:16:40.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:16:40.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:16:12, diff=28.337387s, valid=True
2026-05-29T22:16:40.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:16:40.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:16:40.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:16:14, diff=26.344245s, valid=True
2026-05-29T22:16:40.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:16:40.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:16:40.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:16:40.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:16:40.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:16:40.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:16:40.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:16:12, diff=28.347339s, valid=True
2026-05-29T22:16:40.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:16:40.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:16:40.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:16:40.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018442.348023s, valid=True
2026-05-29T22:16:40.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:16:40.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:16:40.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:16:40.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:16:40.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:16:40.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:16:40.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:16:40.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:16:40.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:16:40.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:16:40.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:16:40.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:16:40.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:16:40.668 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:16:40.956 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:16:41.310 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:16:41.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:16:41.412 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:16:41.412 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:16:41.877 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:16:41.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:17:11.881 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:17:11.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:17:11.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:17:12.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:17:12.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:17:12.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:17:12.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T22:17:12.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:17:12.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-05-29T22:17:12.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:17:12.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:17:12.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:17:12.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-05-29T22:17:57.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-05-29T22:17:57.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:17:57.619 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:17:57.619 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:17:57.628 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:17:57.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:17:57.640 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:17:57.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:17:57.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:17:57.640 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:17:57.640 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:17:57.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:17:57.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:17:57.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:17:57.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:17:57.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:17:57.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:17:57.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:17:57.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:17:57.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:17:57.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:17:57.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:17:57.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:17:57.956 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:17:48
2026-05-29T22:17:57.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73006, datetime.datetime(2026, 5, 29, 22, 17, 48), datetime.datetime(2026, 5, 29, 22, 17, 48), 'salt', 9.29, 69.84, None, 18.14, 42.87, 5.21, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:17:57.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:17:57.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:17:57.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:17:48, diff=9.963226s, valid=True
2026-05-29T22:17:57.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:17:57.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:17:57.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:18:12, diff=-14.034005s, valid=True
2026-05-29T22:17:57.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:17:57.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:17:57.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:17:45, diff=12.972495s, valid=True
2026-05-29T22:17:57.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:17:57.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:17:57.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:17:57.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:17:57.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:17:57.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:17:57.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:18:12, diff=-14.024534s, valid=True
2026-05-29T22:17:57.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:17:57.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:17:57.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:17:57.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018519.976141s, valid=True
2026-05-29T22:17:57.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:17:57.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:17:57.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:17:57.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:17:57.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:17:58.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:17:58.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:17:58.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:17:58.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:17:58.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:17:58.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:17:58.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:17:58.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:17:58.293 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:17:58.505 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:17:58.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:17:58.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:17:58.951 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:17:58.951 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:17:59.145 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:17:59.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:18:29.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:18:29.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:18:29.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:18:29.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:18:29.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:18:29.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:18:29.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-05-29T22:18:29.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:18:29.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-05-29T22:18:29.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:18:29.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:18:29.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:18:29.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-05-29T22:18:32.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-05-29T22:18:32.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:18:32.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:18:32.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:18:32.441 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:18:32.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:18:32.455 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:18:32.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:18:32.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:18:32.456 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:18:32.456 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:18:32.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:18:32.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:18:32.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:18:32.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:18:32.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:18:32.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:18:32.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:18:32.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:18:32.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:18:32.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:18:32.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:18:32.774 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:18:32.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:18:18
2026-05-29T22:18:32.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73007, datetime.datetime(2026, 5, 29, 22, 18, 18), datetime.datetime(2026, 5, 29, 22, 18, 18), 'salt', 9.39, 69.84, None, 20.25, 41.48, 5.22, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:18:32.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:18:32.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:18:32.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:18:18, diff=14.843236s, valid=True
2026-05-29T22:18:32.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:18:32.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:18:32.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:18:12, diff=20.846678s, valid=True
2026-05-29T22:18:32.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:18:32.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:18:32.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:18:15, diff=17.854426s, valid=True
2026-05-29T22:18:32.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:18:32.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:18:32.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:18:32.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:18:32.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:18:32.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:18:32.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:18:12, diff=20.857798s, valid=True
2026-05-29T22:18:32.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:18:32.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:18:32.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:18:32.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018554.858492s, valid=True
2026-05-29T22:18:32.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:18:32.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:18:32.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:18:32.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:18:32.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:18:32.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:18:32.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:18:32.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:18:32.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:18:33.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:18:33.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:18:33.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:18:33.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:18:33.291 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:18:33.503 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:18:33.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:18:33.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:18:33.951 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:18:33.951 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:18:34.238 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:18:34.239 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:19:04.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:19:04.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:19:04.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:19:04.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:19:04.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:19:04.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:19:04.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-05-29T22:19:04.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:19:04.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T22:19:04.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:19:04.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:19:04.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:19:04.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-05-29T22:19:25.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-05-29T22:19:25.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:19:25.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:19:25.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:19:25.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:19:25.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:19:25.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:19:25.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:19:25.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:19:25.841 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:19:25.841 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:19:25.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:19:25.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:19:25.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:19:26.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:19:26.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:19:26.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:19:26.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:19:26.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:19:26.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:19:26.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:19:26.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:19:26.109 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:19:26.172 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:19:19
2026-05-29T22:19:26.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73009, datetime.datetime(2026, 5, 29, 22, 19, 19), datetime.datetime(2026, 5, 29, 22, 19, 18), 'salt', 9.26, 70.04, None, 18.74, 39.51, 5.17, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:19:26.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:19:26.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:19:26.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:19:18, diff=8.178446s, valid=True
2026-05-29T22:19:26.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:19:26.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:19:26.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:19:12, diff=14.181325s, valid=True
2026-05-29T22:19:26.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:19:26.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:19:26.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:19:17, diff=9.188145s, valid=True
2026-05-29T22:19:26.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:19:26.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:19:26.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:19:26.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:19:26.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:19:26.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:19:26.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:19:12, diff=14.191223s, valid=True
2026-05-29T22:19:26.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:19:26.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:19:26.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:19:26.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018608.191907s, valid=True
2026-05-29T22:19:26.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:19:26.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:19:26.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:19:26.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:19:26.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:19:26.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:19:26.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:19:26.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:19:26.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:19:26.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:19:26.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:19:26.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:19:26.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:19:26.518 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:19:26.740 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:19:27.093 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:19:27.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:19:27.200 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:19:27.200 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:19:27.482 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:19:27.482 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:19:57.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:19:57.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:19:57.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:19:57.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:19:57.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:19:58.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:19:58.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-05-29T22:19:58.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:19:58.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-05-29T22:19:58.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:19:58.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:19:58.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:19:58.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-05-29T22:20:00.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-05-29T22:20:00.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:20:00.727 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:20:00.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:20:00.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:20:00.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:20:00.747 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:20:00.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:20:00.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:20:00.748 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:20:00.748 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:20:00.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:20:00.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:20:00.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:20:00.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:20:00.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:20:00.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:20:00.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:20:01.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:20:01.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:20:01.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:20:01.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:20:01.019 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:20:01.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:19:49
2026-05-29T22:20:01.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73010, datetime.datetime(2026, 5, 29, 22, 19, 49), datetime.datetime(2026, 5, 29, 22, 19, 49), 'salt', 9.22, 70.27, None, 19.02, 43.46, 5.12, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:20:01.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:20:01.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:20:01.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:19:49, diff=12.100396s, valid=True
2026-05-29T22:20:01.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:20:01.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:20:01.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:20:12, diff=-10.896755s, valid=True
2026-05-29T22:20:01.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:20:01.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:20:01.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:19:46, diff=15.109955s, valid=True
2026-05-29T22:20:01.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:20:01.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:20:01.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:20:01.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:20:01.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:20:01.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:20:01.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:20:12, diff=-10.886852s, valid=True
2026-05-29T22:20:01.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:20:01.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:20:01.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:20:01.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018643.113853s, valid=True
2026-05-29T22:20:01.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:20:01.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:20:01.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:20:01.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:20:01.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:20:01.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:20:01.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:20:01.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:20:01.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:20:01.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:20:01.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:20:01.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:20:01.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:20:01.506 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:20:01.770 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:20:02.122 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:20:02.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:20:02.225 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:20:02.225 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:20:02.407 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:20:02.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:20:32.437 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:20:32.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:20:32.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:20:32.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:20:32.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:20:32.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:20:32.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-05-29T22:20:32.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:20: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-05-29T22:20:32.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:20:32.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:20:32.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:20:32.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-05-29T22:20:35.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-05-29T22:20:35.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:20:35.494 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:20:35.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:20:35.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:20:35.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:20:35.515 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:20:35.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:20:35.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:20:35.515 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:20:35.515 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:20:35.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:20:35.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:20:35.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:20:35.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:20:35.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:20:35.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:20:35.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:20:35.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:20:35.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:20:35.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:20:35.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:20:35.788 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:20:35.848 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:20:19
2026-05-29T22:20:35.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73011, datetime.datetime(2026, 5, 29, 22, 20, 19), datetime.datetime(2026, 5, 29, 22, 20, 19), 'salt', 9.29, 70.47, None, 17.75, 41.51, 5.08, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:20:35.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:20:35.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:20:35.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:20:19, diff=16.854786s, valid=True
2026-05-29T22:20:35.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:20:35.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:20:35.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:20:12, diff=23.857882s, valid=True
2026-05-29T22:20:35.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:20:35.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:20:35.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:20:16, diff=19.864503s, valid=True
2026-05-29T22:20:35.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:20:35.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:20:35.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:20:35.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:20:35.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:20:35.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:20:35.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:20:12, diff=23.867524s, valid=True
2026-05-29T22:20:35.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:20:35.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:20:35.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:20:35.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018677.868195s, valid=True
2026-05-29T22:20:35.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:20:35.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:20:35.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:20:35.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:20:35.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:20:35.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:20:35.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:20:35.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:20:35.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:20:36.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:20:36.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:20:36.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:20:36.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:20:36.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:20:36.420 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:20:36.782 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:20:36.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:20:36.886 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:20:36.886 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:20:37.097 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:20:37.098 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:21:07.127 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:21:07.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:21:07.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:21:07.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:21:07.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:21:07.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:21:07.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T22:21:07.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:21:07.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-05-29T22:21:07.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:21:07.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:21:07.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:21:07.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-05-29T22:21:10.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-05-29T22:21:10.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:21:10.233 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:21:10.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:21:10.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:21:10.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:21:10.254 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:21:10.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:21:10.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:21:10.254 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:21:10.254 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:21:10.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:21:10.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:21:10.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:21:10.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:21:10.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:21:10.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:21:10.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:21:10.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:21:10.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:21:10.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:21:10.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:21:10.515 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:21:10.574 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:20:49
2026-05-29T22:21:10.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73012, datetime.datetime(2026, 5, 29, 22, 20, 49), datetime.datetime(2026, 5, 29, 22, 20, 49), 'salt', 9.26, 70.8, None, 19.37, 40.99, 5.02, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:21:10.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:21:10.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:21:10.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:20:49, diff=21.58048s, valid=True
2026-05-29T22:21:10.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:21:10.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:21:10.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:21:12, diff=-1.416628s, valid=True
2026-05-29T22:21:10.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:21:10.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:21:10.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:20:46, diff=24.590174s, valid=True
2026-05-29T22:21:10.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:21:10.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:21:10.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:21:10.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:21:10.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:21:10.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:21:10.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:21:12, diff=-1.406747s, valid=True
2026-05-29T22:21:10.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:21:10.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:21:10.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:21:10.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018712.593927s, valid=True
2026-05-29T22:21:10.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:21:10.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:21:10.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:21:10.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:21:10.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:21:10.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:21:10.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:21:10.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:21:10.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:21:10.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:21:10.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:21:10.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:21:10.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:21:10.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:21:11.211 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:21:11.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:21:11.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:21:11.666 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:21:11.666 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:21:11.818 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:21:11.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:21:41.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:21:41.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:21:41.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:21:42.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:21:42.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:21:42.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:21:42.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-05-29T22:21:42.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:21:42.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-05-29T22:21:42.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:21:42.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:21:42.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:21:42.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T22:21:44.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-05-29T22:21:44.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:21:44.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:21:44.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:21:44.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:21:44.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:21:44.994 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:21:44.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:21:44.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:21:44.995 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:21:44.995 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:21:44.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:21:45.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:21:45.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:21:45.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:21:45.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:21:45.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:21:45.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:21:45.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:21:45.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:21:45.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:21:45.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:21:45.257 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:21:45.319 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:21:20
2026-05-29T22:21:45.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73013, datetime.datetime(2026, 5, 29, 22, 21, 20), datetime.datetime(2026, 5, 29, 22, 21, 19), 'salt', 9.19, 70.8, None, 19.58, 30.83, 5.01, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:21:45.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:21:45.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:21:45.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:21:19, diff=26.325334s, valid=True
2026-05-29T22:21:45.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:21:45.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:21:45.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:21:12, diff=33.328134s, valid=True
2026-05-29T22:21:45.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:21:45.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:21:45.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:21:16, diff=29.334768s, valid=True
2026-05-29T22:21:45.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:21:45.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:21:45.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:21:45.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:21:45.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:21:45.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:21:45.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:21:12, diff=33.33779s, valid=True
2026-05-29T22:21:45.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:21:45.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:21:45.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:21:45.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018747.338444s, valid=True
2026-05-29T22:21:45.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:21:45.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:21:45.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:21:45.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:21:45.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:21:45.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:21:45.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:21:45.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:21:45.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:21:45.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:21:45.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:21:45.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:21:45.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:21:45.657 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:21:45.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:21:46.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:21:46.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:21:46.324 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:21:46.324 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:21:46.513 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:21:46.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:22:16.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:22:16.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:22:16.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:22:16.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:22:16.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:22:17.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:22:17.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-05-29T22:22:17.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:22:17.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-05-29T22:22:17.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:22:17.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:22:17.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:22:17.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T22:22:42.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-05-29T22:22:42.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:22:42.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:22:42.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:22:42.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:22:42.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:22:42.458 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:22:42.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:22:42.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:22:42.458 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:22:42.458 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:22:42.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:22:42.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:22:42.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:22:42.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:22:42.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:22:42.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:22:42.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:22:42.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:22:42.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:22:42.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:22:42.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:22:42.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:22:42.789 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:22:20
2026-05-29T22:22:42.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73015, datetime.datetime(2026, 5, 29, 22, 22, 20), datetime.datetime(2026, 5, 29, 22, 22, 20), 'salt', 9.12, 70.74, None, 22.83, 38.9, 5.02, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:22:42.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:22:42.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:22:42.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:22:20, diff=22.795856s, valid=True
2026-05-29T22:22:42.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:22:42.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:22:42.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:22:12, diff=30.798681s, valid=True
2026-05-29T22:22:42.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:22:42.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:22:42.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:22:17, diff=25.805704s, valid=True
2026-05-29T22:22:42.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:22:42.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:22:42.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:22:42.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:22:42.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:22:42.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:22:42.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:22:12, diff=30.808737s, valid=True
2026-05-29T22:22:42.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:22:42.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:22:42.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:22:42.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018804.809389s, valid=True
2026-05-29T22:22:42.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:22:42.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:22:42.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:22:42.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:22:42.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:22:42.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:22:42.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:22:42.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:22:42.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:22:42.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:22:43.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:22:43.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:22:43.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:22:43.144 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:22:43.368 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:22:43.723 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:22:43.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:22:43.827 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:22:43.827 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:22:44.082 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:22:44.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:23:14.111 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:23:14.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:23:14.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:23:14.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:23:14.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:23:14.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:23:14.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-05-29T22:23:14.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:23:14.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T22:23:14.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:23:14.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:23:14.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:23:14.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-05-29T22:23:17.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-05-29T22:23:17.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:23:17.394 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:23:17.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:23:17.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:23:17.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:23:17.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:23:17.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:23:17.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:23:17.422 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:23:17.422 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:23:17.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:23:17.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:23:17.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:23:17.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:23:17.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:23:17.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:23:17.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:23:17.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:23:17.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:23:17.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:23:17.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:23:17.702 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:23:17.767 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:22:50
2026-05-29T22:23:17.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73016, datetime.datetime(2026, 5, 29, 22, 22, 50), datetime.datetime(2026, 5, 29, 22, 22, 50), 'salt', 9.22, 70.44, None, 20.25, 38.67, 5.08, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:23:17.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:23:17.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:23:17.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:22:50, diff=27.774154s, valid=True
2026-05-29T22:23:17.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:23:17.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:23:17.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:23:12, diff=5.777322s, valid=True
2026-05-29T22:23:17.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:23:17.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:23:17.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:22:47, diff=30.784808s, valid=True
2026-05-29T22:23:17.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:23:17.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:23:17.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:23:17.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:23:17.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:23:17.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:23:17.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:23:12, diff=5.788262s, valid=True
2026-05-29T22:23:17.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:23:17.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:23:17.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:23:17.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018839.789026s, valid=True
2026-05-29T22:23:17.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:23:17.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:23:17.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:23:17.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:23:17.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:23:17.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:23:17.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:23:17.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:23:17.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:23:17.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:23:18.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:23:18.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:23:18.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:23:18.138 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:23:18.363 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:23:18.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:23:18.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:23:18.886 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:23:18.886 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:23:21.459 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:23:21.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:23:51.483 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:23:51.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:23:51.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:23:51.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:23:51.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:23:51.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:23:51.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-05-29T22:23:51.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:23:51.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-05-29T22:23:51.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:23:51.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:23:51.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:23:51.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-05-29T22:23:56.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-05-29T22:23:56.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:23:56.334 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:23:56.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:23:56.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:23:56.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:23:56.359 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:23:56.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:23:56.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:23:56.360 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:23:56.360 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:23:56.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:23:56.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:23:56.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:23:56.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:23:56.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:23:56.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:23:56.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:23:56.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:23:56.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:23:56.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:23:56.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:23:56.609 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:23:56.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:23:51
2026-05-29T22:23:56.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73018, datetime.datetime(2026, 5, 29, 22, 23, 51), datetime.datetime(2026, 5, 29, 22, 23, 50), 'salt', 9.16, 70.5, None, 20.04, 49.96, 5.08, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:23:56.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:23:56.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:23:56.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:23:50, diff=6.682039s, valid=True
2026-05-29T22:23:56.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:23:56.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:23:56.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:24:12, diff=-15.315149s, valid=True
2026-05-29T22:23:56.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:23:56.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:23:56.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:23:50, diff=6.69148s, valid=True
2026-05-29T22:23:56.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:23:56.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:23:56.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:23:56.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:23:56.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:23:56.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:23:56.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:24:12, diff=-15.305483s, valid=True
2026-05-29T22:23:56.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:23:56.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:23:56.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:23:56.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018878.69518s, valid=True
2026-05-29T22:23:56.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:23:56.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:23:56.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:23:56.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:23:56.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:23:56.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:23:56.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:23:56.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:23:56.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:23:56.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:23:56.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:23:56.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:23:56.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:23:57.010 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:23:57.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:23:57.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:23:57.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:23:57.670 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:23:57.670 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:23:57.825 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:23:57.826 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:24:27.856 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:24:27.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:24:27.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:24:28.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:24:28.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:24:28.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:24:28.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-05-29T22:24:28.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:24:28.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-05-29T22:24:28.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:24:28.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:24:28.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:24:28.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T22:25:12.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-05-29T22:25:12.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:25:12.359 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:25:12.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:25:12.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:25:12.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:25:12.380 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:25:12.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:25:12.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:25:12.381 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:25:12.381 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:25:12.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:25:12.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:25:12.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:25:12.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:25:12.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:25:12.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:25:12.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:25:12.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:25:12.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:25:12.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:25:12.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:25:12.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:25:12.697 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:24:51
2026-05-29T22:25:12.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73020, datetime.datetime(2026, 5, 29, 22, 24, 51), datetime.datetime(2026, 5, 29, 22, 24, 51), 'salt', 9.29, 70.57, None, 18.28, 45.54, 5.06, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:25:12.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:25:12.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:25:12.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:24:51, diff=21.703878s, valid=True
2026-05-29T22:25:12.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:25:12.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:25:12.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:25:12, diff=0.706694s, valid=True
2026-05-29T22:25:12.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:25:12.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:25:12.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:24:48, diff=24.713423s, valid=True
2026-05-29T22:25:12.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:25:12.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:25:12.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:25:12.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:25:12.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:25:12.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:25:12.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:25:12, diff=0.716455s, valid=True
2026-05-29T22:25:12.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:25:12.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:25:12.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:25:12.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018954.717149s, valid=True
2026-05-29T22:25:12.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:25:12.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:25:12.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:25:12.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:25:12.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:25:12.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:25:12.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:25:12.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:25:12.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:25:12.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:25:12.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:25:12.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:25:12.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:25:13.034 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:25:13.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:25:13.667 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:25:13.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:25:13.768 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:25:13.768 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:25:13.958 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:25:13.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:25:43.966 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:25:43.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:25:43.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:25:44.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:25:44.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:25:44.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:25:44.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-05-29T22:25:44.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:25:44.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-05-29T22:25:44.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:25:44.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:25:44.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:25: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-05-29T22:25:47.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-05-29T22:25:47.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:25:47.468 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:25:47.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:25:47.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:25:47.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:25:47.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:25:47.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:25:47.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:25:47.488 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:25:47.488 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:25:47.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:25:47.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:25:47.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:25:47.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:25:47.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:25:47.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:25:47.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:25:47.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:25:47.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:25:47.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:25:47.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:25:47.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:25:47.806 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:25:21
2026-05-29T22:25:47.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73021, datetime.datetime(2026, 5, 29, 22, 25, 21), datetime.datetime(2026, 5, 29, 22, 25, 21), 'salt', 9.29, 70.6, None, 21.7, 40.12, 5.06, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:25:47.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:25:47.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:25:47.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:25:21, diff=26.812848s, valid=True
2026-05-29T22:25:47.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:25:47.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:25:47.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:25:12, diff=35.815662s, valid=True
2026-05-29T22:25:47.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:25:47.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:25:47.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:25:19, diff=28.82237s, valid=True
2026-05-29T22:25:47.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:25:47.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:25:47.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:25:47.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:25:47.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:25:47.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:25:47.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:25:12, diff=35.825394s, valid=True
2026-05-29T22:25:47.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:25:47.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:25:47.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:25:47.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1018989.826063s, valid=True
2026-05-29T22:25:47.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:25:47.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:25:47.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:25:47.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:25:47.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:25:47.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:25:47.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:25:47.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:25:47.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:25:47.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:25:48.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:25:48.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:25:48.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:25:48.142 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:25:48.357 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:25:48.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:25:48.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:25:48.804 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:25:48.804 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:25:48.988 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:25:48.988 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:26:19.018 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:26:19.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:26:19.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:26:19.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:26:19.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:26:19.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:26: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-05-29T22:26:19.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:26:19.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-05-29T22:26:19.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:26:19.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:26:19.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:26:19.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-05-29T22:26:22.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-05-29T22:26:22.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:26:22.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:26:22.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:26:22.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:26:22.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:26:22.725 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:26:22.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:26:22.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:26:22.726 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:26:22.726 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:26:22.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:26:22.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:26:22.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:26:22.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:26:22.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:26:22.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:26:22.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:26:22.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:26:22.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:26:22.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:26:22.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:26:22.981 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:26:23.039 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:26:22
2026-05-29T22:26:23.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73023, datetime.datetime(2026, 5, 29, 22, 26, 22), datetime.datetime(2026, 5, 29, 22, 26, 21), 'salt', 9.19, 70.7, None, 21.0, 34.04, 5.03, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:26:23.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:26:23.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:26:23.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:26:21, diff=2.046032s, valid=True
2026-05-29T22:26:23.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:26:23.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:26:23.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:26:12, diff=11.048851s, valid=True
2026-05-29T22:26:23.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:26:23.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:26:23.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:26:19, diff=4.055516s, valid=True
2026-05-29T22:26:23.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:26:23.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:26:23.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:26:23.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:26:23.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:26:23.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:26:23.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:26:12, diff=11.05853s, valid=True
2026-05-29T22:26:23.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:26:23.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:26:23.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:26:23.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019025.059204s, valid=True
2026-05-29T22:26:23.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:26:23.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:26:23.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:26:23.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:26:23.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:26:23.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:26:23.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:26:23.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:26:23.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:26:23.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:26:23.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:26:23.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:26:23.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:26:23.449 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:26:23.661 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:26:24.010 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:26:24.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:26:24.112 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:26:24.112 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:26:24.369 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:26:24.370 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:26:54.397 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:26:54.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:26:54.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:26:54.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:26:54.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:26:54.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:26:54.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-05-29T22:26:54.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:26:54.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-05-29T22:26:54.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:26:54.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:26:54.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:26:54.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-05-29T22:26:59.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-05-29T22:26:59.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:26:59.230 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:26:59.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:26:59.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:26:59.252 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:26:59.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:26:59.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:26:59.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:26:59.252 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:26:59.252 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:26:59.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:26:59.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:26:59.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:26:59.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:26:59.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:26:59.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:26:59.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:26:59.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:26:59.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:26:59.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:26:59.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:26:59.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:26:59.561 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:26:52
2026-05-29T22:26:59.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73024, datetime.datetime(2026, 5, 29, 22, 26, 52), datetime.datetime(2026, 5, 29, 22, 26, 52), 'salt', 9.16, 70.74, None, 22.9, 33.93, 5.03, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:26:59.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:26:59.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:26:59.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:26:52, diff=7.567693s, valid=True
2026-05-29T22:26:59.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:26:59.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:26:59.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:27:12, diff=-12.42951s, valid=True
2026-05-29T22:26:59.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:26:59.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:26:59.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:26:49, diff=10.577091s, valid=True
2026-05-29T22:26:59.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:26:59.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:26:59.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:26:59.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:26:59.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:26:59.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:26:59.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:27:12, diff=-12.419937s, valid=True
2026-05-29T22:26:59.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:26:59.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:26:59.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:26:59.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019061.580725s, valid=True
2026-05-29T22:26:59.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:26:59.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:26:59.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:26:59.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:26:59.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:26:59.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:26:59.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:26:59.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:26:59.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:26:59.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:26:59.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:26:59.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:26:59.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:26:59.906 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:27:00.161 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:27:00.509 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:27:00.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:27:00.609 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:27:00.609 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:27:00.795 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:27:00.795 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:27:30.826 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:27:30.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:27:30.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:27:31.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:27:31.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:27:31.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:27:31.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-05-29T22:27:31.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:27:31.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-05-29T22:27:31.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:27:31.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:27:31.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:27:31.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-05-29T22:27:34.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-05-29T22:27:34.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:27:34.144 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:27:34.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:27:34.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:27:34.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:27:34.165 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:27:34.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:27:34.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:27:34.165 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:27:34.165 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:27:34.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:27:34.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:27:34.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:27:34.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:27:34.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:27:34.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:27:34.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:27:34.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:27:34.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:27:34.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:27:34.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:27:34.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:27:34.478 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:27:22
2026-05-29T22:27:34.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73025, datetime.datetime(2026, 5, 29, 22, 27, 22), datetime.datetime(2026, 5, 29, 22, 27, 22), 'salt', 9.22, 70.7, None, 21.07, 44.46, 5.03, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:27:34.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:27:34.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:27:34.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:27:22, diff=12.484893s, valid=True
2026-05-29T22:27:34.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:27:34.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:27:34.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:27:12, diff=22.48776s, valid=True
2026-05-29T22:27:34.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:27:34.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:27:34.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:27:21, diff=13.494485s, valid=True
2026-05-29T22:27:34.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:27:34.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:27:34.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:27:34.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:27:34.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:27:34.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:27:34.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:27:12, diff=22.497524s, valid=True
2026-05-29T22:27:34.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:27:34.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:27:34.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:27:34.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019096.4982s, valid=True
2026-05-29T22:27:34.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:27:34.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:27:34.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:27:34.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:27:34.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:27:34.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:27:34.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:27:34.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:27:34.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:27:34.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:27:34.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:27:34.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:27:34.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:27:34.904 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:27:35.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:27:35.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:27:35.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:27:35.587 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:27:35.587 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:27:35.769 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:27:35.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:28:05.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:28:05.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:28:05.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:28:06.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:28:06.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:28:06.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:28:06.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-05-29T22:28:06.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:28:06.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-05-29T22:28:06.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:28:06.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:28:06.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:28:06.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-05-29T22:28:09.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-05-29T22:28:09.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:28:09.581 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:28:09.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:28:09.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:28:09.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:28:09.605 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:28:09.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:28:09.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:28:09.605 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:28:09.605 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:28:09.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:28:09.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:28:09.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:28:09.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:28:09.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:28:09.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:28:09.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:28:09.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:28:09.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:28:09.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:28:09.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:28:09.865 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:28:09.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:27:53
2026-05-29T22:28:09.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73026, datetime.datetime(2026, 5, 29, 22, 27, 53), datetime.datetime(2026, 5, 29, 22, 27, 52), 'salt', 9.32, 70.67, None, 18.84, 47.38, 5.04, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:28:09.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:28:09.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:28:09.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:27:52, diff=17.938755s, valid=True
2026-05-29T22:28:09.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:28:09.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:28:09.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:28:12, diff=-2.055137s, valid=True
2026-05-29T22:28:09.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:28:09.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:28:09.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:27:52, diff=17.951833s, valid=True
2026-05-29T22:28:09.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:28:09.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:28:09.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:28:09.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:28:09.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:28:09.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:28:09.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:28:12, diff=-2.044845s, valid=True
2026-05-29T22:28:09.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:28:09.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:28:09.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:28:09.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019131.955917s, valid=True
2026-05-29T22:28:09.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:28:09.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:28:09.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:28:09.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:28:09.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:28:10.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:28:10.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:28:10.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:28:10.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:28:10.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:28:10.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:28:10.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:28:10.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:28:10.293 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:28:10.507 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:28:10.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:28:10.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:28:10.954 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:28:10.954 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:28:11.236 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:28:11.236 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:28:41.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:28:41.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:28:41.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:28:41.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:28:41.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:28:41.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:28:41.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-05-29T22:28:41.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:28:41.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-05-29T22:28:41.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:28:41.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:28:41.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:28:41.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-05-29T22:29:15.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-05-29T22:29:15.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:29:15.781 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:29:15.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:29:15.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:29:15.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:29:15.802 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:29:15.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:29:15.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:29:15.803 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:29:15.803 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:29:15.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:29:15.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:29:15.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:29:15.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:29:15.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:29:16.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:29:16.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:29:16.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:29:16.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:29:16.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:29:16.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:29:16.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:29:16.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:28:53
2026-05-29T22:29:16.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73028, datetime.datetime(2026, 5, 29, 22, 28, 53), datetime.datetime(2026, 5, 29, 22, 28, 53), 'salt', 9.16, 70.54, None, 18.38, 45.1, 5.07, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:29:16.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:29:16.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:29:16.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:28:53, diff=23.12258s, valid=True
2026-05-29T22:29:16.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:29:16.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:29:16.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:29:12, diff=4.125416s, valid=True
2026-05-29T22:29:16.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:29:16.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:29:16.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:28:50, diff=26.132016s, valid=True
2026-05-29T22:29:16.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:29:16.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:29:16.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:29:16.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:29:16.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:29:16.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:29:16.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:29:12, diff=4.134998s, valid=True
2026-05-29T22:29:16.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:29:16.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:29:16.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:29:16.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019198.135651s, valid=True
2026-05-29T22:29:16.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:29:16.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:29:16.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:29:16.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:29:16.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:29:16.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:29:16.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:29:16.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:29:16.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:29:16.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:29:16.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:29:16.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:29:16.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:29:16.516 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:29:16.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:29:17.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:29:17.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:29:17.182 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:29:17.182 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:29:17.431 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:29:17.432 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:29:47.447 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:29:47.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:29:47.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:29:47.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:29:47.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:29:48.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:29:48.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-05-29T22:29:48.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:29:48.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-05-29T22:29:48.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:29:48.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:29:48.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:29:48.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-05-29T22:29:50.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-05-29T22:29:50.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:29:50.889 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:29:50.890 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:29:50.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:29:50.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:29:50.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:29:50.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:29:50.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:29:50.910 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:29:50.911 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:29:50.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:29:50.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:29:50.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:29:51.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:29:51.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:29:51.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:29:51.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:29:51.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:29:51.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:29:51.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:29:51.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:29:51.161 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:29:51.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:29:23
2026-05-29T22:29:51.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73029, datetime.datetime(2026, 5, 29, 22, 29, 23), datetime.datetime(2026, 5, 29, 22, 29, 23), 'salt', 9.26, 70.6, None, 18.84, 44.98, 5.06, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:29:51.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:29:51.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:29:51.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:29:23, diff=28.225918s, valid=True
2026-05-29T22:29:51.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:29:51.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:29:51.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:29:12, diff=39.228767s, valid=True
2026-05-29T22:29:51.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:29:51.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:29:51.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:29:21, diff=30.235526s, valid=True
2026-05-29T22:29:51.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:29:51.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:29:51.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:29:51.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:29:51.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:29:51.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:29:51.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:29:12, diff=39.238535s, valid=True
2026-05-29T22:29:51.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:29:51.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:29:51.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:29:51.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019233.239205s, valid=True
2026-05-29T22:29:51.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:29:51.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:29:51.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:29:51.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:29:51.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:29:51.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:29:51.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:29:51.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:29:51.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:29:51.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:29:51.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:29:51.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:29:51.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:29:51.556 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:29:51.793 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:29:52.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:29:52.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:29:52.245 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:29:52.245 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:29:52.540 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:29:52.540 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:30:22.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:30:22.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:30:22.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:30:22.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:30:22.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:30:23.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:30:23.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-05-29T22:30:23.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:30:23.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-05-29T22:30:23.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:30:23.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:30:23.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:30:23.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T22:30:25.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-05-29T22:30:25.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:30:25.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:30:25.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:30:25.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:30:25.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:30:25.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:30:25.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:30:25.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:30:25.921 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:30:25.921 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:30:25.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:30:26.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:30:26.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:30:26.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:30:26.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:30:26.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:30:26.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:30:26.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:30:26.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:30:26.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:30:26.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:30:26.184 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:30:26.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:30:24
2026-05-29T22:30:26.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73031, datetime.datetime(2026, 5, 29, 22, 30, 24), datetime.datetime(2026, 5, 29, 22, 30, 23), 'salt', 9.19, 70.57, None, 19.41, 46.46, 5.06, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:30:26.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:30:26.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:30:26.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:30:23, diff=3.249705s, valid=True
2026-05-29T22:30:26.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:30:26.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:30:26.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:30:12, diff=14.252551s, valid=True
2026-05-29T22:30:26.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:30:26.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:30:26.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:30:21, diff=5.259064s, valid=True
2026-05-29T22:30:26.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:30:26.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:30:26.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:30:26.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:30:26.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:30:26.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:30:26.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:30:12, diff=14.2621s, valid=True
2026-05-29T22:30:26.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:30:26.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:30:26.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:30:26.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019268.262768s, valid=True
2026-05-29T22:30:26.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:30:26.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:30:26.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:30:26.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:30:26.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:30:26.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:30:26.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:30:26.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:30:26.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:30:26.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:30:26.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:30:26.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:30:26.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:30:26.591 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:30:26.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:30:27.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:30:27.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:30:27.289 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:30:27.289 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:30:27.626 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:30:27.626 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:30:57.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:30:57.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:30:57.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:30:57.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:30:57.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:30:58.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:30:58.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-05-29T22:30:58.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:30:58.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-05-29T22:30:58.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:30:58.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:30:58.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:30:58.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-05-29T22:31:01.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-05-29T22:31:01.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:31:01.216 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:31:01.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:31:01.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:31:01.236 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:31:01.236 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:31:01.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:31:01.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:31:01.237 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:31:01.237 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:31:01.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:31:01.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:31:01.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:31:01.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:31:01.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:31:01.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:31:01.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:31:01.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:31:01.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:31:01.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:31:01.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:31:01.488 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:31:01.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:30:54
2026-05-29T22:31:01.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73032, datetime.datetime(2026, 5, 29, 22, 30, 54), datetime.datetime(2026, 5, 29, 22, 30, 54), 'salt', 9.16, 70.57, None, 20.57, 38.46, 5.06, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:31:01.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:31:01.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:31:01.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:30:54, diff=7.555412s, valid=True
2026-05-29T22:31:01.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:31:01.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:31:01.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:31:12, diff=-10.441772s, valid=True
2026-05-29T22:31:01.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:31:01.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:31:01.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:30:51, diff=10.564969s, valid=True
2026-05-29T22:31:01.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:31:01.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:31:01.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:31:01.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:31:01.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:31:01.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:31:01.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:31:12, diff=-10.432017s, valid=True
2026-05-29T22:31:01.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:31:01.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:31:01.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:31:01.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019303.56867s, valid=True
2026-05-29T22:31:01.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:31:01.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:31:01.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:31:01.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:31:01.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:31:01.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:31:01.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:31:01.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:31:01.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:31:01.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:31:01.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:31:01.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:31:01.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:31:01.884 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:31:02.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:31:02.523 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:31:02.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:31:02.623 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:31:02.623 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:31:02.877 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:31:02.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:31:32.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:31:32.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:31:32.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:31:33.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:31:33.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:31:33.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:31:33.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-05-29T22:31:33.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:31:33.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-05-29T22:31:33.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:31:33.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:31:33.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:31:33.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-05-29T22:31:37.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-05-29T22:31:37.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:31:37.472 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:31:37.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:31:37.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:31:37.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:31:37.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:31:37.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:31:37.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:31:37.496 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:31:37.496 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:31:37.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:31:37.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:31:37.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:31:37.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:31:37.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:31:37.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:31:37.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:31:37.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:31:37.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:31:37.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:31:37.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:31:37.746 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:31:37.812 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:31:24
2026-05-29T22:31:37.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73033, datetime.datetime(2026, 5, 29, 22, 31, 24), datetime.datetime(2026, 5, 29, 22, 31, 24), 'salt', 9.19, 70.67, None, 18.03, 45.43, 5.04, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:31:37.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:31:37.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:31:37.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:31:24, diff=13.818154s, valid=True
2026-05-29T22:31:37.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:31:37.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:31:37.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:31:12, diff=25.821017s, valid=True
2026-05-29T22:31:37.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:31:37.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:31:37.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:31:22, diff=15.827759s, valid=True
2026-05-29T22:31:37.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:31:37.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:31:37.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:31:37.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:31:37.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:31:37.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:31:37.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:31:12, diff=25.830797s, valid=True
2026-05-29T22:31:37.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:31:37.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:31:37.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:31:37.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019339.831456s, valid=True
2026-05-29T22:31:37.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:31:37.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:31:37.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:31:37.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:31:37.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:31:37.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:31:37.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:31:37.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:31:37.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:31:37.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:31:38.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:31:38.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:31:38.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:31:38.147 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:31:38.360 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:31:38.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:31:38.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:31:38.805 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:31:38.805 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:31:38.995 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:31:38.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:32:09.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:32:09.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:32:09.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:32:09.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:32:09.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:32:09.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:32:09.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-05-29T22:32:09.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:32:09.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-05-29T22:32:09.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:32:09.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:32:09.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:32:09.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-05-29T22:32:12.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-05-29T22:32:12.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:32:12.625 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:32:12.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:32:12.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:32:12.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:32:12.646 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:32:12.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:32:12.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:32:12.646 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:32:12.646 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:32:12.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:32:12.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:32:12.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:32:12.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:32:12.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:32:12.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:32:12.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:32:12.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:32:12.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:32:12.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:32:12.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:32:12.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:32:12.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:31:54
2026-05-29T22:32:12.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73034, datetime.datetime(2026, 5, 29, 22, 31, 54), datetime.datetime(2026, 5, 29, 22, 31, 54), 'salt', 9.29, 70.7, None, 17.86, 37.82, 5.04, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:32:12.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:32:12.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:32:12.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:31:54, diff=18.960085s, valid=True
2026-05-29T22:32:12.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:32:12.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:32:12.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:32:12, diff=0.962995s, valid=True
2026-05-29T22:32:12.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:32:12.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:32:12.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:31:53, diff=19.969726s, valid=True
2026-05-29T22:32:12.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:32:12.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:32:12.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:32:12.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:32:12.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:32:12.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:32:12.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:32:12, diff=0.972761s, valid=True
2026-05-29T22:32:12.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:32:12.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:32:12.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:32:12.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019374.973414s, valid=True
2026-05-29T22:32:12.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:32:12.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:32:12.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:32:12.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:32:12.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:32:13.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:32:13.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:32:13.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:32:13.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:32:13.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:32:13.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:32:13.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:32:13.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:32:13.295 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:32:13.582 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:32:13.926 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:32:14.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:32:14.026 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:32:14.026 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:32:14.217 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:32:14.217 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:32:44.238 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:32:44.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:32:44.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:32:44.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:32:44.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:32:44.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:32:44.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-05-29T22:32:44.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:32:44.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-05-29T22:32:44.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:32:44.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:32:44.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:32:44.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-05-29T22:32:47.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-05-29T22:32:47.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:32:47.386 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:32:47.386 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:32:47.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:32:47.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:32:47.405 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:32:47.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:32:47.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:32:47.405 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:32:47.405 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:32:47.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:32:47.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:32:47.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:32:47.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:32:47.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:32:47.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:32:47.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:32:47.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:32:47.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:32:47.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:32:47.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:32:47.660 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:32:47.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:32:25
2026-05-29T22:32:47.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73035, datetime.datetime(2026, 5, 29, 22, 32, 25), datetime.datetime(2026, 5, 29, 22, 32, 24), 'salt', 9.32, 70.7, None, 20.11, 41.37, 5.03, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:32:47.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:32:47.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:32:47.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:32:24, diff=23.726341s, valid=True
2026-05-29T22:32:47.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:32:47.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:32:47.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:32:12, diff=35.729179s, valid=True
2026-05-29T22:32:47.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:32:47.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:32:47.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:32:22, diff=25.736057s, valid=True
2026-05-29T22:32:47.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:32:47.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:32:47.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:32:47.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:32:47.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:32:47.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:32:47.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:32:12, diff=35.739053s, valid=True
2026-05-29T22:32:47.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:32:47.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:32:47.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:32:47.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019409.739738s, valid=True
2026-05-29T22:32:47.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:32:47.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:32:47.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:32:47.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:32:47.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:32:47.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:32:47.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:32:47.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:32:47.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:32:47.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:32:47.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:32:47.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:32:48.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:32:48.055 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:32:48.269 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:32:48.621 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:32:48.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:32:48.721 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:32:48.721 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:32:48.898 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:32:48.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:33:18.928 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:33:18.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:33:18.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:33:19.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:33:19.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:33:19.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:33:19.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-05-29T22:33:19.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:33:19.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-05-29T22:33:19.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:33:19.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:33:19.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:33:19.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-05-29T22:33:22.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-05-29T22:33:22.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:33:22.670 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:33:22.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:33:22.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:33:22.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:33:22.693 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:33:22.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:33:22.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:33:22.693 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:33:22.693 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:33:22.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:33:22.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:33:22.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:33:22.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:33:22.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:33:22.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:33:22.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:33:22.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:33:22.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:33:22.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:33:22.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:33:22.948 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:33:23.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:32:55
2026-05-29T22:33:23.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73036, datetime.datetime(2026, 5, 29, 22, 32, 55), datetime.datetime(2026, 5, 29, 22, 32, 54), 'salt', 9.29, 70.41, None, 18.42, 33.41, 5.1, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:33:23.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:33:23.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:33:23.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:32:54, diff=29.013533s, valid=True
2026-05-29T22:33:23.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:33:23.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:33:23.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:33:12, diff=11.016421s, valid=True
2026-05-29T22:33:23.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:33:23.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:33:23.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:32:53, diff=30.023075s, valid=True
2026-05-29T22:33:23.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:33:23.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:33:23.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:33:23.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:33:23.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:33:23.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:33:23.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:33:12, diff=11.026123s, valid=True
2026-05-29T22:33:23.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:33:23.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:33:23.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:33:23.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019445.026789s, valid=True
2026-05-29T22:33:23.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:33:23.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:33:23.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:33:23.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:33:23.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:33:23.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:33:23.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:33:23.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:33:23.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:33:23.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:33:23.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:33:23.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:33:23.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:33:23.416 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:33:23.628 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:33:23.974 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:33:24.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:33:24.074 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:33:24.074 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:33:24.285 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:33:24.285 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:33:54.315 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:33:54.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:33:54.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:33:54.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:33:54.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:33:54.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:33:54.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-05-29T22:33:54.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:33:54.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-05-29T22:33:54.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:33:54.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:33:54.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:33:54.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-05-29T22:34:51.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-05-29T22:34:51.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:34:51.213 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:34:51.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:34:51.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:34:51.234 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:34:51.234 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:34:51.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:34:51.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:34:51.234 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:34:51.235 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:34:51.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:34:51.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:34:51.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:34:51.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:34:51.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:34:51.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:34:51.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:34:51.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:34:51.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:34:51.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:34:51.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:34:51.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:34:51.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:34:25
2026-05-29T22:34:51.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73039, datetime.datetime(2026, 5, 29, 22, 34, 25), datetime.datetime(2026, 5, 29, 22, 34, 25), 'salt', 9.29, 70.37, None, 19.13, 34.98, 5.1, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:34:51.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:34:51.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:34:51.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:34:25, diff=26.559701s, valid=True
2026-05-29T22:34:51.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:34:51.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:34:51.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:34:12, diff=39.56285s, valid=True
2026-05-29T22:34:51.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:34:51.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:34:51.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:34:23, diff=28.569593s, valid=True
2026-05-29T22:34:51.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:34:51.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:34:51.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:34:51.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:34:51.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:34:51.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:34:51.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:34:12, diff=39.572584s, valid=True
2026-05-29T22:34:51.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:34:51.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:34:51.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:34:51.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019533.573288s, valid=True
2026-05-29T22:34:51.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:34:51.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:34:51.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:34:51.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:34:51.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:34:51.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:34:51.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:34:51.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:34:51.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:34:51.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:34:51.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:34:51.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:34:51.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:34:51.898 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:34:52.124 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:34:52.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:34:52.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:34:52.592 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:34:52.592 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:34:52.842 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:34:52.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:35:22.871 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:35:22.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:35:22.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:35:23.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:35:23.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:35:23.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:35:23.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-05-29T22:35:23.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:35:23.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-05-29T22:35:23.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:35:23.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:35:23.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:35:23.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-05-29T22:35:25.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-05-29T22:35:25.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:35:25.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:35:25.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:35:25.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:35:25.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:35:25.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:35:25.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:35:25.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:35:25.980 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:35:25.980 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:35:25.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:35:26.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:35:26.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:35:26.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:35:26.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:35:26.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:35:26.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:35:26.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:35:26.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:35:26.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:35:26.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:35:26.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:35:26.302 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:35:26
2026-05-29T22:35:26.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73041, datetime.datetime(2026, 5, 29, 22, 35, 26), datetime.datetime(2026, 5, 29, 22, 35, 25), 'salt', 9.19, 70.57, None, 22.55, 29.61, 5.06, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:35:26.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:35:26.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:35:26.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:35:25, diff=1.30824s, valid=True
2026-05-29T22:35:26.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:35:26.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:35:26.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:35:12, diff=14.311106s, valid=True
2026-05-29T22:35:26.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:35:26.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:35:26.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:35:24, diff=2.317898s, valid=True
2026-05-29T22:35:26.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:35:26.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:35:26.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:35:26.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:35:26.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:35:26.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:35:26.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:35:12, diff=14.320966s, valid=True
2026-05-29T22:35:26.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:35:26.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:35:26.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:35:26.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019568.321644s, valid=True
2026-05-29T22:35:26.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:35:26.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:35:26.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:35:26.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:35:26.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:35:26.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:35:26.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:35:26.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:35:26.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:35:26.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:35:26.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:35:26.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:35:26.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:35:26.724 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:35:26.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:35:27.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:35:27.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:35:27.416 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:35:27.416 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:35:27.719 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:35:27.720 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:35:57.749 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:35:57.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:35:57.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:35:58.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:35:58.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:35:58.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:35:58.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-05-29T22:35:58.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:35:58.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-05-29T22:35:58.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:35:58.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:35:58.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:35:58.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-05-29T22:36:00.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-05-29T22:36:00.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:36:00.839 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:36:00.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:36:00.848 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:36:00.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:36:00.860 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:36:00.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:36:00.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:36:00.861 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:36:00.861 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:36:00.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:36:00.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:36:00.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:36:01.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:36:01.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:36:01.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:36:01.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:36:01.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:36:01.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:36:01.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:36:01.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:36:01.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:36:01.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:35:56
2026-05-29T22:36:01.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73042, datetime.datetime(2026, 5, 29, 22, 35, 56), datetime.datetime(2026, 5, 29, 22, 35, 56), 'salt', 9.22, 70.57, None, 16.34, 45.78, 5.06, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:36:01.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:36:01.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:36:01.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:35:56, diff=5.197243s, valid=True
2026-05-29T22:36:01.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:36:01.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:36:01.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:36:12, diff=-10.799829s, valid=True
2026-05-29T22:36:01.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:36:01.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:36:01.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:35:54, diff=7.206843s, valid=True
2026-05-29T22:36:01.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:36:01.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:36:01.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:36:01.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:36:01.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:36:01.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:36:01.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:36:12, diff=-10.790072s, valid=True
2026-05-29T22:36:01.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:36:01.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:36:01.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:36:01.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019603.210597s, valid=True
2026-05-29T22:36:01.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:36:01.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:36:01.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:36:01.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:36:01.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:36:01.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:36:01.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:36:01.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:36:01.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:36:01.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:36:01.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:36:01.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:36:01.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:36:01.540 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:36:01.807 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:36:02.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:36:02.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:36:02.262 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:36:02.262 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:36:02.714 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:36:02.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:36:32.739 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:36:32.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:36:32.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:36:33.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:36:33.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:36:33.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:36:33.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-05-29T22:36:33.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:36:33.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-05-29T22:36:33.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:36:33.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:36:33.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:36:33.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-05-29T22:36:35.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-05-29T22:36:35.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:36:35.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:36:35.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:36:35.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:36:35.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:36:35.862 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:36:35.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:36:35.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:36:35.862 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:36:35.862 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:36:35.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:36:35.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:36:35.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:36:36.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:36:36.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:36:36.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:36:36.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:36:36.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:36:36.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:36:36.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:36:36.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:36:36.132 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:36:36.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:36:26
2026-05-29T22:36:36.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73043, datetime.datetime(2026, 5, 29, 22, 36, 26), datetime.datetime(2026, 5, 29, 22, 36, 26), 'salt', 9.16, 70.84, None, 17.78, 43.78, 5.01, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:36:36.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:36:36.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:36:36.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:36:26, diff=10.197584s, valid=True
2026-05-29T22:36:36.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:36:36.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:36:36.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:36:12, diff=24.200417s, valid=True
2026-05-29T22:36:36.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:36:36.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:36:36.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:36:26, diff=10.207146s, valid=True
2026-05-29T22:36:36.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:36:36.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:36:36.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:36:36.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:36:36.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:36:36.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:36:36.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:36:12, diff=24.210214s, valid=True
2026-05-29T22:36:36.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:36:36.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:36:36.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:36:36.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019638.210895s, valid=True
2026-05-29T22:36:36.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:36:36.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:36:36.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:36:36.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:36:36.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:36:36.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:36:36.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:36:36.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:36:36.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:36:36.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:36:36.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:36:36.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:36:36.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:36:36.607 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:36:36.836 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:36:37.201 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:36:37.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:36:37.306 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:36: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-05-29T22:36:37.501 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:36:37.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:37:07.531 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:37:07.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:37:07.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:37:07.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:37:07.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:37:07.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:37:07.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-05-29T22:37:07.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:37:07.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-05-29T22:37:08.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:37:08.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:37:08.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:37:08.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-05-29T22:37:10.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-05-29T22:37:10.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:37:10.619 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:37:10.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:37:10.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:37:10.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:37:10.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:37:10.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:37:10.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:37:10.641 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:37:10.641 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:37:10.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:37:10.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:37:10.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:37:10.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:37:10.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:37:10.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:37:10.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:37:10.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:37:10.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:37:10.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:37:10.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:37:10.909 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:37:10.972 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:36:57
2026-05-29T22:37:10.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73044, datetime.datetime(2026, 5, 29, 22, 36, 57), datetime.datetime(2026, 5, 29, 22, 36, 56), 'salt', 9.19, 71.0, None, 18.42, 42.09, 4.97, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:37:10.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:37:10.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:37:10.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:36:56, diff=14.978477s, valid=True
2026-05-29T22:37:10.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:37:10.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:37:10.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:37:12, diff=-1.018557s, valid=True
2026-05-29T22:37:10.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:37:10.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:37:10.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:36:54, diff=16.988234s, valid=True
2026-05-29T22:37:10.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:37:10.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:37:10.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:37:10.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:37:10.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:37:10.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:37:10.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:37:12, diff=-1.008728s, valid=True
2026-05-29T22:37:10.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:37:10.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:37:10.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:37:10.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019672.991943s, valid=True
2026-05-29T22:37:10.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:37:10.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:37:10.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:37:10.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:37:10.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:37:11.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:37:11.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:37:11.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:37:11.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:37:11.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:37:11.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:37:11.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:37:11.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:37:11.319 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:37:11.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:37:11.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:37:11.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:37:11.994 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:37:11.994 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:37:12.200 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:37:12.200 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:37:42.209 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:37:42.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:37:42.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:37:42.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:37:42.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:37:42.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:37:42.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-05-29T22:37:42.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:37:42.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-05-29T22:37:42.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:37:42.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:37:42.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:37:42.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-05-29T22:37:45.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-05-29T22:37:45.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:37:45.582 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:37:45.582 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:37:45.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:37:45.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:37:45.603 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:37:45.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:37:45.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:37:45.603 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:37:45.603 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:37:45.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:37:45.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:37:45.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:37:45.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:37:45.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:37:45.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:37:45.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:37:45.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:37:45.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:37:45.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:37:45.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:37:45.942 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:37:46.008 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:37:27
2026-05-29T22:37:46.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73045, datetime.datetime(2026, 5, 29, 22, 37, 27), datetime.datetime(2026, 5, 29, 22, 37, 26), 'salt', 9.12, 71.2, None, 18.46, 44.77, 4.93, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:37:46.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:37:46.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:37:46.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:37:26, diff=20.014232s, valid=True
2026-05-29T22:37:46.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:37:46.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:37:46.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:37:12, diff=34.017026s, valid=True
2026-05-29T22:37:46.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:37:46.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:37:46.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:37:25, diff=21.02373s, valid=True
2026-05-29T22:37:46.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:37:46.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:37:46.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:37:46.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:37:46.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:37:46.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:37:46.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:37:12, diff=34.026707s, valid=True
2026-05-29T22:37:46.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:37:46.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:37:46.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:37:46.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019708.027347s, valid=True
2026-05-29T22:37:46.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:37:46.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:37:46.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:37:46.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:37:46.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:37:46.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:37:46.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:37:46.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:37:46.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:37:46.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:37:46.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:37:46.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:37:46.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:37:46.351 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:37:46.564 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:37:46.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:37:47.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:37:47.008 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:37:47.008 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:37:47.197 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:37:47.197 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:38:17.227 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:38:17.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:38:17.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:38:17.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:38:17.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:38:17.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:38:17.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-05-29T22:38:17.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:38:17.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-05-29T22:38:17.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:38:17.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:38:17.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:38:17.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-05-29T22:38:20.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-05-29T22:38:20.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:38:20.328 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:38:20.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:38:20.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:38:20.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:38:20.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:38:20.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:38:20.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:38:20.349 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:38:20.349 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:38:20.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:38:20.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:38:20.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:38:20.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:38:20.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:38:20.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:38:20.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:38:20.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:38:20.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:38:20.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:38:20.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:38:20.614 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:38:20.683 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:37:57
2026-05-29T22:38:20.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73046, datetime.datetime(2026, 5, 29, 22, 37, 57), datetime.datetime(2026, 5, 29, 22, 37, 57), 'salt', 9.06, 71.3, None, 21.0, 46.55, 4.91, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:38:20.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:38:20.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:38:20.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:37:57, diff=23.689713s, valid=True
2026-05-29T22:38:20.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:38:20.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:38:20.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:38:12, diff=8.692542s, valid=True
2026-05-29T22:38:20.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:38:20.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:38:20.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:37:55, diff=25.699439s, valid=True
2026-05-29T22:38:20.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:38:20.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:38:20.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:38:20.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:38:20.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:38:20.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:38:20.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:38:12, diff=8.702883s, valid=True
2026-05-29T22:38:20.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:38:20.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:38:20.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:38:20.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019742.70354s, valid=True
2026-05-29T22:38:20.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:38:20.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:38:20.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:38:20.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:38:20.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:38:20.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:38:20.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:38:20.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:38:20.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:38:20.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:38:20.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:38:20.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:38:20.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:38:21.031 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:38:21.243 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:38:21.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:38:21.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:38:21.693 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:38:21.693 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:38:21.898 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:38:21.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:38:51.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:38:51.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:38:51.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:38:52.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:38:52.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:38:52.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:38:52.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-05-29T22:38:52.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:38:52.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-05-29T22:38:52.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:38:52.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:38:52.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:38:52.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-05-29T22:38:55.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-05-29T22:38:55.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:38:55.207 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:38:55.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:38:55.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:38:55.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:38:55.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:38:55.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:38:55.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:38:55.229 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:38:55.229 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:38:55.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:38:55.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:38:55.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:38:55.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:38:55.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:38:55.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:38:55.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:38:55.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:38:55.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:38:55.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:38:55.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:38:55.511 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:38:55.581 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:38:27
2026-05-29T22:38:55.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73047, datetime.datetime(2026, 5, 29, 22, 38, 27), datetime.datetime(2026, 5, 29, 22, 38, 27), 'salt', 9.06, 71.57, None, 20.18, 39.56, 4.86, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:38:55.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:38:55.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:38:55.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:38:27, diff=28.587946s, valid=True
2026-05-29T22:38:55.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:38:55.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:38:55.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:38:12, diff=43.590739s, valid=True
2026-05-29T22:38:55.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:38:55.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:38:55.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:38:25, diff=30.59748s, valid=True
2026-05-29T22:38:55.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:38:55.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:38:55.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:38:55.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:38:55.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:38:55.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:38:55.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:38:12, diff=43.600508s, valid=True
2026-05-29T22:38:55.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:38:55.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:38:55.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:38:55.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019777.601175s, valid=True
2026-05-29T22:38:55.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:38:55.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:38:55.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:38:55.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:38:55.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:38:55.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:38:55.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:38:55.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:38:55.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:38:55.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:38:55.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:38:55.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:38:55.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:38:55.931 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:38:56.141 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:38:56.566 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:38:56.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:38:56.711 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:38:56.711 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:38:56.972 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:38:56.972 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:39:27.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:39:27.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:39:27.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:39:27.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:39:27.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:39:27.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:39:27.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-05-29T22:39:27.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:39:27.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-05-29T22:39:27.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:39:27.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:39:27.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:39:27.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-05-29T22:39:30.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-05-29T22:39:30.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:39:30.075 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:39:30.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:39:30.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:39:30.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:39:30.096 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:39:30.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:39:30.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:39:30.097 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:39:30.097 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:39:30.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:39:30.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:39:30.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:39:30.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:39:30.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:39:30.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:39:30.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:39:30.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:39:30.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:39:30.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:39:30.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:39:30.375 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:39:30.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:39:28
2026-05-29T22:39:30.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73049, datetime.datetime(2026, 5, 29, 22, 39, 28), datetime.datetime(2026, 5, 29, 22, 39, 27), 'salt', 8.99, 71.97, None, 20.01, 42.0, 4.77, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:39:30.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:39:30.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:39:30.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:39:27, diff=3.459346s, valid=True
2026-05-29T22:39:30.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:39:30.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:39:30.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:39:12, diff=18.462235s, valid=True
2026-05-29T22:39:30.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:39:30.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:39:30.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:39:26, diff=4.469019s, valid=True
2026-05-29T22:39:30.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:39:30.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:39:30.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:39:30.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:39:30.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:39:30.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:39:30.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:39:12, diff=18.472028s, valid=True
2026-05-29T22:39:30.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:39:30.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:39:30.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:39:30.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019812.472701s, valid=True
2026-05-29T22:39:30.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:39:30.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:39:30.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:39:30.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:39:30.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:39:30.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:39:30.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:39:30.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:39:30.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:39:30.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:39:30.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:39:30.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:39:30.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:39:30.797 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:39:31.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:39:31.425 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:39:31.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:39:31.525 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:39:31.525 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:39:31.721 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:39:31.721 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:40:01.751 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:40:01.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:40:01.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:40:02.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:40:02.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:40:02.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:40:02.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-05-29T22:40:02.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:40:02.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-05-29T22:40:02.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:40:02.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:40:02.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:40:02.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-05-29T22:40:04.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-05-29T22:40:04.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:40:04.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:40:04.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:40:04.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:40:04.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:40:04.791 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:40:04.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:40:04.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:40:04.791 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:40:04.791 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:40:04.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:40:04.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:40:04.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:40:04.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:40:04.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:40:05.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:40:05.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:40:05.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:40:05.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:40:05.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:40:05.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:40:05.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:40:05.143 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:39:58
2026-05-29T22:40:05.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73050, datetime.datetime(2026, 5, 29, 22, 39, 58), datetime.datetime(2026, 5, 29, 22, 39, 57), 'salt', 8.99, 71.97, None, 22.44, 44.91, 4.77, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:40:05.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:40:05.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:40:05.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:39:57, diff=8.150305s, valid=True
2026-05-29T22:40:05.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:40:05.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:40:05.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:40:12, diff=-6.846526s, valid=True
2026-05-29T22:40:05.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:40:05.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:40:05.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:39:56, diff=9.161015s, valid=True
2026-05-29T22:40:05.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:40:05.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:40:05.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:40:05.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:40:05.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:40:05.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:40:05.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:40:12, diff=-6.835326s, valid=True
2026-05-29T22:40:05.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:40:05.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:40:05.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:40:05.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019847.165462s, valid=True
2026-05-29T22:40:05.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:40:05.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:40:05.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:40:05.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:40:05.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:40:05.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:40:05.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:40:05.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:40:05.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:40:05.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:40:05.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:40:05.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:40:05.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:40:05.494 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:40:05.704 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:40:06.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:40:06.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:40:06.177 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:40:06.177 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:40:06.412 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:40:06.412 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:40:36.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:40:36.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:40:36.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:40:37.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:40:37.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:40:37.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:40:37.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T22:40:37.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:40:37.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-05-29T22:40:37.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:40:37.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:40:37.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:40:37.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-05-29T22:40:39.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-05-29T22:40:39.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:40:39.866 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:40:39.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:40:39.874 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:40:39.887 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:40:39.887 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:40:39.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:40:39.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:40:39.888 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:40:39.888 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:40:39.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:40:39.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:40:39.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:40:40.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:40:40.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:40:40.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:40:40.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:40:40.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:40:40.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:40:40.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:40:40.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:40:40.168 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:40:40.229 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:40:28
2026-05-29T22:40:40.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73051, datetime.datetime(2026, 5, 29, 22, 40, 28), datetime.datetime(2026, 5, 29, 22, 40, 28), 'salt', 9.03, 71.9, None, 20.5, 44.51, 4.79, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:40:40.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:40:40.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:40:40.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:40:28, diff=12.235612s, valid=True
2026-05-29T22:40:40.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:40:40.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:40:40.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:40:12, diff=28.238456s, valid=True
2026-05-29T22:40:40.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:40:40.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:40:40.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:40:27, diff=13.245122s, valid=True
2026-05-29T22:40:40.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:40:40.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:40:40.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:40:40.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:40:40.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:40:40.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:40:40.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:40:12, diff=28.248262s, valid=True
2026-05-29T22:40:40.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:40:40.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:40:40.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:40:40.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019882.248951s, valid=True
2026-05-29T22:40:40.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:40:40.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:40:40.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:40:40.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:40:40.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:40:40.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:40:40.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:40:40.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:40:40.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:40:40.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:40:40.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:40:40.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:40:40.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:40:40.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:40:40.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:40:41.223 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:40:41.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:40:41.326 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:40:41.326 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:40:41.609 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:40:41.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:41:11.627 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:41:11.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:41:11.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:41:11.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:41:11.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:41:12.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:41:12.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-05-29T22:41:12.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:41:12.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-05-29T22:41:12.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:41:12.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:41:12.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:41:12.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-05-29T22:41:14.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-05-29T22:41:14.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:41:14.688 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:41:14.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:41:14.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:41:14.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:41:14.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:41:14.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:41:14.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:41:14.711 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:41:14.711 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:41:14.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:41:14.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:41:14.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:41:14.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:41:14.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:41:14.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:41:14.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:41:14.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:41:14.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:41:14.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:41:14.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:41:14.976 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:41:15.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:40:58
2026-05-29T22:41:15.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73052, datetime.datetime(2026, 5, 29, 22, 40, 58), datetime.datetime(2026, 5, 29, 22, 40, 58), 'salt', 9.09, 71.9, None, 18.67, 35.99, 4.79, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:41:15.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:41:15.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:41:15.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:40:58, diff=17.041748s, valid=True
2026-05-29T22:41:15.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:41:15.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:41:15.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:41:12, diff=3.044507s, valid=True
2026-05-29T22:41:15.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:41:15.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:41:15.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:40:56, diff=19.050945s, valid=True
2026-05-29T22:41:15.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:41:15.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:41:15.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:41:15.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:41:15.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:41:15.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:41:15.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:41:12, diff=3.054056s, valid=True
2026-05-29T22:41:15.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:41:15.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:41:15.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:41:15.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019917.054725s, valid=True
2026-05-29T22:41:15.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:41:15.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:41:15.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:41:15.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:41:15.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:41:15.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:41:15.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:41:15.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:41:15.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:41:15.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:41:15.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:41:15.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:41:15.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:41:15.384 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:41:15.606 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:41:15.953 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:41:16.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:41:16.064 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:41:16.065 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:41:16.436 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:41:16.436 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:41:46.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:41:46.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:41:46.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:41:46.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:41:46.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:41:46.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:41:46.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-05-29T22:41:46.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:41:46.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-05-29T22:41:46.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:41:46.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:41:46.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:41:46.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-05-29T22:41:49.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-05-29T22:41:49.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:41:49.652 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:41:49.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:41:49.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:41:49.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:41:49.673 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:41:49.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:41:49.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:41:49.673 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:41:49.673 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:41:49.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:41:49.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:41:49.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:41:49.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:41:49.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:41:49.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:41:49.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:41:49.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:41:49.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:41:49.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:41:49.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:41:49.939 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:41:49.999 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:41:28
2026-05-29T22:41:50.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73053, datetime.datetime(2026, 5, 29, 22, 41, 28), datetime.datetime(2026, 5, 29, 22, 41, 28), 'salt', 8.99, 71.8, None, 22.48, 49.49, 4.8, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:41:50.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:41:50.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:41:50.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:41:28, diff=22.00657s, valid=True
2026-05-29T22:41:50.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:41:50.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:41:50.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:41:12, diff=38.009542s, valid=True
2026-05-29T22:41:50.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:41:50.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:41:50.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:41:26, diff=24.016749s, valid=True
2026-05-29T22:41:50.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:41:50.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:41:50.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:41:50.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:41:50.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:41:50.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:41:50.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:41:12, diff=38.019942s, valid=True
2026-05-29T22:41:50.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:41:50.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:41:50.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:41:50.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019952.020668s, valid=True
2026-05-29T22:41:50.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:41:50.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:41:50.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:41:50.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:41:50.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:41:50.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:41:50.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:41:50.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:41:50.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:41:50.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:41:50.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:41:50.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:41:50.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:41:50.418 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:41:50.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:41:50.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:41:51.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:41:51.074 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:41:51.074 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:41:51.806 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:41:51.806 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:42:21.811 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:42:21.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:42:21.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:42:22.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:42:22.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:42:22.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:42:22.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-05-29T22:42:22.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:42:22.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-05-29T22:42:22.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:42:22.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:42:22.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:42:22.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-05-29T22:42:24.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-05-29T22:42:24.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:42:24.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:42:24.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:42:24.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:42:24.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:42:24.984 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:42:24.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:42:24.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:42:24.985 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:42:24.985 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:42:24.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:42:25.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:42:25.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:42:25.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:42:25.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:42:25.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:42:25.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:42:25.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:42:25.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:42:25.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:42:25.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:42:25.238 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:42:25.296 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:41:59
2026-05-29T22:42:25.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73054, datetime.datetime(2026, 5, 29, 22, 41, 59), datetime.datetime(2026, 5, 29, 22, 41, 58), 'salt', 9.06, 71.8, None, 22.09, 42.66, 4.81, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:42:25.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:42:25.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:42:25.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:41:58, diff=27.30217s, valid=True
2026-05-29T22:42:25.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:42:25.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:42:25.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:42:12, diff=13.304963s, valid=True
2026-05-29T22:42:25.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:42:25.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:42:25.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:41:57, diff=28.311666s, valid=True
2026-05-29T22:42:25.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:42:25.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:42:25.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:42:25.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:42:25.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:42:25.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:42:25.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:42:12, diff=13.314684s, valid=True
2026-05-29T22:42:25.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:42:25.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:42:25.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:42:25.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1019987.315337s, valid=True
2026-05-29T22:42:25.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:42:25.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:42:25.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:42:25.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:42:25.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:42:25.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:42:25.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:42:25.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:42:25.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:42:25.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:42:25.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:42:25.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:42:25.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:42:25.631 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:42:25.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:42:26.177 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:42:26.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:42:26.277 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:42:26.277 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:42:26.464 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:42:26.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:42:56.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:42:56.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:42:56.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:42:56.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:42:56.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:42:56.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:42:56.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-05-29T22:42:56.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:42:56.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-05-29T22:42:56.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:42:56.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:42:56.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:42:56.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-05-29T22:42:59.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-05-29T22:42:59.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:42:59.594 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:42:59.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:42:59.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:42:59.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:42:59.618 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:42:59.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:42:59.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:42:59.619 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:42:59.619 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:42:59.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:42:59.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:42:59.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:42:59.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:42:59.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:42:59.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:42:59.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:42:59.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:42:59.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:42:59.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:42:59.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:42:59.871 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:42:59.930 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:42:59
2026-05-29T22:42:59.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73056, datetime.datetime(2026, 5, 29, 22, 42, 59), datetime.datetime(2026, 5, 29, 22, 42, 59), 'salt', 9.26, 71.47, None, 20.22, 45.05, 4.89, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:42:59.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:42:59.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:42:59.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:42:59, diff=0.93659s, valid=True
2026-05-29T22:42:59.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:42:59.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:42:59.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:43:12, diff=-12.060503s, valid=True
2026-05-29T22:42:59.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:42:59.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:42:59.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:42:57, diff=2.946229s, valid=True
2026-05-29T22:42:59.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:42:59.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:42:59.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:42:59.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:42:59.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:42:59.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:42:59.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:43:12, diff=-12.050415s, valid=True
2026-05-29T22:42:59.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:42:59.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:42:59.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:42:59.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020021.950294s, valid=True
2026-05-29T22:42:59.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:42:59.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:42:59.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:42:59.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:42:59.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:43:00.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:43:00.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:43:00.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:43:00.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:43:00.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:43:00.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:43:00.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:43:00.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:43:00.356 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:43:00.561 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:43:00.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:43:00.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:43:00.992 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:43:00.992 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:43:01.171 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:43:01.171 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:43:31.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:43:31.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:43:31.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:43:31.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:43:31.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:43:31.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:43: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-05-29T22:43:31.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:43:31.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-05-29T22:43:31.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:43:31.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:43:31.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:43:31.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T22:43:34.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-05-29T22:43:34.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:43:34.545 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:43:34.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:43:34.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:43:34.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:43:34.572 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:43:34.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:43:34.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:43:34.572 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:43:34.572 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:43:34.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:43:34.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:43:34.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:43:34.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:43:34.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:43:34.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:43:34.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:43:34.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:43:34.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:43:34.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:43:34.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:43:34.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:43:34.881 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:43:29
2026-05-29T22:43:34.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73057, datetime.datetime(2026, 5, 29, 22, 43, 29), datetime.datetime(2026, 5, 29, 22, 43, 29), 'salt', 9.26, 71.1, None, 20.68, 38.13, 4.96, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:43:34.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:43:34.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:43:34.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:43:29, diff=5.888021s, valid=True
2026-05-29T22:43:34.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:43:34.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:43:34.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:43:12, diff=22.890807s, valid=True
2026-05-29T22:43:34.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:43:34.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:43:34.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:43:27, diff=7.897555s, valid=True
2026-05-29T22:43:34.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:43:34.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:43:34.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:43:34.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:43:34.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:43:34.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:43:34.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:43:12, diff=22.900552s, valid=True
2026-05-29T22:43:34.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:43:34.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:43:34.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:43:34.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020056.901217s, valid=True
2026-05-29T22:43:34.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:43:34.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:43:34.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:43:34.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:43:34.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:43:34.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:43:34.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:43:34.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:43:34.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:43:35.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:43:35.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:43:35.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:43:35.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:43:35.218 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:43:35.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:43:35.760 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:43:35.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:43:35.859 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:43:35.859 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:43:36.010 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:43:36.010 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:44:06.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:44:06.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:44:06.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:44:06.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:44:06.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:44:06.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:44:06.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-05-29T22:44:06.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:44:06.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T22:44:06.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:44:06.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:44:06.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:44:06.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-05-29T22:44:09.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-05-29T22:44:09.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:44:09.334 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:44:09.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:44:09.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:44:09.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:44:09.347 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:44:09.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:44:09.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:44:09.347 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:44:09.347 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:44:09.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:44:09.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:44:09.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:44:09.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:44:09.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:44:09.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:44:09.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:44:09.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:44:09.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:44:09.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:44:09.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:44:09.600 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:44:09.661 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:44:00
2026-05-29T22:44:09.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73058, datetime.datetime(2026, 5, 29, 22, 44), datetime.datetime(2026, 5, 29, 22, 43, 59), 'salt', 9.19, 71.17, None, 22.97, 37.82, 4.94, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:44:09.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:44:09.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:44:09.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:43:59, diff=10.667157s, valid=True
2026-05-29T22:44:09.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:44:09.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:44:09.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:44:12, diff=-2.330018s, valid=True
2026-05-29T22:44:09.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:44:09.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:44:09.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:43:58, diff=11.676578s, valid=True
2026-05-29T22:44:09.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:44:09.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:44:09.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:44:09.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:44:09.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:44:09.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:44:09.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:44:12, diff=-2.320413s, valid=True
2026-05-29T22:44:09.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:44:09.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:44:09.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:44:09.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020091.680245s, valid=True
2026-05-29T22:44:09.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:44:09.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:44:09.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:44:09.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:44:09.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:44:09.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:44:09.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:44:09.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:44:09.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:44:09.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:44:09.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:44:09.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:44:09.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:44:10.010 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:44:10.225 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:44:10.561 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:44:10.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:44:10.661 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:44:10.661 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:44:10.923 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:44:10.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:44:40.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:44:40.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:44:40.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:44:41.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:44:41.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:44:41.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:44:41.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-05-29T22:44:41.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:44:41.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-05-29T22:44:41.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:44:41.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:44:41.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:44:41.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-05-29T22:44: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-05-29T22:44:44.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:44:44.167 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:44:44.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:44:44.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:44:44.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:44:44.186 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:44:44.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:44:44.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:44:44.186 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:44:44.186 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:44:44.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:44:44.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:44:44.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:44:44.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:44:44.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:44:44.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:44:44.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:44:44.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:44:44.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:44:44.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:44:44.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:44:44.440 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:44:44.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:44:30
2026-05-29T22:44:44.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73059, datetime.datetime(2026, 5, 29, 22, 44, 30), datetime.datetime(2026, 5, 29, 22, 44, 29), 'salt', 9.16, 71.34, None, 20.43, 36.16, 4.91, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:44:44.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:44:44.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:44:44.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:44:29, diff=15.507604s, valid=True
2026-05-29T22:44:44.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:44:44.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:44:44.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:44:12, diff=32.510423s, valid=True
2026-05-29T22:44:44.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:44:44.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:44:44.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:44:28, diff=16.517204s, valid=True
2026-05-29T22:44:44.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:44:44.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:44:44.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:44:44.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:44:44.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:44:44.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:44:44.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:44:12, diff=32.520225s, valid=True
2026-05-29T22:44:44.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:44:44.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:44:44.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:44:44.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020126.520905s, valid=True
2026-05-29T22:44:44.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:44:44.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:44:44.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:44:44.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:44:44.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:44:44.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:44:44.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:44:44.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:44:44.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:44:44.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:44:44.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:44:44.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:44:44.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:44:44.838 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:44:45.045 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:44:45.385 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:44:45.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:44:45.546 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:44:45.546 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:44:45.835 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:44:45.835 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:45:15.838 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:45:15.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:45:15.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:45:16.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:45:16.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:45:16.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:45:16.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-05-29T22:45:16.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:45:16.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-05-29T22:45:16.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:45:16.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:45:16.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:45:16.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-05-29T22:45:18.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-05-29T22:45:18.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:45:18.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:45:18.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:45:18.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:45:18.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:45:18.964 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:45:18.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:45:18.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:45:18.965 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:45:18.965 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:45:18.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:45:19.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:45:19.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:45:19.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:45:19.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:45:19.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:45:19.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:45:19.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:45:19.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:45:19.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:45:19.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:45:19.217 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:45:19.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:45:00
2026-05-29T22:45:19.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73060, datetime.datetime(2026, 5, 29, 22, 45), datetime.datetime(2026, 5, 29, 22, 45), 'salt', 9.16, 71.4, None, 17.78, 38.01, 4.89, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:45:19.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:45:19.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:45:19.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:45:00, diff=19.290891s, valid=True
2026-05-29T22:45:19.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:45:19.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:45:19.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:45:12, diff=7.293893s, valid=True
2026-05-29T22:45:19.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:45:19.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:45:19.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:44:59, diff=20.300814s, valid=True
2026-05-29T22:45:19.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:45:19.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:45:19.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:45:19.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:45:19.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:45:19.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:45:19.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:45:12, diff=7.303918s, valid=True
2026-05-29T22:45:19.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:45:19.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:45:19.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:45:19.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020161.30461s, valid=True
2026-05-29T22:45:19.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:45:19.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:45:19.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:45:19.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:45:19.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:45:19.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:45:19.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:45:19.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:45:19.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:45:19.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:45:19.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:45:19.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:45:19.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:45:19.720 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:45:19.937 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:45:20.289 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:45:20.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:45:20.390 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:45:20.390 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:45:23.058 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:45:23.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:45:53.088 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:45:53.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:45:53.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:45:53.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:45:53.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:45:53.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:45:53.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-05-29T22:45:53.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:45:53.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-05-29T22:45:53.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:45:53.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:45:53.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:45:53.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T22:45:56.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-05-29T22:45:56.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:45:56.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:45:56.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:45:56.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:45:56.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:45:56.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:45:56.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:45:56.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:45:56.260 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:45:56.260 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:45:56.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:45:56.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:45:56.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:45:56.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:45:56.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:45:56.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:45:56.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:45:56.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T22:45:56.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:45:56.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:45:56.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:45:56.513 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:45:56.575 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:45:30
2026-05-29T22:45:56.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73061, datetime.datetime(2026, 5, 29, 22, 45, 30), datetime.datetime(2026, 5, 29, 22, 45, 30), 'salt', 9.19, 71.7, None, 21.24, 24.91, 4.83, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:45:56.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:45:56.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:45:56.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:45:30, diff=26.581869s, valid=True
2026-05-29T22:45:56.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:45:56.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:45:56.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:45:12, diff=44.58467s, valid=True
2026-05-29T22:45:56.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:45:56.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:45:56.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:45:28, diff=28.591281s, valid=True
2026-05-29T22:45:56.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:45:56.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:45:56.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:45:56.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:45:56.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:45:56.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T22:45:56.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:45:12, diff=44.594271s, valid=True
2026-05-29T22:45:56.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:45:56.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:45:56.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:45:56.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020198.594943s, valid=True
2026-05-29T22:45:56.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:45:56.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:45:56.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:45:56.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:45:56.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:45:56.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:45:56.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:45:56.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:45:56.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:45:56.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:45:56.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:45:56.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:45:56.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:45:56.912 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:45:57.195 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:45:57.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:45:57.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:45:57.634 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:45:57.634 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:45:57.822 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:45:57.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:46:27.835 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:46:27.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:46:27.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:46:28.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:46:28.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:46:28.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:46:28.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-05-29T22:46:28.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:46:28.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-05-29T22:46:28.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:46:28.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:46:28.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:46:28.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-05-29T22:46:30.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-05-29T22:46:30.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:46:30.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:46:30.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:46:30.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:46:30.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:46:30.948 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:46:30.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:46:30.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:46:30.948 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:46:30.948 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:46:30.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:46:31.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:46:31.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:46:31.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:46:31.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:46:31.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:46:31.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:46:31.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:46:31.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:46:31.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:46:31.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:46:31.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:46:31.292 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:46:31
2026-05-29T22:46:31.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73063, datetime.datetime(2026, 5, 29, 22, 46, 31), datetime.datetime(2026, 5, 29, 22, 46, 30), 'salt', 9.16, 71.47, None, 18.1, 42.19, 4.88, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:46:31.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:46:31.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:46:31.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:46:30, diff=1.299299s, valid=True
2026-05-29T22:46:31.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:46:31.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:46:31.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:46:12, diff=19.303967s, valid=True
2026-05-29T22:46:31.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:46:31.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:46:31.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:46:29, diff=2.310785s, valid=True
2026-05-29T22:46:31.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:46:31.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:46:31.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:46:31.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:46:31.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:46:31.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:46:31.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:46:12, diff=19.314598s, valid=True
2026-05-29T22:46:31.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:46:31.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:46:31.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:46:31.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020233.315706s, valid=True
2026-05-29T22:46:31.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:46:31.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:46:31.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:46:31.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:46:31.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:46:31.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:46:31.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:46:31.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:46:31.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:46:31.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:46:31.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:46:31.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:46:31.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:46:31.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:46:31.923 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:46:32.332 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:46:32.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:46:32.447 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:46:32.447 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:46:32.741 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:46:32.741 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:47:02.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:47:02.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:47:02.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:47:03.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:47:03.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:47:03.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:47:03.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-05-29T22:47:03.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:47:03.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-05-29T22:47:03.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:47:03.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:47:03.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:47:03.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-05-29T22:47:06.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-05-29T22:47:06.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:47:06.256 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:47:06.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:47:06.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:47:06.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:47:06.285 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:47:06.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:47:06.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:47:06.286 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:47:06.286 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:47:06.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:47:06.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:47:06.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:47:06.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:47:06.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:47:06.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:47:06.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:47:06.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T22:47:06.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:47:06.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:47:06.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:47:06.538 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:47:06.598 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:47:01
2026-05-29T22:47:06.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73064, datetime.datetime(2026, 5, 29, 22, 47, 1), datetime.datetime(2026, 5, 29, 22, 47), 'salt', 9.26, 71.47, None, 19.34, 54.21, 4.88, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:47:06.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:47:06.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:47:06.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:47:00, diff=6.6043s, valid=True
2026-05-29T22:47:06.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:47:06.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:47:06.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:47:12, diff=-5.392896s, valid=True
2026-05-29T22:47:06.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:47:06.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:47:06.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:46:59, diff=7.613609s, valid=True
2026-05-29T22:47:06.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:47:06.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:47:06.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:47:06.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:47:06.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:47:06.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T22:47:06.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:47:12, diff=-5.383392s, valid=True
2026-05-29T22:47:06.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:47:06.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:47:06.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:47:06.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020268.617266s, valid=True
2026-05-29T22:47:06.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:47:06.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:47:06.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:47:06.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:47:06.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:47:06.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:47:06.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:47:06.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:47:06.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:47:06.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:47:06.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:47:06.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:47:06.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:47:06.934 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:47:07.210 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:47:07.548 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:47:07.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:47:07.646 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:47:07.646 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:47:07.834 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:47:07.834 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:47:37.864 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:47:37.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:47:37.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:47:38.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:47:38.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:47:38.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:47:38.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-05-29T22:47:38.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:47:38.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-05-29T22:47:38.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:47:38.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:47:38.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:47:38.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T22:49:08.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-05-29T22:49:08.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:49:08.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:49:08.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:49:08.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:49:08.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:49:08.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:49:08.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:49:08.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:49:08.723 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:49:08.723 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:49:08.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:49:08.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:49:08.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:49:08.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:49:08.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:49:08.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T22:49:08.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:49:08.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T22:49:08.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:49:08.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:49:08.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:49:08.981 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:49:09.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:49:02
2026-05-29T22:49:09.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73068, datetime.datetime(2026, 5, 29, 22, 49, 2), datetime.datetime(2026, 5, 29, 22, 49, 1), 'salt', 9.03, 72.4, None, 18.28, 42.54, 4.69, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:49:09.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:49:09.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:49:09.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:49:01, diff=8.053127s, valid=True
2026-05-29T22:49:09.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:49:09.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T22:49:09.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:47:12, diff=117.055972s, valid=True
2026-05-29T22:49:09.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:49:09.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:49:09.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:49:01, diff=8.062694s, valid=True
2026-05-29T22:49:09.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:49:09.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:49:09.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:49:09.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:49:09.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:49:09.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T22:49:09.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:47:12, diff=117.065755s, valid=True
2026-05-29T22:49:09.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:49:09.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:49:09.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:49:09.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020391.066423s, valid=True
2026-05-29T22:49:09.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:49:09.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:49:09.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:49:09.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:49:09.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:49:09.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:49:09.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:49:09.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:49:09.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:49:09.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:49:09.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:49:09.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:49:09.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:49:09.386 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:49:09.594 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:49:09.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:49:10.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:49:10.057 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:49:10.057 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:49:10.254 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:49:10.254 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:49:40.284 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:49:40.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:49:40.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:49:40.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:49:40.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:49:40.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:49: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-05-29T22:49:40.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:49: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-05-29T22:49:40.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:49:40.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:49:40.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:49:40.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-05-29T22:49:43.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-05-29T22:49:43.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:49:43.484 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:49:43.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:49:43.492 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:49:43.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:49:43.504 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:49:43.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:49:43.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:49:43.504 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:49:43.505 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:49:43.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:49:43.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:49:43.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:49:43.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:49:43.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:49:43.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T22:49:43.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:49:43.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T22:49:43.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:49:43.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:49:43.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:49:43.757 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:49:43.829 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:49:32
2026-05-29T22:49:43.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73069, datetime.datetime(2026, 5, 29, 22, 49, 32), datetime.datetime(2026, 5, 29, 22, 49, 31), 'salt', 8.96, 72.83, None, 20.01, 37.26, 4.6, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:49:43.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:49:43.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:49:43.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:49:31, diff=12.838613s, valid=True
2026-05-29T22:49:43.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:49:43.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T22:49:43.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:47:12, diff=151.842942s, valid=True
2026-05-29T22:49:43.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:49:43.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:49:43.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:49:30, diff=13.849628s, valid=True
2026-05-29T22:49:43.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:49:43.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:49:43.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:49:43.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:49:43.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:49:43.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T22:49:43.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:47:12, diff=151.853662s, valid=True
2026-05-29T22:49:43.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:49:43.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:49:43.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:49:43.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020425.854323s, valid=True
2026-05-29T22:49:43.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:49:43.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:49:43.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:49:43.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:49:43.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:49:43.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:49:43.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:49:43.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:49:43.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:49:43.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:49:44.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:49:44.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:49:44.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:49:44.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:49:44.463 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:49:44.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:49:44.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:49: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-05-29T22:49: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-05-29T22:49:45.193 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:49:45.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:50:15.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:50:15.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:50:15.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:50:15.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:50:15.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:50:15.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:50:15.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T22:50:15.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:50:15.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-05-29T22:50:15.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:50:15.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:50:15.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:50:15.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-05-29T22:50:18.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-05-29T22:50:18.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:50:18.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:50:18.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:50:18.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:50:18.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:50:18.301 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:50:18.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:50:18.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:50:18.302 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:50:18.302 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:50:18.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:50:18.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:50:18.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:50:18.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:50:18.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:50:18.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T22:50:18.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:50:18.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T22:50:18.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:50:18.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:50:18.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:50:18.556 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:50:18.616 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:50:02
2026-05-29T22:50:18.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73070, datetime.datetime(2026, 5, 29, 22, 50, 2), datetime.datetime(2026, 5, 29, 22, 50, 1), 'salt', 8.79, 72.8, None, 19.9, 36.02, 4.6, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:50:18.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:50:18.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:50:18.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:50:01, diff=17.62293s, valid=True
2026-05-29T22:50:18.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:50:18.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T22:50:18.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:47:12, diff=186.625739s, valid=True
2026-05-29T22:50:18.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:50:18.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:50:18.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:50:00, diff=18.632374s, valid=True
2026-05-29T22:50:18.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:50:18.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:50:18.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:50:18.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:50:18.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:50:18.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T22:50:18.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:47:12, diff=186.635351s, valid=True
2026-05-29T22:50:18.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:50:18.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:50:18.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:50:18.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020460.636016s, valid=True
2026-05-29T22:50:18.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:50:18.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:50:18.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:50:18.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:50:18.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:50:18.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:50:18.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:50:18.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:50:18.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:50:18.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:50:18.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:50:18.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:50:18.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:50:18.971 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:50:19.190 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:50:19.541 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:50:19.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:50:19.646 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:50:19.646 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:50:19.881 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:50:19.881 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:50:49.911 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:50:49.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:50:49.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:50:50.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:50:50.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:50:50.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:50:50.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-05-29T22:50:50.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:50:50.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-05-29T22:50:50.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:50:50.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:50:50.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:50:50.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-05-29T22:50:53.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-05-29T22:50:53.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:50:53.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:50:53.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:50:53.018 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:50:53.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:50:53.030 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:50:53.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:50:53.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:50:53.031 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:50:53.031 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:50:53.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:50:53.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:50:53.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:50:53.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:50:53.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:50:53.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T22:50:53.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:50:53.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T22:50:53.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:50:53.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:50:53.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:50:53.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:50:53.345 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:50:32
2026-05-29T22:50:53.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73071, datetime.datetime(2026, 5, 29, 22, 50, 32), datetime.datetime(2026, 5, 29, 22, 50, 32), 'salt', 8.89, 72.86, None, 18.63, 45.92, 4.59, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:50:53.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:50:53.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:50:53.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:50:32, diff=21.351392s, valid=True
2026-05-29T22:50:53.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:50:53.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T22:50:53.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:47:12, diff=221.354208s, valid=True
2026-05-29T22:50:53.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:50:53.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:50:53.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:50:31, diff=22.360888s, valid=True
2026-05-29T22:50:53.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:50:53.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:50:53.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:50:53.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:50:53.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:50:53.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T22:50:53.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:47:12, diff=221.363875s, valid=True
2026-05-29T22:50:53.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:50:53.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:50:53.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:50:53.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020495.364532s, valid=True
2026-05-29T22:50:53.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:50:53.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:50:53.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:50:53.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:50:53.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:50:53.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:50:53.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:50:53.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:50:53.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:50:53.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:50:53.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:50:53.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:50:53.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:50:53.750 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:50:53.966 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:50:54.318 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:50:54.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:50:54.419 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:50:54.419 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:50:54.505 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:50:54.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:51:24.514 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:51:24.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:51:24.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:51:24.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:51:24.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:51:24.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:51:24.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-05-29T22:51:24.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:51:24.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-05-29T22:51:24.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:51:24.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:51:25.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:51:25.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-05-29T22:51:31.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-05-29T22:51:31.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:51:31.338 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:51:31.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:51:31.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:51:31.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:51:31.362 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:51:31.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:51:31.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:51:31.362 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:51:31.362 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:51:31.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:51:31.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:51:31.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:51:31.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:51:31.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:51:31.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T22:51:31.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:51:31.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T22:51:31.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:51:31.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:51:31.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:51:31.620 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:51:31.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:51:03
2026-05-29T22:51:31.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73072, datetime.datetime(2026, 5, 29, 22, 51, 3), datetime.datetime(2026, 5, 29, 22, 51, 2), 'salt', 8.96, 72.93, None, 18.88, 33.97, 4.58, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:51:31.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:51:31.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:51:31.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:51:02, diff=29.685595s, valid=True
2026-05-29T22:51:31.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:51:31.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T22:51:31.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:47:12, diff=259.688486s, valid=True
2026-05-29T22:51:31.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:51:31.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:51:31.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:51:01, diff=30.695312s, valid=True
2026-05-29T22:51:31.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:51:31.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:51:31.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:51:31.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:51:31.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:51:31.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T22:51:31.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:47:12, diff=259.698501s, valid=True
2026-05-29T22:51:31.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:51:31.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:51:31.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:51:31.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020533.699201s, valid=True
2026-05-29T22:51:31.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:51:31.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:51:31.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:51:31.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:51:31.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:51:31.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:51:31.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:51:31.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:51:31.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:51:31.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:51:31.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:51:32.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:51:32.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:51:32.116 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:51:32.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:51:32.696 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:51:32.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:51:32.803 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:51:32.803 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:51:32.991 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:51:32.991 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:52:03.021 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:52:03.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:52:03.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:52:03.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:52:03.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:52:03.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:52:03.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-05-29T22:52:03.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:52: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-05-29T22:52:03.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:52:03.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:52:03.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:52:03.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-05-29T22:52:06.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-05-29T22:52:06.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:52:06.224 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:52:06.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:52:06.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:52:06.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:52:06.245 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:52:06.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:52:06.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:52:06.246 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:52:06.246 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:52:06.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:52:06.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:52:06.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:52:06.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:52:06.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:52:06.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T22:52:06.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:52:06.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T22:52:06.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:52:06.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:52:06.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:52:06.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:52:06.560 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:52:03
2026-05-29T22:52:06.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73074, datetime.datetime(2026, 5, 29, 22, 52, 3), datetime.datetime(2026, 5, 29, 22, 52, 3), 'salt', 8.99, 72.73, None, 18.38, 44.44, 4.62, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:52:06.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:52:06.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:52:06.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:52:03, diff=3.566452s, valid=True
2026-05-29T22:52:06.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:52:06.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T22:52:06.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:47:12, diff=294.569245s, valid=True
2026-05-29T22:52:06.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:52:06.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:52:06.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:52:02, diff=4.575912s, valid=True
2026-05-29T22:52:06.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:52:06.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:52:06.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:52:06.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:52:06.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:52:06.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T22:52:06.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:47:12, diff=294.578904s, valid=True
2026-05-29T22:52:06.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:52:06.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:52:06.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:52:06.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020568.579564s, valid=True
2026-05-29T22:52:06.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:52:06.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:52:06.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:52:06.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:52:06.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:52:06.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:52:06.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:52:06.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:52:06.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:52:06.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:52:06.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:52:06.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:52:06.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:52:06.903 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:52:07.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:52:07.485 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:52:07.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:52:07.586 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:52:07.586 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:52:07.775 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:52:07.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:52:37.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:52:37.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:52:37.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:52:38.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:52:38.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:52:38.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:52:38.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-05-29T22:52:38.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:52:38.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-05-29T22:52:38.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:52:38.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:52:38.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:52:38.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-05-29T22:52:40.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-05-29T22:52:40.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:52:40.858 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:52:40.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:52:40.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:52:40.877 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:52:40.878 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:52:40.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:52:40.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:52:40.878 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:52:40.878 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:52:40.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:52:40.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:52:40.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:52:41.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:52:41.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:52:41.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T22:52:41.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:52:41.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T22:52:41.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:52:41.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:52:41.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:52:41.134 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:52:41.193 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:52:33
2026-05-29T22:52:41.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73075, datetime.datetime(2026, 5, 29, 22, 52, 33), datetime.datetime(2026, 5, 29, 22, 52, 33), 'salt', 8.96, 72.83, None, 18.35, 43.17, 4.6, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:52:41.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:52:41.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:52:41.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:52:33, diff=8.199818s, valid=True
2026-05-29T22:52:41.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:52:41.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T22:52:41.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:53:12, diff=-30.797333s, valid=True
2026-05-29T22:52:41.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:52:41.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:52:41.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:52:32, diff=9.209398s, valid=True
2026-05-29T22:52:41.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:52:41.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:52:41.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:52:41.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:52:41.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:52:41.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T22:52:41.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:53:12, diff=-30.787588s, valid=True
2026-05-29T22:52:41.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:52:41.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:52:41.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:52:41.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020603.213086s, valid=True
2026-05-29T22:52:41.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:52:41.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:52:41.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:52:41.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:52:41.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:52:41.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:52:41.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:52:41.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:52:41.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:52:41.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:52:41.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:52:41.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:52:41.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:52:41.533 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:52:41.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:52:42.158 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:52:42.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:52:42.259 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:52:42.259 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:52:42.449 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:52:42.449 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:53:12.458 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:53:12.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:53:12.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:53:12.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:53:12.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:53:12.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:53:12.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-05-29T22:53:12.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:53:12.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-05-29T22:53:13.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:53:13.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:53:13.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:53:13.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-05-29T22:54:15.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-05-29T22:54:15.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:54:15.156 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:54:15.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:54:15.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:54:15.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:54:15.178 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:54:15.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:54:15.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:54:15.178 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:54:15.178 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:54:15.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:54:15.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:54:15.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:54:15.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:54:15.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:54:15.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T22:54:15.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:54:15.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T22:54:15.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:54:15.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:54:15.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:54:15.428 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:54:15.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:54:04
2026-05-29T22:54:15.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73078, datetime.datetime(2026, 5, 29, 22, 54, 4), datetime.datetime(2026, 5, 29, 22, 54, 4), 'salt', 9.03, 73.03, None, 19.02, 38.74, 4.57, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:54:15.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:54:15.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:54:15.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:54:04, diff=11.493355s, valid=True
2026-05-29T22:54:15.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:54:15.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T22:54:15.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:53:12, diff=63.496132s, valid=True
2026-05-29T22:54:15.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:54:15.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:54:15.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:54:03, diff=12.502801s, valid=True
2026-05-29T22:54:15.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:54:15.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:54:15.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:54:15.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:54:15.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:54:15.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T22:54:15.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:53:12, diff=63.505836s, valid=True
2026-05-29T22:54:15.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:54:15.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:54:15.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:54:15.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020697.506494s, valid=True
2026-05-29T22:54:15.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:54:15.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:54:15.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:54:15.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:54:15.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:54:15.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:54:15.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:54:15.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:54:15.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:54:15.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:54:15.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:54:15.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:54:15.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:54:15.821 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:54:16.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:54:16.380 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:54:16.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:54:16.481 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:54:16.481 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:54:16.663 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:54:16.663 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:54:46.682 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:54:46.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:54:46.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:54:47.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:54:47.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:54:47.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:54:47.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-05-29T22:54:47.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:54:47.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-05-29T22:54:47.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:54:47.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:54:47.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:54:47.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-05-29T22:54:50.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-05-29T22:54:50.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:54:50.072 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:54:50.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:54:50.080 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:54:50.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:54:50.093 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:54:50.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:54:50.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:54:50.093 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:54:50.093 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:54:50.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:54:50.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:54:50.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:54:50.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:54:50.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:54:50.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T22:54:50.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:54:50.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T22:54:50.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:54:50.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:54:50.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:54:50.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:54:50.411 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:54:34
2026-05-29T22:54:50.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73079, datetime.datetime(2026, 5, 29, 22, 54, 34), datetime.datetime(2026, 5, 29, 22, 54, 34), 'salt', 8.99, 73.06, None, 20.61, 43.15, 4.56, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:54:50.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:54:50.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:54:50.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:54:34, diff=16.417577s, valid=True
2026-05-29T22:54:50.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:54:50.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T22:54:50.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:55:12, diff=-21.57965s, valid=True
2026-05-29T22:54:50.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:54:50.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:54:50.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:54:33, diff=17.426994s, valid=True
2026-05-29T22:54:50.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:54:50.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:54:50.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:54:50.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:54:50.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:54:50.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T22:54:50.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:55:12, diff=-21.570041s, valid=True
2026-05-29T22:54:50.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:54:50.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:54:50.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:54:50.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020732.430613s, valid=True
2026-05-29T22:54:50.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:54:50.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:54:50.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:54:50.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:54:50.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:54:50.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:54:50.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:54:50.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:54:50.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:54:50.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:54:50.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:54:50.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:54:50.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:54:50.756 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:54:51.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:54:51.441 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:54:51.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:54:51.541 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:54:51.541 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:54:51.729 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:54:51.729 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:55:21.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:55:21.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:55:21.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:55:22.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:55:22.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:55:22.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:55:22.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-05-29T22:55:22.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:55:22.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-05-29T22:55:22.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:55:22.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:55:22.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:55:22.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-05-29T22:55:24.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T22:55:24.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:55:24.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:55:24.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:55:24.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:55:24.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:55:24.867 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:55:24.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:55:24.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:55:24.867 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:55:24.867 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:55:24.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:55:24.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:55:24.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:55:25.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:55:25.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:55:25.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T22:55:25.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:55:25.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T22:55:25.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:55:25.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:55:25.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:55:25.136 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:55:25.195 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:55:04
2026-05-29T22:55:25.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73080, datetime.datetime(2026, 5, 29, 22, 55, 4), datetime.datetime(2026, 5, 29, 22, 55, 4), 'salt', 8.99, 73.16, None, 21.28, 40.57, 4.54, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:55:25.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:55:25.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:55:25.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:55:04, diff=21.20186s, valid=True
2026-05-29T22:55:25.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:55:25.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T22:55:25.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:55:12, diff=13.204631s, valid=True
2026-05-29T22:55:25.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:55:25.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:55:25.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:55:03, diff=22.211339s, valid=True
2026-05-29T22:55:25.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:55:25.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:55:25.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:55:25.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:55:25.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:55:25.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T22:55:25.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:55:12, diff=13.214313s, valid=True
2026-05-29T22:55:25.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:55:25.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:55:25.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:55:25.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020767.214972s, valid=True
2026-05-29T22:55:25.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:55:25.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:55:25.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:55:25.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:55:25.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:55:25.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:55:25.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:55:25.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:55:25.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:55:25.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:55:25.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:55:25.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:55:25.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:55:25.532 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:55:25.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:55:26.094 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:55:26.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:55:26.195 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:55:26.195 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:55:26.487 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:55:26.487 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:55:56.518 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:55:56.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:55:56.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:55:56.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:55:56.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:55:57.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:55:57.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-05-29T22:55:57.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:55:57.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-05-29T22:55:57.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:55:57.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:55:57.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:55:57.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-05-29T22:55:59.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-05-29T22:55:59.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:55:59.781 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:55:59.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:55:59.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:55:59.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:55:59.802 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:55:59.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:55:59.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:55:59.802 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:55:59.802 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:55:59.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:55:59.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T22:55:59.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:55:59.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T22:55:59.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:56:00.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T22:56:00.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:56:00.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T22:56:00.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:56:00.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:56:00.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:56:00.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:56:00.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:55:35
2026-05-29T22:56:00.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73081, datetime.datetime(2026, 5, 29, 22, 55, 35), datetime.datetime(2026, 5, 29, 22, 55, 34), 'salt', 8.99, 73.06, None, 20.32, 36.58, 4.56, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:56:00.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:56:00.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T22:56:00.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:55:34, diff=26.144904s, valid=True
2026-05-29T22:56:00.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:56:00.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T22:56:00.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:56:12, diff=-11.852196s, valid=True
2026-05-29T22:56:00.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:56:00.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T22:56:00.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:55:33, diff=27.154632s, valid=True
2026-05-29T22:56:00.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:56:00.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:56:00.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:56:00.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:56:00.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:56:00.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T22:56:00.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:56:12, diff=-11.842216s, valid=True
2026-05-29T22:56:00.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:56:00.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:56:00.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:56:00.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020802.158459s, valid=True
2026-05-29T22:56:00.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:56:00.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:56:00.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:56:00.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:56:00.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:56:00.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:56:00.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:56:00.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:56:00.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:56:00.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:56:00.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:56:00.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:56:00.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:56:00.555 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:56:00.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:56:01.156 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:56:01.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:56:01.261 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:56:01.261 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:56:01.448 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:56:01.448 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:56:31.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:56:31.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:56:31.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:56:31.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:56:31.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:56:31.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:56:31.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-05-29T22:56:31.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:56:31.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-05-29T22:56:31.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:56:31.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:56:31.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:56:31.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-05-29T22:57:18.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-05-29T22:57:18.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:57:18.906 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:57:18.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:57:18.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:57:18.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:57:18.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:57:18.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:57:18.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:57:18.927 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:57:18.927 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:57:18.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:57:19.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:57:19.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:57:19.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:57:19.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:57:19.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T22:57:19.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:57:19.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T22:57:19.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:57:19.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:57:19.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:57:19.228 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:57:19.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:57:05
2026-05-29T22:57:19.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73084, datetime.datetime(2026, 5, 29, 22, 57, 5), datetime.datetime(2026, 5, 29, 22, 57, 5), 'salt', 8.96, 72.96, None, 20.71, 35.8, 4.58, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:57:19.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:57:19.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:57:19.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:57:05, diff=14.297688s, valid=True
2026-05-29T22:57:19.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:57:19.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T22:57:19.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:57:12, diff=7.301526s, valid=True
2026-05-29T22:57:19.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:57:19.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:57:19.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:57:04, diff=15.308807s, valid=True
2026-05-29T22:57:19.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:57:19.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:57:19.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:57:19.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:57:19.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:57:19.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T22:57:19.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:57:12, diff=7.311902s, valid=True
2026-05-29T22:57:19.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:57:19.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:57:19.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:57:19.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020881.312556s, valid=True
2026-05-29T22:57:19.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:57:19.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:57:19.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:57:19.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:57:19.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:57:19.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:57:19.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:57:19.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:57:19.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:57:19.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:57:19.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:57:19.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:57:19.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:57:19.640 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:57:19.888 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:57:20.261 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:57:20.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:57:20.367 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:57:20.367 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:57:20.609 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:57:20.609 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:57:50.638 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:57:50.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:57:50.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:57:50.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:57:50.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:57:51.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:57:51.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-05-29T22:57:51.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:57:51.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-05-29T22:57:51.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:57:51.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:57:51.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:57:51.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T22:58:36.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-05-29T22:58:36.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:58:36.208 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:58:36.208 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:58:36.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:58:36.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:58:36.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:58:36.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:58:36.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:58:36.229 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:58:36.229 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:58:36.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:58:36.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:58:36.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:58:36.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:58:36.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:58:36.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T22:58:36.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:58:36.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T22:58:36.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:58:36.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:58:36.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:58:36.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:58:36.562 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:58:36
2026-05-29T22:58:36.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73087, datetime.datetime(2026, 5, 29, 22, 58, 36), datetime.datetime(2026, 5, 29, 22, 58, 36), 'salt', 8.99, 72.96, None, 21.45, 52.47, 4.57, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:58:36.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:58:36.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:58:36.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:58:36, diff=0.568804s, valid=True
2026-05-29T22:58:36.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:58:36.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T22:58:36.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:59:12, diff=-35.428339s, valid=True
2026-05-29T22:58:36.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:58:36.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:58:36.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:58:35, diff=1.57845s, valid=True
2026-05-29T22:58:36.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:58:36.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:58:36.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:58:36.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:58:36.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:58:36.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T22:58:36.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:59:12, diff=-35.418515s, valid=True
2026-05-29T22:58:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:58:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:58:36.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:58:36.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020958.582161s, valid=True
2026-05-29T22:58:36.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:58:36.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:58:36.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:58:36.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:58:36.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:58:36.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:58:36.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:58:36.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:58:36.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:58:36.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:58:36.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:58:36.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:58:36.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:58:36.979 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:58:37.203 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:58:37.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:58:37.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:58:37.665 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:58:37.665 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:58:37.857 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:58:37.857 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:59:07.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:59:07.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:59:07.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:59:08.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:59:08.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:59:08.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:59:08.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-05-29T22:59:08.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:59:08.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-05-29T22:59:08.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:59:08.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:59:08.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:59:08.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-05-29T22:59: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-05-29T22:59:11.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:59:11.854 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:59:11.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:59:11.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:59:11.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:59:11.868 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:59:11.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:59:11.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:59:11.868 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:59:11.868 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:59:11.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:59:11.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:59:11.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:59:12.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:59:12.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:59:12.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T22:59:12.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:59:12.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T22:59:12.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:59:12.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:59:12.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:59:12.126 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:59:12.192 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:59:06
2026-05-29T22:59:12.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73088, datetime.datetime(2026, 5, 29, 22, 59, 6), datetime.datetime(2026, 5, 29, 22, 59, 6), 'salt', 9.03, 73.09, None, 21.84, 45.24, 4.56, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:59:12.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:59:12.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:59:12.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:59:06, diff=6.198214s, valid=True
2026-05-29T22:59:12.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:59:12.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T22:59:12.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:59:12, diff=0.201021s, valid=True
2026-05-29T22:59:12.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:59:12.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:59:12.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:59:05, diff=7.207649s, valid=True
2026-05-29T22:59:12.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:59:12.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:59:12.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:59:12.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:59:12.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:59:12.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T22:59:12.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:59:12, diff=0.210671s, valid=True
2026-05-29T22:59:12.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:59:12.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:59:12.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:59:12.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1020994.211331s, valid=True
2026-05-29T22:59:12.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:59:12.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:59:12.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:59:12.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:59:12.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:59:12.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:59:12.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:59:12.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:59:12.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:59:12.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:59:12.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:59:12.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:59:12.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:59:12.530 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:59:12.744 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:59:13.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:59:13.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:59:13.188 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:59:13.188 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:59:13.467 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:59:13.467 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T22:59:43.489 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T22:59:43.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T22:59:43.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T22:59:43.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T22:59:43.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T22:59:43.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T22:59:43.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-05-29T22:59:43.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T22:59:43.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T22:59:43.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T22:59:43.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T22:59:43.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T22:59:43.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-05-29T22:59:46.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-05-29T22:59:46.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T22:59:46.563 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T22:59:46.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T22:59:46.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T22:59:46.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T22:59:46.574 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T22:59:46.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T22:59:46.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T22:59:46.575 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T22:59:46.575 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T22:59:46.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T22:59:46.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T22:59:46.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T22:59:46.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T22:59:46.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:59:46.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T22:59:46.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T22:59:46.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T22:59:46.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T22:59:46.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T22:59:46.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T22:59:46.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T22:59:46.890 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 22:59:37
2026-05-29T22:59:46.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73089, datetime.datetime(2026, 5, 29, 22, 59, 37), datetime.datetime(2026, 5, 29, 22, 59, 36), 'salt', 8.99, 73.13, None, 20.22, 39.98, 4.54, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T22:59:46.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T22:59:46.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T22:59:46.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:59:36, diff=10.896784s, valid=True
2026-05-29T22:59:46.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T22:59:46.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T22:59:46.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:00:12, diff=-25.100448s, valid=True
2026-05-29T22:59:46.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T22:59:46.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T22:59:46.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 22:59:35, diff=11.906188s, valid=True
2026-05-29T22:59:46.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T22:59:46.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:59:46.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T22:59:46.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T22:59:46.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T22:59:46.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T22:59:46.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:00:12, diff=-25.09079s, valid=True
2026-05-29T22:59:46.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T22:59:46.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T22:59:46.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T22:59:46.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021028.909894s, valid=True
2026-05-29T22:59:46.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T22:59:46.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T22:59:46.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T22:59:46.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T22:59:46.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T22:59:46.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T22:59:46.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T22:59:46.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T22:59:47.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T22:59:47.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T22:59:47.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T22:59:47.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T22:59:47.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T22:59:47.312 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T22:59:47.537 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:59:47.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T22:59:48.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T22:59:48.106 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T22:59:48.106 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T22:59:48.300 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T22:59:48.301 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:00:18.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:00:18.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:00:18.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:00:18.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:00:18.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:00:18.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:00:18.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-05-29T23:00:18.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:00:18.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-05-29T23:00:18.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:00:18.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:00:18.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:00:18.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-05-29T23:01:42.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-05-29T23:01:42.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:01:42.393 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:01:42.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:01:42.402 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:01:42.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:01:42.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:01:42.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:01:42.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:01:42.414 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:01:42.414 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:01:42.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:01:42.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:01:42.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:01:42.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:01:42.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:01:42.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:01:42.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:01:42.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:01:42.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:01:42.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:01:42.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:01:42.689 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:01:42.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:01:38
2026-05-29T23:01:42.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73093, datetime.datetime(2026, 5, 29, 23, 1, 38), datetime.datetime(2026, 5, 29, 23, 1, 37), 'salt', 8.83, 73.73, None, 19.23, 40.08, 4.43, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:01:42.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:01:42.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:01:42.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:01:37, diff=5.75719s, valid=True
2026-05-29T23:01:42.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:01:42.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:01:42.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:02:12, diff=-29.239865s, valid=True
2026-05-29T23:01:42.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:01:42.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:01:42.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:01:37, diff=5.767142s, valid=True
2026-05-29T23:01:42.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:01:42.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:01:42.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:01:42.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:01:42.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:01:42.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:01:42.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:02:12, diff=-29.228803s, valid=True
2026-05-29T23:01:42.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:01:42.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:01:42.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:01:42.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021144.771891s, valid=True
2026-05-29T23:01:42.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:01:42.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:01:42.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:01:42.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:01:42.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:01:42.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:01:42.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:01:42.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:01:42.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:01:42.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:01:42.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:01:43.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:01:43.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:01:43.106 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:01:43.329 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:01:43.684 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:01:43.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:01:43.794 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:01:43.794 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:01:45.338 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:01:45.338 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:02:15.356 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:02:15.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:02:15.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:02:15.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:02:15.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:02:15.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:02:15.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-05-29T23:02:15.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:02:15.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T23:02:15.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:02:15.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:02:15.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:02:15.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-05-29T23:03:01.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-05-29T23:03:01.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:03:01.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:03:01.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:03:01.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:03:01.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:03:01.149 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:03:01.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:03:01.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:03:01.149 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:03:01.149 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:03:01.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:03:01.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:03:01.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:03:01.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:03:01.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:03:01.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:03:01.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:03:01.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:03:01.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:03:01.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:03:01.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:03:01.407 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:03:01.482 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:02:38
2026-05-29T23:03:01.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73095, datetime.datetime(2026, 5, 29, 23, 2, 38), datetime.datetime(2026, 5, 29, 23, 2, 38), 'salt', 8.86, 73.63, None, 17.71, 40.78, 4.44, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:03:01.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:03:01.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:03:01.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:02:38, diff=23.488926s, valid=True
2026-05-29T23:03:01.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:03:01.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:03:01.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:03:12, diff=-10.508311s, valid=True
2026-05-29T23:03:01.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:03:01.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:03:01.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:02:37, diff=24.498318s, valid=True
2026-05-29T23:03:01.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:03:01.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:03:01.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:03:01.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:03:01.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:03:01.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:03:01.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:03:12, diff=-10.498716s, valid=True
2026-05-29T23:03:01.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:03:01.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:03:01.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:03:01.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021223.501943s, valid=True
2026-05-29T23:03:01.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:03:01.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:03:01.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:03:01.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:03:01.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:03:01.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:03:01.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:03:01.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:03:01.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:03:01.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:03:01.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:03:01.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:03:01.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:03:01.877 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:03:02.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:03:02.497 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:03:02.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:03:02.613 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:03:02.613 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:03:02.882 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:03:02.882 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:03:32.911 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:03:32.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:03:32.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:03:33.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:03:33.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:03:33.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:03:33.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-05-29T23:03:33.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:03:33.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-05-29T23:03:33.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:03:33.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:03:33.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:03:33.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-05-29T23:03:37.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-05-29T23:03:37.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:03:37.996 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:03:37.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:03:38.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:03:38.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:03:38.018 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:03:38.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:03:38.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:03:38.018 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:03:38.018 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:03:38.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:03:38.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:03:38.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:03:38.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:03:38.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:03:38.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:03:38.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:03:38.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:03:38.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:03:38.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:03:38.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:03:38.274 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:03:38.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:03:08
2026-05-29T23:03:38.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73096, datetime.datetime(2026, 5, 29, 23, 3, 8), datetime.datetime(2026, 5, 29, 23, 3, 8), 'salt', 8.89, 73.89, None, 17.93, 41.04, 4.39, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:03:38.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:03:38.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:03:38.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:03:08, diff=30.342009s, valid=True
2026-05-29T23:03:38.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:03:38.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:03:38.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:03:12, diff=26.344816s, valid=True
2026-05-29T23:03:38.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:03:38.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:03:38.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:03:07, diff=31.351453s, valid=True
2026-05-29T23:03:38.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:03:38.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:03:38.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:03:38.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:03:38.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:03:38.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:03:38.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:03:12, diff=26.354463s, valid=True
2026-05-29T23:03:38.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:03:38.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:03:38.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:03:38.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021260.355139s, valid=True
2026-05-29T23:03:38.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:03:38.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:03:38.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:03:38.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:03:38.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:03:38.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:03:38.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:03:38.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:03:38.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:03:38.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:03:38.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:03:38.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:03:38.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:03:38.670 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:03:38.883 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:03:39.290 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:03:39.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:03:39.391 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:03:39.391 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:03:39.582 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:03:39.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:04:09.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:04:09.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:04:09.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:04:10.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:04:10.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:04:10.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:04:10.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-05-29T23:04:10.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:04:10.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-05-29T23:04:10.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:04:10.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:04:10.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:04:10.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-05-29T23:04:14.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-05-29T23:04:14.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:04:14.648 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:04:14.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:04:14.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:04:14.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:04:14.670 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:04:14.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:04:14.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:04:14.670 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:04:14.670 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:04:14.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:04:14.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:04:14.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:04:14.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:04:14.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:04:14.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:04:14.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:04:14.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:04:14.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:04:14.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:04:14.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:04:14.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:04:14.984 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:04:09
2026-05-29T23:04:14.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73098, datetime.datetime(2026, 5, 29, 23, 4, 9), datetime.datetime(2026, 5, 29, 23, 4, 8), 'salt', 8.83, 74.22, None, 18.95, 39.18, 4.33, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:04:14.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:04:14.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:04:14.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:04:08, diff=6.990221s, valid=True
2026-05-29T23:04:14.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:04:14.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:04:14.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:04:12, diff=2.993023s, valid=True
2026-05-29T23:04:14.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:04:14.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:04:14.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:04:07, diff=7.99973s, valid=True
2026-05-29T23:04:14.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:04:14.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:04:14.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:04:15.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:04:15.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:04:15.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:04:15.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:04:12, diff=3.002844s, valid=True
2026-05-29T23:04:15.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:04:15.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:04:15.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:04:15.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021297.003523s, valid=True
2026-05-29T23:04:15.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:04:15.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:04:15.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:04:15.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:04:15.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:04:15.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:04:15.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:04:15.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:04:15.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:04:15.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:04:15.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:04:15.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:04:15.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:04:15.323 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:04:15.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:04:15.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:04:15.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:04:15.991 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:04:15.991 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:04:16.183 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:04:16.183 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:04:46.188 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:04:46.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:04:46.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:04:46.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:04:46.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:04:46.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:04:46.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-05-29T23:04:46.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:04:46.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-05-29T23:04:46.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:04:46.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:04:46.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:04:46.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-05-29T23:04:53.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-05-29T23:04:53.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:04:53.091 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:04:53.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:04:53.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:04:53.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:04:53.112 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:04:53.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:04:53.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:04:53.112 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:04:53.112 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:04:53.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:04:53.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:04:53.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:04:53.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:04:53.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:04:53.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:04:53.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:04:53.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:04:53.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:04:53.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:04:53.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:04:53.365 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:04:53.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:04:39
2026-05-29T23:04:53.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73099, datetime.datetime(2026, 5, 29, 23, 4, 39), datetime.datetime(2026, 5, 29, 23, 4, 39), 'salt', 8.7, 74.29, None, 21.21, 38.25, 4.32, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:04:53.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:04:53.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:04:53.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:04:39, diff=14.42993s, valid=True
2026-05-29T23:04:53.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:04:53.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:04:53.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:05:12, diff=-18.567274s, valid=True
2026-05-29T23:04:53.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:04:53.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:04:53.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:04:37, diff=16.439368s, valid=True
2026-05-29T23:04:53.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:04:53.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:04:53.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:04:53.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:04:53.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:04:53.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:04:53.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:05:12, diff=-18.55764s, valid=True
2026-05-29T23:04:53.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:04:53.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:04:53.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:04:53.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021335.443024s, valid=True
2026-05-29T23:04:53.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:04:53.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:04:53.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:04:53.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:04:53.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:04:53.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:04:53.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:04:53.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:04:53.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:04:53.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:04:53.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:04:53.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:04:53.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:04:53.760 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:04:54.048 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:04:54.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:04:54.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:04:54.498 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:04:54.498 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:04:54.698 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:04:54.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:05:24.729 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:05:24.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:05:24.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:05:24.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:05:24.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:05:25.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:05:25.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-05-29T23:05:25.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:05: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-05-29T23:05:25.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:05:25.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:05:25.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:05:25.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-05-29T23:05:27.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-05-29T23:05:27.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:05:27.821 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:05:27.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:05:27.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:05:27.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:05:27.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:05:27.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:05:27.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:05:27.841 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:05:27.841 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:05:27.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:05:27.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:05:27.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:05:28.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:05:28.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:05:28.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:05:28.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:05:28.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:05:28.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:05:28.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:05:28.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:05:28.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:05:28.156 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:05:09
2026-05-29T23:05:28.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73100, datetime.datetime(2026, 5, 29, 23, 5, 9), datetime.datetime(2026, 5, 29, 23, 5, 9), 'salt', 8.76, 74.52, None, 21.03, 44.28, 4.27, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:05:28.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:05:28.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:05:28.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:05:09, diff=19.162324s, valid=True
2026-05-29T23:05:28.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:05:28.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:05:28.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:05:12, diff=16.165117s, valid=True
2026-05-29T23:05:28.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:05:28.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:05:28.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:05:08, diff=20.17187s, valid=True
2026-05-29T23:05:28.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:05:28.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:05:28.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:05:28.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:05:28.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:05:28.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:05:28.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:05:12, diff=16.174892s, valid=True
2026-05-29T23:05:28.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:05:28.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:05:28.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:05:28.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021370.175577s, valid=True
2026-05-29T23:05:28.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:05:28.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:05:28.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:05:28.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:05:28.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:05:28.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:05:28.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:05:28.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:05:28.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:05:28.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:05:28.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:05:28.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:05:28.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:05:28.494 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:05:28.710 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:05:29.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:05:29.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:05:29.162 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:05:29.162 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:05:29.385 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:05:29.385 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:05:59.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:05:59.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:05:59.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:05:59.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:05:59.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:06:00.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:06:00.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-05-29T23:06:00.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:06:00.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-05-29T23:06:00.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:06:00.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:06:00.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:06:00.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-05-29T23:06:02.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-05-29T23:06:02.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:06:02.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:06:02.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:06:02.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:06:02.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:06:02.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:06:02.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:06:02.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:06:02.735 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:06:02.735 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:06:02.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:06:02.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:06:02.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:06:02.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:06:02.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:06:02.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:06:02.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:06:02.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:06:02.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:06:02.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:06:02.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:06:02.990 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:06:03.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:05:39
2026-05-29T23:06:03.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73101, datetime.datetime(2026, 5, 29, 23, 5, 39), datetime.datetime(2026, 5, 29, 23, 5, 39), 'salt', 8.79, 74.65, None, 19.58, 43.53, 4.24, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:06:03.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:06:03.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:06:03.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:05:39, diff=24.056231s, valid=True
2026-05-29T23:06:03.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:06:03.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:06:03.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:06:12, diff=-8.940927s, valid=True
2026-05-29T23:06:03.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:06:03.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:06:03.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:05:38, diff=25.065733s, valid=True
2026-05-29T23:06:03.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:06:03.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:06:03.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:06:03.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:06:03.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:06:03.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:06:03.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:06:12, diff=-8.931195s, valid=True
2026-05-29T23:06:03.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:06:03.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:06:03.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:06:03.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021405.069479s, valid=True
2026-05-29T23:06:03.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:06:03.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:06:03.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:06:03.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:06:03.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:06:03.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:06:03.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:06:03.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:06:03.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:06:03.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:06:03.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:06:03.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:06:03.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:06:03.460 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:06:03.677 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:06:04.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:06:04.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:06:04.130 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:06:04.130 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:06:04.325 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:06:04.325 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:06:34.355 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:06:34.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:06:34.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:06:34.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:06:34.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:06:34.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:06:34.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-05-29T23:06:34.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:06: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-05-29T23:06:34.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:06:34.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:06:34.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:06:34.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-05-29T23:07:32.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-05-29T23:07:32.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:07:32.089 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:07:32.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:07:32.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:07:32.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:07:32.113 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:07:32.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:07:32.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:07:32.114 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:07:32.114 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:07:32.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:07:32.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:07:32.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:07:32.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:07:32.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:07:32.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:07:32.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:07:32.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:07:32.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:07:32.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:07:32.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:07:32.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:07:32.430 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:07:10
2026-05-29T23:07:32.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73104, datetime.datetime(2026, 5, 29, 23, 7, 10), datetime.datetime(2026, 5, 29, 23, 7, 10), 'salt', 8.73, 74.69, None, 17.5, 34.44, 4.24, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:07:32.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:07:32.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:07:32.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:07:10, diff=22.436579s, valid=True
2026-05-29T23:07:32.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:07:32.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:07:32.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:07:12, diff=20.439518s, valid=True
2026-05-29T23:07:32.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:07:32.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:07:32.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:07:08, diff=24.446256s, valid=True
2026-05-29T23:07:32.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:07:32.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:07:32.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:07:32.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:07:32.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:07:32.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:07:32.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:07:12, diff=20.449318s, valid=True
2026-05-29T23:07:32.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:07:32.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:07:32.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:07:32.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021494.449994s, valid=True
2026-05-29T23:07:32.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:07:32.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:07:32.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:07:32.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:07:32.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:07:32.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:07:32.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:07:32.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:07:32.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:07:32.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:07:32.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:07:32.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:07:32.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:07:32.769 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:07:32.995 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:07:33.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:07:33.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:07:33.455 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:07:33.455 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:07:35.338 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:07:35.338 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:08:05.352 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:08:05.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:08:05.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:08:05.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:08:05.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:08:05.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:08:05.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T23:08:05.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:08:05.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-05-29T23:08:05.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:08:05.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:08:05.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:08:05.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-05-29T23:08:08.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-05-29T23:08:08.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:08:08.899 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:08:08.899 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:08:08.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:08:08.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:08:08.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:08:08.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:08:08.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:08:08.920 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:08:08.920 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:08:08.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:08:09.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:08:09.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:08:09.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:08:09.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:08:09.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:08:09.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:08:09.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:08:09.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:08:09.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:08:09.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:08:09.190 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:08:09.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:07:40
2026-05-29T23:08:09.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73105, datetime.datetime(2026, 5, 29, 23, 7, 40), datetime.datetime(2026, 5, 29, 23, 7, 40), 'salt', 8.79, 74.79, None, 16.48, 37.4, 4.21, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:08:09.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:08:09.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:08:09.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:07:40, diff=29.258596s, valid=True
2026-05-29T23:08:09.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:08:09.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:08:09.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:08:12, diff=-2.738544s, valid=True
2026-05-29T23:08:09.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:08:09.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:08:09.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:07:39, diff=30.268196s, valid=True
2026-05-29T23:08:09.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:08:09.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:08:09.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:08:09.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:08:09.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:08:09.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:08:09.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:08:12, diff=-2.728787s, valid=True
2026-05-29T23:08:09.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:08:09.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:08:09.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:08:09.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021531.271888s, valid=True
2026-05-29T23:08:09.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:08:09.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:08:09.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:08:09.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:08:09.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:08:09.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:08:09.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:08:09.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:08:09.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:08:09.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:08:09.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:08:09.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:08:09.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:08:09.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:08:09.906 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:08:10.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:08:10.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:08:10.377 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:08:10.377 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:08:10.648 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:08:10.648 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:08:40.670 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:08:40.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:08:40.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:08:40.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:08:40.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:08:41.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:08:41.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-05-29T23:08:41.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:08:41.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-05-29T23:08:41.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:08:41.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:08:41.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:08:41.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-05-29T23:08:43.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-05-29T23:08:43.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:08:43.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:08:43.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:08:43.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:08:43.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:08:43.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:08:43.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:08:43.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:08:43.748 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:08:43.748 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:08:43.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:08:43.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:08:43.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:08:43.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:08:43.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:08:43.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:08:43.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:08:44.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:08:44.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:08:44.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:08:44.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:08:44.021 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:08:44.083 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:08:41
2026-05-29T23:08:44.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73107, datetime.datetime(2026, 5, 29, 23, 8, 41), datetime.datetime(2026, 5, 29, 23, 8, 40), 'salt', 8.76, 74.85, None, 18.74, 38.55, 4.2, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:08:44.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:08:44.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:08:44.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:08:40, diff=4.089602s, valid=True
2026-05-29T23:08:44.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:08:44.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:08:44.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:09:12, diff=-27.907585s, valid=True
2026-05-29T23:08:44.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:08:44.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:08:44.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:08:40, diff=4.099132s, valid=True
2026-05-29T23:08:44.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:08:44.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:08:44.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:08:44.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:08:44.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:08:44.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:08:44.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:09:12, diff=-27.89791s, valid=True
2026-05-29T23:08:44.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:08:44.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:08:44.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:08:44.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021566.102746s, valid=True
2026-05-29T23:08:44.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:08:44.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:08:44.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:08:44.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:08:44.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:08:44.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:08:44.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:08:44.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:08:44.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:08:44.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:08:44.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:08:44.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:08:44.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:08:44.430 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:08:44.653 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:08:45.018 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:08:45.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:08:45.118 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:08:45.119 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:08:45.412 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:08:45.412 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:09:15.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:09:15.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:09:15.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:09:15.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:09:15.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:09:15.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:09:15.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-05-29T23:09:15.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:09:15.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-05-29T23:09:15.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:09:15.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:09:15.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:09:15.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-05-29T23:09:18.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-05-29T23:09:18.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:09:18.507 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:09:18.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:09:18.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:09:18.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:09:18.528 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:09:18.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:09:18.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:09:18.529 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:09:18.529 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:09:18.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:09:18.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:09:18.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:09:18.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:09:18.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:09:18.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:09:18.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:09:18.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:09:18.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:09:18.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:09:18.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:09:18.788 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:09:18.849 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:09:11
2026-05-29T23:09:18.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73108, datetime.datetime(2026, 5, 29, 23, 9, 11), datetime.datetime(2026, 5, 29, 23, 9, 11), 'salt', 8.73, 75.12, None, 18.74, 43.64, 4.15, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:09:18.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:09:18.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:09:18.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:09:11, diff=7.855214s, valid=True
2026-05-29T23:09:18.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:09:18.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:09:18.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:09:12, diff=6.858024s, valid=True
2026-05-29T23:09:18.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:09:18.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:09:18.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:09:10, diff=8.864724s, valid=True
2026-05-29T23:09:18.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:09:18.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:09:18.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:09:18.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:09:18.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:09:18.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:09:18.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:09:12, diff=6.867719s, valid=True
2026-05-29T23:09:18.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:09:18.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:09:18.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:09:18.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021600.868369s, valid=True
2026-05-29T23:09:18.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:09:18.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:09:18.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:09:18.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:09:18.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:09:18.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:09:18.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:09:18.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:09:19.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:09:19.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:09:19.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:09:19.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:09:19.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:09:19.255 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:09:19.471 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:09:19.820 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:09:19.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:09:19.930 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:09:19.930 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:09:20.192 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:09:20.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:09:50.223 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:09:50.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:09:50.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:09:50.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:09:50.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:09:50.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:09:50.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-05-29T23:09:50.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:09:50.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-05-29T23:09:50.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:09:50.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:09:50.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:09:50.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-05-29T23:09:53.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-05-29T23:09:53.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:09:53.285 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:09:53.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:09:53.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:09:53.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:09:53.305 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:09:53.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:09:53.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:09:53.305 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:09:53.305 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:09:53.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:09:53.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:09:53.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:09:53.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:09:53.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:09:53.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:09:53.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:09:53.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:09:53.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:09:53.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:09:53.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:09:53.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:09:53.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:09:41
2026-05-29T23:09:53.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73109, datetime.datetime(2026, 5, 29, 23, 9, 41), datetime.datetime(2026, 5, 29, 23, 9, 41), 'salt', 8.66, 75.29, None, 21.35, 40.08, 4.12, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:09:53.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:09:53.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:09:53.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:09:41, diff=12.618199s, valid=True
2026-05-29T23:09:53.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:09:53.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:09:53.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:10:12, diff=-18.37896s, valid=True
2026-05-29T23:09:53.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:09:53.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:09:53.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:09:40, diff=13.627788s, valid=True
2026-05-29T23:09:53.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:09:53.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:09:53.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:09:53.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:09:53.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:09:53.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:09:53.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:10:12, diff=-18.369173s, valid=True
2026-05-29T23:09:53.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:09:53.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:09:53.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:09:53.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021635.631487s, valid=True
2026-05-29T23:09:53.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:09:53.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:09:53.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:09:53.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:09:53.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:09:53.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:09:53.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:09:53.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:09:53.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:09:53.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:09:53.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:09:53.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:09:53.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:09:53.953 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:09:54.170 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:09:54.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:09:54.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:09:54.623 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:09:54.623 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:09:54.911 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:09:54.912 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:10:24.941 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:10:24.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:10:24.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:10:25.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:10:25.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:10:25.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:10:25.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T23:10:25.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:10:25.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-05-29T23:10:25.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:10:25.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:10:25.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:10:25.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-05-29T23:10:31.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-05-29T23:10:31.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:10:31.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:10:31.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:10:31.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:10:31.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:10:31.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:10:31.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:10:31.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:10:31.699 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:10:31.699 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:10:31.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:10:31.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:10:31.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:10:31.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:10:31.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:10:31.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:10:31.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:10:31.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:10:31.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:10:31.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:10:31.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:10:31.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:10:32.023 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:10:11
2026-05-29T23:10:32.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73110, datetime.datetime(2026, 5, 29, 23, 10, 11), datetime.datetime(2026, 5, 29, 23, 10, 11), 'salt', 8.73, 75.35, None, 18.98, 40.19, 4.11, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:10:32.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:10:32.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:10:32.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:10:11, diff=21.029459s, valid=True
2026-05-29T23:10:32.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:10:32.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:10:32.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:10:12, diff=20.032292s, valid=True
2026-05-29T23:10:32.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:10:32.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:10:32.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:10:11, diff=21.039059s, valid=True
2026-05-29T23:10:32.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:10:32.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:10:32.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:10:32.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:10:32.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:10:32.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:10:32.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:10:12, diff=20.042057s, valid=True
2026-05-29T23:10:32.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:10:32.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:10:32.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:10:32.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021674.042734s, valid=True
2026-05-29T23:10:32.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:10:32.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:10:32.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:10:32.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:10:32.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:10:32.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:10:32.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:10:32.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:10:32.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:10:32.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:10:32.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:10:32.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:10:32.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:10:32.360 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:10:32.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:10:32.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:10:33.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:10:33.056 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:10:33.056 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:10:33.211 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:10:33.211 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:11:03.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:11:03.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:11:03.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:11:03.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:11:03.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:11:04.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:11:04.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T23:11:04.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:11:04.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-05-29T23:11:04.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:11:04.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:11:04.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:11:04.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-05-29T23:11:06.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-05-29T23:11:06.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:11:06.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:11:06.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:11:06.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:11:06.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:11:06.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:11:06.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:11:06.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:11:06.817 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:11:06.817 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:11:06.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:11:06.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:11:06.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:11:06.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:11:06.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:11:07.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:11:07.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:11:07.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:11:07.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:11:07.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:11:07.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:11:07.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:11:07.133 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:10:42
2026-05-29T23:11:07.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73111, datetime.datetime(2026, 5, 29, 23, 10, 42), datetime.datetime(2026, 5, 29, 23, 10, 41), 'salt', 8.76, 75.19, None, 18.42, 38.2, 4.14, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:11:07.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:11:07.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:11:07.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:10:41, diff=26.139125s, valid=True
2026-05-29T23:11:07.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:11:07.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:11:07.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:11:12, diff=-4.858062s, valid=True
2026-05-29T23:11:07.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:11:07.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:11:07.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:10:40, diff=27.148647s, valid=True
2026-05-29T23:11:07.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:11:07.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:11:07.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:11:07.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:11:07.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:11:07.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:11:07.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:11:12, diff=-4.848248s, valid=True
2026-05-29T23:11:07.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:11:07.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:11:07.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:11:07.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021709.152425s, valid=True
2026-05-29T23:11:07.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:11:07.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:11:07.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:11:07.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:11:07.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:11:07.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:11:07.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:11:07.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:11:07.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:11:07.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:11:07.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:11:07.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:11:07.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:11:07.484 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:11:07.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:11:08.123 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:11:08.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:11:08.227 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:11:08.228 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:11:08.517 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:11:08.517 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:11:38.548 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:11:38.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:11:38.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:11:39.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:11:39.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:11:39.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:11:39.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-05-29T23:11:39.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:11:39.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-05-29T23:11:39.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:11:39.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:11:39.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:11:39.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-05-29T23:12:04.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-05-29T23:12:04.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:12:04.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:12:04.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:12:04.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:12:04.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:12:04.381 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:12:04.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:12:04.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:12:04.382 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:12:04.382 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:12:04.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:12:04.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:12:04.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:12:04.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:12:04.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:12:04.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:12:04.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:12:04.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:12:04.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:12:04.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:12:04.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:12:04.652 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:12:04.711 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:11:42
2026-05-29T23:12:04.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73113, datetime.datetime(2026, 5, 29, 23, 11, 42), datetime.datetime(2026, 5, 29, 23, 11, 42), 'salt', 8.73, 74.85, None, 17.82, 38.46, 4.21, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:12:04.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:12:04.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:12:04.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:11:42, diff=22.718187s, valid=True
2026-05-29T23:12:04.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:12:04.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:12:04.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:12:12, diff=-7.278147s, valid=True
2026-05-29T23:12:04.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:12:04.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:12:04.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:11:41, diff=23.728676s, valid=True
2026-05-29T23:12:04.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:12:04.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:12:04.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:12:04.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:12:04.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:12:04.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:12:04.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:12:12, diff=-7.268304s, valid=True
2026-05-29T23:12:04.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:12:04.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:12:04.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:12:04.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021766.732371s, valid=True
2026-05-29T23:12:04.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:12:04.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:12:04.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:12:04.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:12:04.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:12:04.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:12:04.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:12:04.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:12:04.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:12:04.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:12:04.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:12:04.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:12:05.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:12:05.070 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:12:05.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:12:05.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:12:05.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:12:05.735 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:12:05.735 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:12:05.890 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:12:05.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:12:35.920 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:12:35.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:12:35.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:12:36.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:12:36.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:12:36.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:12:36.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-05-29T23:12:36.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:12:36.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-05-29T23:12:36.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:12:36.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:12:36.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:12:36.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-05-29T23:12: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-05-29T23:12:40.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:12:40.677 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:12:40.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:12:40.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:12:40.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:12:40.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:12:40.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:12:40.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:12:40.705 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:12:40.705 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:12:40.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:12:40.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:12:40.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:12:40.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:12:40.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:12:40.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:12:40.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:12:40.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:12:40.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:12:40.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:12:40.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:12:40.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:12:41.017 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:12:12
2026-05-29T23:12:41.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73114, datetime.datetime(2026, 5, 29, 23, 12, 12), datetime.datetime(2026, 5, 29, 23, 12, 11), 'salt', 8.76, 75.05, None, 16.23, 40.31, 4.17, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:12:41.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:12:41.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:12:41.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:12:11, diff=30.024015s, valid=True
2026-05-29T23:12:41.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:12:41.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:12:41.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:12:12, diff=29.026845s, valid=True
2026-05-29T23:12:41.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:12:41.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:12:41.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:12:11, diff=30.033493s, valid=True
2026-05-29T23:12:41.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:12:41.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:12:41.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:12:41.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:12:41.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:12:41.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:12:41.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:12:12, diff=29.036495s, valid=True
2026-05-29T23:12:41.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:12:41.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:12:41.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:12:41.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021803.037171s, valid=True
2026-05-29T23:12:41.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:12:41.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:12:41.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:12:41.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:12:41.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:12:41.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:12:41.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:12:41.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:12:41.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:12:41.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:12:41.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:12:41.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:12:41.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:12:41.365 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:12:41.672 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:12:42.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:12:42.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:12:42.136 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:12:42.136 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:12:42.433 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:12:42.433 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:13:12.452 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:13:12.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:13:12.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:13:12.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:13:12.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:13:12.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:13:12.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T23:13:12.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:13:12.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-05-29T23:13:12.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:13:12.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:13:12.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:13:12.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-05-29T23:13:15.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-05-29T23:13:15.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:13:15.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:13:15.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:13:15.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:13:15.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:13:15.546 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:13:15.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:13:15.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:13:15.546 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:13:15.547 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:13:15.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:13:15.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:13:15.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:13:15.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:13:15.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:13:15.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:13:15.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:13:15.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:13:15.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:13:15.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:13:15.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:13:15.801 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:13:15.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:13:13
2026-05-29T23:13:15.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73116, datetime.datetime(2026, 5, 29, 23, 13, 13), datetime.datetime(2026, 5, 29, 23, 13, 12), 'salt', 8.66, 75.12, None, 18.1, 44.4, 4.15, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:13:15.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:13:15.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:13:15.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:13:12, diff=3.86612s, valid=True
2026-05-29T23:13:15.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:13:15.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:13:15.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:13:12, diff=3.868907s, valid=True
2026-05-29T23:13:15.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:13:15.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:13:15.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:13:12, diff=3.875539s, valid=True
2026-05-29T23:13:15.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:13:15.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:13:15.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:13:15.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:13:15.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:13:15.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:13:15.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:13:12, diff=3.878543s, valid=True
2026-05-29T23:13:15.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:13:15.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:13:15.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:13:15.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021837.879211s, valid=True
2026-05-29T23:13:15.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:13:15.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:13:15.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:13:15.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:13:15.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:13:15.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:13:15.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:13:15.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:13:15.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:13:16.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:13:16.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:13:16.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:13:16.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:13:16.196 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:13:16.409 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:13:16.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:13:16.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:13:16.856 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:13:16.856 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:13:17.057 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:13:17.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:13:47.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:13:47.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:13:47.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:13:47.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:13:47.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:13:47.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:13:47.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-05-29T23:13:47.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:13:47.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-05-29T23:13:47.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:13:47.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:13:47.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:13:47.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T23:14:36.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-05-29T23:14:36.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:14:36.289 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:14:36.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:14:36.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:14:36.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:14:36.311 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:14:36.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:14:36.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:14:36.311 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:14:36.311 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:14:36.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:14:36.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:14:36.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:14:36.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:14:36.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:14:36.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:14:36.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:14:36.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:14:36.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:14:36.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:14:36.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:14:36.570 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:14:36.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:14:14
2026-05-29T23:14:36.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73118, datetime.datetime(2026, 5, 29, 23, 14, 14), datetime.datetime(2026, 5, 29, 23, 14, 14), 'salt', 8.63, 75.45, None, 19.65, 47.87, 4.09, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:14:36.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:14:36.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:14:36.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:14:14, diff=22.639671s, valid=True
2026-05-29T23:14:36.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:14:36.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:14:36.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:14:12, diff=24.642549s, valid=True
2026-05-29T23:14:36.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:14:36.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:14:36.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:14:13, diff=23.649395s, valid=True
2026-05-29T23:14:36.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:14:36.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:14:36.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:14:36.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:14:36.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:14:36.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:14:36.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:14:12, diff=24.652468s, valid=True
2026-05-29T23:14:36.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:14:36.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:14:36.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:14:36.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021918.653142s, valid=True
2026-05-29T23:14:36.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:14:36.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:14:36.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:14:36.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:14:36.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:14:36.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:14:36.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:14:36.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:14:36.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:14:36.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:14:36.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:14:36.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:14:36.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:14:36.972 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:14:37.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:14:37.608 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:14:37.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:14:37.711 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:14:37.711 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:14:37.866 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:14:37.866 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:15:07.895 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:15:07.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:15:07.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:15:08.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:15:08.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:15:08.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:15:08.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-05-29T23:15:08.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:15:08.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-05-29T23:15:08.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:15:08.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:15:08.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:15:08.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-05-29T23:15:10.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-05-29T23:15:11.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:15:11.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:15:11.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:15:11.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:15:11.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:15:11.022 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:15:11.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:15:11.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:15:11.023 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:15:11.023 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:15:11.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:15:11.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:15:11.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:15:11.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:15:11.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:15:11.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:15:11.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:15:11.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:15:11.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:15:11.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:15:11.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:15:11.303 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:15:11.361 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:14:44
2026-05-29T23:15:11.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73119, datetime.datetime(2026, 5, 29, 23, 14, 44), datetime.datetime(2026, 5, 29, 23, 14, 43), 'salt', 8.6, 75.52, None, 18.49, 43.03, 4.08, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:15:11.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:15:11.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:15:11.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:14:43, diff=28.367698s, valid=True
2026-05-29T23:15:11.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:15:11.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:15:11.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:15:12, diff=-0.629468s, valid=True
2026-05-29T23:15:11.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:15:11.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:15:11.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:14:42, diff=29.377314s, valid=True
2026-05-29T23:15:11.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:15:11.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:15:11.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:15:11.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:15:11.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:15:11.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:15:11.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:15:12, diff=-0.619643s, valid=True
2026-05-29T23:15:11.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:15:11.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:15:11.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:15:11.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021953.381018s, valid=True
2026-05-29T23:15:11.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:15:11.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:15:11.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:15:11.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:15:11.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:15:11.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:15:11.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:15:11.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:15:11.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:15:11.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:15:11.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:15:11.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:15:11.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:15:11.705 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:15:11.921 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:15:12.269 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:15:12.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:15:12.371 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:15:12.371 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:15:12.522 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:15:12.522 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:15:42.552 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:15:42.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:15:42.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:15:42.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:15:42.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:15:42.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:15:42.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-05-29T23:15:43.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:15:43.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-05-29T23:15:43.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:15:43.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:15:43.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:15:43.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-05-29T23:15:45.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-05-29T23:15:45.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:15:45.605 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:15:45.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:15:45.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:15:45.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:15:45.624 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:15:45.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:15:45.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:15:45.625 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:15:45.625 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:15:45.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:15:45.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:15:45.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:15:45.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:15:45.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:15:45.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:15:45.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:15:45.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:15:45.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:15:45.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:15:45.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:15:45.884 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:15:45.943 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:15:45
2026-05-29T23:15:45.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73121, datetime.datetime(2026, 5, 29, 23, 15, 45), datetime.datetime(2026, 5, 29, 23, 15, 44), 'salt', 8.63, 75.52, None, 18.03, 42.8, 4.08, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:15:45.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:15:45.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:15:45.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:15:44, diff=1.949485s, valid=True
2026-05-29T23:15:45.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:15:45.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:15:45.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:16:12, diff=-26.047661s, valid=True
2026-05-29T23:15:45.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:15:45.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:15:45.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:15:43, diff=2.959054s, valid=True
2026-05-29T23:15:45.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:15:45.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:15:45.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:15:45.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:15:45.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:15:45.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:15:45.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:16:12, diff=-26.037979s, valid=True
2026-05-29T23:15:45.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:15:45.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:15:45.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:15:45.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1021987.962688s, valid=True
2026-05-29T23:15:45.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:15:45.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:15:45.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:15:45.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:15:45.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:15:46.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:15:46.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:15:46.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:15:46.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:15:46.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:15:46.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:15:46.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:15:46.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:15:46.348 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:15:46.560 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:15:46.910 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:15:47.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:15:47.010 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:15:47.010 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:15:47.202 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:15:47.202 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:16:17.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:16:17.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:16:17.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:16:17.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:16:17.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:16:18.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:16:18.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-05-29T23:16:18.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:16:18.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-05-29T23:16:18.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:16:18.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:16:18.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:16:18.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-05-29T23:16:20.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-05-29T23:16:20.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:16:20.742 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:16:20.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:16:20.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:16:20.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:16:20.763 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:16:20.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:16:20.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:16:20.763 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:16:20.763 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:16:20.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:16:20.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:16:20.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:16:20.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:16:20.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:16:20.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:16:20.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:16:21.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:16:21.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:16:21.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:16:21.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:16:21.028 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:16:21.087 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:16:15
2026-05-29T23:16:21.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73122, datetime.datetime(2026, 5, 29, 23, 16, 15), datetime.datetime(2026, 5, 29, 23, 16, 15), 'salt', 8.7, 75.62, None, 18.98, 37.99, 4.06, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:16:21.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:16:21.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:16:21.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:16:15, diff=6.093783s, valid=True
2026-05-29T23:16:21.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:16:21.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:16:21.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:16:12, diff=9.0966s, valid=True
2026-05-29T23:16:21.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:16:21.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:16:21.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:16:13, diff=8.103421s, valid=True
2026-05-29T23:16:21.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:16:21.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:16:21.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:16:21.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:16:21.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:16:21.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:16:21.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:16:12, diff=9.106436s, valid=True
2026-05-29T23:16:21.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:16:21.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:16:21.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:16:21.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022023.107109s, valid=True
2026-05-29T23:16:21.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:16:21.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:16:21.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:16:21.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:16:21.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:16:21.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:16:21.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:16:21.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:16:21.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:16:21.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:16:21.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:16:21.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:16:21.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:16:21.423 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:16:21.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:16:21.984 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:16:22.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:16:22.084 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:16:22.084 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:16:22.283 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:16:22.284 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:16:52.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:16:52.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:16:52.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:16:52.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:16:52.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:16:52.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:16:52.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-05-29T23:16:52.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:16:52.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-05-29T23:16:52.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:16:52.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:16:52.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:16:52.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-05-29T23:16:55.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-05-29T23:16:55.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:16:55.540 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:16:55.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:16:55.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:16:55.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:16:55.560 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:16:55.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:16:55.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:16:55.560 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:16:55.560 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:16:55.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:16:55.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:16:55.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:16:55.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:16:55.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:16:55.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:16:55.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:16:55.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:16:55.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:16:55.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:16:55.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:16:55.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:16:55.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:16:45
2026-05-29T23:16:55.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73123, datetime.datetime(2026, 5, 29, 23, 16, 45), datetime.datetime(2026, 5, 29, 23, 16, 45), 'salt', 8.73, 75.48, None, 18.24, 34.72, 4.09, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:16:55.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:16:55.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:16:55.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:16:45, diff=10.891166s, valid=True
2026-05-29T23:16:55.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:16:55.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:16:55.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:17:12, diff=-16.106036s, valid=True
2026-05-29T23:16:55.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:16:55.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:16:55.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:16:44, diff=11.900611s, valid=True
2026-05-29T23:16:55.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:16:55.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:16:55.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:16:55.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:16:55.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:16:55.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:16:55.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:17:12, diff=-16.096396s, valid=True
2026-05-29T23:16:55.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:16:55.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:16:55.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:16:55.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022057.904297s, valid=True
2026-05-29T23:16:55.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:16:55.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:16:55.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:16:55.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:16:55.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:16:55.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:16:55.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:16:55.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:16:56.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:16:56.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:16:56.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:16:56.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:16:56.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:16:56.287 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:16:56.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:16:56.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:16:56.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:16:56.963 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:16:56.963 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:16:57.223 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:16:57.223 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:17:27.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:17:27.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:17:27.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:17:27.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:17:27.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:17:27.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:17:27.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T23:17:27.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:17:27.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-05-29T23:17:27.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:17:27.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:17:27.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:17:27.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-05-29T23:17:30.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-05-29T23:17:30.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:17:30.331 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:17:30.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:17:30.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:17:30.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:17:30.352 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:17:30.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:17:30.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:17:30.352 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:17:30.352 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:17:30.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:17:30.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:17:30.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:17:30.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:17:30.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:17:30.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:17:30.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:17:30.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:17:30.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:17:30.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:17:30.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:17:30.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:17:30.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:17:15
2026-05-29T23:17:30.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73124, datetime.datetime(2026, 5, 29, 23, 17, 15), datetime.datetime(2026, 5, 29, 23, 17, 15), 'salt', 8.7, 75.35, None, 16.27, 34.7, 4.11, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:17:30.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:17:30.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:17:30.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:17:15, diff=15.683835s, valid=True
2026-05-29T23:17:30.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:17:30.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:17:30.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:17:12, diff=18.686848s, valid=True
2026-05-29T23:17:30.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:17:30.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:17:30.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:17:14, diff=16.69368s, valid=True
2026-05-29T23:17:30.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:17:30.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:17:30.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:17:30.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:17:30.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:17:30.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:17:30.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:17:12, diff=18.696787s, valid=True
2026-05-29T23:17:30.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:17:30.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:17:30.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:17:30.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022092.697461s, valid=True
2026-05-29T23:17:30.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:17:30.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:17:30.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:17:30.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:17:30.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:17:30.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:17:30.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:17:30.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:17:30.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:17:30.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:17:30.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:17:30.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:17:30.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:17:31.025 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:17:31.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:17:31.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:17:31.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:17:31.744 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:17:31.745 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:17:34.895 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:17:34.895 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:18:04.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:18:04.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:18:04.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:18:05.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:18:05.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:18:05.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:18:05.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-05-29T23:18:05.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:18:05.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-05-29T23:18:05.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:18:05.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:18:05.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:18:05.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-05-29T23:18:12.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-05-29T23:18:12.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:18:12.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:18:12.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:18:12.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:18:12.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:18:12.436 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:18:12.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:18:12.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:18:12.436 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:18:12.436 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:18:12.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:18:12.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:18:12.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:18:12.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:18:12.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:18:12.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:18:12.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:18:12.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:18:12.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:18:12.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:18:12.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:18:12.699 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:18:12.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:17:46
2026-05-29T23:18:12.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73125, datetime.datetime(2026, 5, 29, 23, 17, 46), datetime.datetime(2026, 5, 29, 23, 17, 45), 'salt', 8.79, 75.35, None, 17.36, 34.96, 4.11, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:18:12.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:18:12.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:18:12.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:17:45, diff=27.768177s, valid=True
2026-05-29T23:18:12.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:18:12.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:18:12.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:18:12, diff=0.770918s, valid=True
2026-05-29T23:18:12.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:18:12.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:18:12.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:17:44, diff=28.77746s, valid=True
2026-05-29T23:18:12.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:18:12.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:18:12.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:18:12.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:18:12.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:18:12.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:18:12.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:18:12, diff=0.780416s, valid=True
2026-05-29T23:18:12.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:18:12.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:18:12.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:18:12.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022134.781068s, valid=True
2026-05-29T23:18:12.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:18:12.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:18:12.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:18:12.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:18:12.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:18:12.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:18:12.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:18:12.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:18:12.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:18:12.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:18:12.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:18:13.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:18:13.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:18:13.114 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:18:13.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:18:13.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:18:13.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:18:13.802 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:18:13.802 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:18:13.999 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:18:14.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:18:44.030 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:18:44.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:18:44.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:18:44.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:18:44.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:18:44.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:18:44.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T23:18:44.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:18:44.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-05-29T23:18:44.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:18:44.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:18:44.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:18:44.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-05-29T23:19:36.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-05-29T23:19:36.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:19:36.347 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:19:36.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:19:36.357 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:19:36.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:19:36.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:19:36.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:19:36.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:19:36.370 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:19:36.370 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:19:36.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:19:36.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:19:36.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:19:36.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:19:36.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:19:36.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:19:36.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:19:36.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:19:36.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:19:36.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:19:36.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:19:36.641 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:19:36.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:19:16
2026-05-29T23:19:36.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73128, datetime.datetime(2026, 5, 29, 23, 19, 16), datetime.datetime(2026, 5, 29, 23, 19, 16), 'salt', 8.53, 75.62, None, 17.11, 41.65, 4.05, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:19:36.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:19:36.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:19:36.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:19:16, diff=20.706987s, valid=True
2026-05-29T23:19:36.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:19:36.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:19:36.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:19:12, diff=24.709791s, valid=True
2026-05-29T23:19:36.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:19:36.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:19:36.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:19:15, diff=21.716544s, valid=True
2026-05-29T23:19:36.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:19:36.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:19:36.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:19:36.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:19:36.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:19:36.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:19:36.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:19:12, diff=24.719609s, valid=True
2026-05-29T23:19:36.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:19:36.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:19:36.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:19:36.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022218.720296s, valid=True
2026-05-29T23:19:36.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:19:36.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:19:36.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:19:36.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:19:36.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:19:36.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:19:36.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:19:36.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:19:36.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:19:36.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:19:36.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:19:36.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:19:36.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:19:37.036 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:19:37.249 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:19:37.655 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:19:37.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:19:37.755 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:19:37.755 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:19:37.906 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:19:37.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:20:07.936 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:20:07.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:20:07.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:20:08.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:20:08.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:20:08.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:20:08.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-05-29T23:20:08.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:20:08.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T23:20:08.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:20:08.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:20:08.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:20:08.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-05-29T23:20: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-05-29T23:20:40.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:20:40.059 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:20:40.059 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:20:40.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:20:40.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:20:40.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:20:40.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:20:40.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:20:40.082 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:20:40.082 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:20:40.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:20:40.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:20:40.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:20:40.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:20:40.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:20:40.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:20:40.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:20:40.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:20:40.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:20:40.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:20:40.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:20:40.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:20:40.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:20:17
2026-05-29T23:20:40.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73130, datetime.datetime(2026, 5, 29, 23, 20, 17), datetime.datetime(2026, 5, 29, 23, 20, 16), 'salt', 8.5, 75.92, None, 18.77, 42.4, 4.0, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:20:40.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:20:40.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:20:40.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:20:16, diff=24.420487s, valid=True
2026-05-29T23:20:40.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:20:40.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:20:40.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:20:12, diff=28.423348s, valid=True
2026-05-29T23:20:40.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:20:40.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:20:40.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:20:15, diff=25.430082s, valid=True
2026-05-29T23:20:40.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:20:40.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:20:40.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:20:40.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:20:40.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:20:40.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:20:40.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:20:12, diff=28.433106s, valid=True
2026-05-29T23:20:40.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:20:40.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:20:40.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:20:40.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022282.433774s, valid=True
2026-05-29T23:20:40.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:20:40.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:20:40.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:20:40.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:20:40.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:20:40.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:20:40.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:20:40.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:20:40.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:20:40.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:20:40.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:20:40.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:20:40.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:20:40.756 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:20:40.979 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:20:41.347 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:20:41.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:20:41.448 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:20:41.448 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:20:41.668 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:20:41.668 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:21:11.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:21:11.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:21:11.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:21:12.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:21:12.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:21:12.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:21:12.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-05-29T23:21:12.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:21:12.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-05-29T23:21:12.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:21:12.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:21:12.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:21:12.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-05-29T23:21: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-05-29T23:21:14.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:21:14.919 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:21:14.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:21:14.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:21:14.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:21:14.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:21:14.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:21:14.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:21:14.939 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:21:14.939 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:21:14.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:21:15.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:21:15.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:21:15.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:21:15.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:21:15.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:21:15.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:21:15.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:21:15.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:21:15.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:21:15.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:21:15.200 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:21:15.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:20:47
2026-05-29T23:21:15.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73131, datetime.datetime(2026, 5, 29, 23, 20, 47), datetime.datetime(2026, 5, 29, 23, 20, 47), 'salt', 8.66, 75.78, None, 16.66, 40.12, 4.02, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:21:15.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:21:15.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:21:15.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:20:47, diff=28.266922s, valid=True
2026-05-29T23:21:15.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:21:15.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:21:15.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:21:12, diff=3.269726s, valid=True
2026-05-29T23:21:15.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:21:15.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:21:15.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:20:46, diff=29.276482s, valid=True
2026-05-29T23:21:15.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:21:15.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:21:15.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:21:15.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:21:15.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:21:15.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:21:15.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:21:12, diff=3.279448s, valid=True
2026-05-29T23:21:15.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:21:15.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:21:15.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:21:15.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022317.280114s, valid=True
2026-05-29T23:21:15.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:21:15.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:21:15.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:21:15.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:21:15.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:21:15.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:21:15.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:21:15.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:21:15.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:21:15.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:21:15.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:21:15.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:21:15.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:21:15.596 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:21:15.882 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:21:16.226 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:21:16.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:21:16.326 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:21:16.326 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:21:16.580 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:21:16.581 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:21:46.611 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:21:46.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:21:46.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:21:47.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:21:47.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:21:47.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:21:47.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-05-29T23:21:47.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:21:47.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-05-29T23:21:47.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:21:47.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:21:47.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:21:47.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-05-29T23:21:50.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T23:21:50.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:21:50.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:21:50.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:21:50.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:21:50.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:21:50.569 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:21:50.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:21:50.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:21:50.569 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:21:50.569 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:21:50.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:21:50.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:21:50.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:21:50.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:21:50.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:21:50.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:21:50.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:21:50.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:21:50.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:21:50.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:21:50.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:21:50.849 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:21:50.911 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:21:47
2026-05-29T23:21:50.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73133, datetime.datetime(2026, 5, 29, 23, 21, 47), datetime.datetime(2026, 5, 29, 23, 21, 47), 'salt', 8.66, 75.68, None, 16.94, 38.72, 4.04, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:21:50.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:21:50.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:21:50.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:21:47, diff=3.917956s, valid=True
2026-05-29T23:21:50.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:21:50.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:21:50.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:22:12, diff=-21.079164s, valid=True
2026-05-29T23:21:50.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:21:50.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:21:50.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:21:46, diff=4.927551s, valid=True
2026-05-29T23:21:50.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:21:50.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:21:50.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:21:50.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:21:50.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:21:50.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:21:50.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:22:12, diff=-21.069376s, valid=True
2026-05-29T23:21:50.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:21:50.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:21:50.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:21:50.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022352.931311s, valid=True
2026-05-29T23:21:50.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:21:50.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:21:50.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:21:50.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:21:50.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:21:50.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:21:50.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:21:50.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:21:51.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:21:51.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:21:51.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:21:51.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:21:51.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:21:51.248 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:21:51.460 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:21:51.807 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:21:51.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:21:51.907 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:21:51.907 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:21:52.058 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:21:52.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:22:22.088 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:22:22.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:22:22.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:22:22.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:22:22.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:22:22.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:22:22.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-05-29T23:22:22.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:22:22.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-05-29T23:22:22.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:22:22.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:22:22.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:22:22.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-05-29T23:22:25.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-05-29T23:22:25.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:22:25.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:22:25.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:22:25.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:22:25.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:22:25.163 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:22:25.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:22:25.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:22:25.164 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:22:25.164 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:22:25.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:22:25.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:22:25.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:22:25.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:22:25.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:22:25.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:22:25.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:22:25.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:22:25.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:22:25.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:22:25.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:22:25.423 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:22:25.482 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:22:18
2026-05-29T23:22:25.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73134, datetime.datetime(2026, 5, 29, 23, 22, 18), datetime.datetime(2026, 5, 29, 23, 22, 17), 'salt', 8.7, 75.65, None, 17.57, 44.4, 4.06, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:22:25.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:22:25.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:22:25.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:22:17, diff=8.488742s, valid=True
2026-05-29T23:22:25.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:22:25.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:22:25.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:22:12, diff=13.491592s, valid=True
2026-05-29T23:22:25.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:22:25.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:22:25.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:22:16, diff=9.498233s, valid=True
2026-05-29T23:22:25.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:22:25.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:22:25.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:22:25.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:22:25.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:22:25.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:22:25.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:22:12, diff=13.501325s, valid=True
2026-05-29T23:22:25.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:22:25.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:22:25.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:22:25.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022387.502009s, valid=True
2026-05-29T23:22:25.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:22:25.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:22:25.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:22:25.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:22:25.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:22:25.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:22:25.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:22:25.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:22:25.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:22:25.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:22:25.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:22:25.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:22:25.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:22:25.821 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:22:26.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:22:26.475 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:22:26.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:22:26.577 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:22:26.577 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:22:26.769 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:22:26.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:22:56.799 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:22:56.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:22:56.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:22:57.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:22:57.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:22:57.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:22:57.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T23:22:57.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:22:57.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-05-29T23:22:57.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:22:57.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:22:57.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:22: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-05-29T23:23:00.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-05-29T23:23:00.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:23:00.051 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:23:00.051 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:23:00.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:23:00.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:23:00.072 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:23:00.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:23:00.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:23:00.073 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:23:00.073 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:23:00.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:23:00.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:23:00.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:23:00.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:23:00.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:23:00.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:23:00.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:23:00.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:23:00.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:23:00.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:23:00.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:23:00.330 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:23:00.397 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:22:48
2026-05-29T23:23:00.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73135, datetime.datetime(2026, 5, 29, 23, 22, 48), datetime.datetime(2026, 5, 29, 23, 22, 47), 'salt', 8.63, 75.52, None, 15.88, 32.68, 4.08, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:23:00.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:23:00.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:23:00.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:22:47, diff=13.403744s, valid=True
2026-05-29T23:23:00.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:23:00.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:23:00.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:23:12, diff=-11.59341s, valid=True
2026-05-29T23:23:00.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:23:00.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:23:00.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:22:47, diff=13.413408s, valid=True
2026-05-29T23:23:00.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:23:00.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:23:00.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:23:00.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:23:00.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:23:00.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:23:00.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:23:12, diff=-11.583564s, valid=True
2026-05-29T23:23:00.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:23:00.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:23:00.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:23:00.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022422.417112s, valid=True
2026-05-29T23:23:00.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:23:00.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:23:00.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:23:00.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:23:00.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:23:00.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:23:00.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:23:00.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:23:00.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:23:00.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:23:00.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:23:00.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:23:00.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:23:00.741 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:23:00.962 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:23:01.328 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:23:01.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:23:01.459 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:23:01.459 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:23:01.660 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:23:01.660 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:23:31.690 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:23:31.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:23:31.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:23:31.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:23:32.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:23:32.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:23:32.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-05-29T23:23:32.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:23:32.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-05-29T23:23:32.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:23:32.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:23:32.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:23: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-05-29T23:23:38.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T23:23:38.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:23:38.494 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:23:38.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:23:38.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:23:38.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:23:38.516 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:23:38.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:23:38.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:23:38.516 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:23:38.516 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:23:38.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:23:38.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:23:38.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:23:38.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:23:38.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:23:38.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:23:38.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:23:38.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:23:38.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:23:38.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:23:38.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:23:38.778 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:23:38.844 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:23:18
2026-05-29T23:23:38.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73136, datetime.datetime(2026, 5, 29, 23, 23, 18), datetime.datetime(2026, 5, 29, 23, 23, 18), 'salt', 8.66, 75.62, None, 16.94, 40.1, 4.05, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:23:38.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:23:38.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:23:38.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:23:18, diff=20.851173s, valid=True
2026-05-29T23:23:38.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:23:38.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:23:38.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:23:12, diff=26.854061s, valid=True
2026-05-29T23:23:38.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:23:38.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:23:38.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:23:17, diff=21.860809s, valid=True
2026-05-29T23:23:38.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:23:38.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:23:38.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:23:38.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:23:38.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:23:38.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:23:38.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:23:12, diff=26.863885s, valid=True
2026-05-29T23:23:38.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:23:38.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:23:38.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:23:38.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022460.864552s, valid=True
2026-05-29T23:23:38.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:23:38.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:23:38.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:23:38.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:23:38.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:23:38.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:23:38.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:23:38.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:23:38.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:23:38.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:23:39.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:23:39.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:23:39.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:23:39.261 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:23:39.485 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:23:39.849 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:23:39.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:23:39.966 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:23:39.966 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:23:40.168 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:23:40.168 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:24:10.194 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:24:10.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:24:10.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:24:10.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:24:10.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:24:10.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:24:10.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-05-29T23:24:10.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:24:10.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-05-29T23:24:10.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:24:10.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:24:10.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:24:10.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-05-29T23:25:06.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-05-29T23:25:06.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:25:06.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:25:06.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:25:06.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:25:06.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:25:06.971 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:25:06.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:25:06.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:25:06.972 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:25:06.972 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:25:06.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:25:07.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:25:07.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:25:07.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:25:07.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:25:07.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:25:07.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:25:07.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:25:07.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:25:07.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:25:07.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:25:07.238 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:25:07.297 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:24:49
2026-05-29T23:25:07.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73139, datetime.datetime(2026, 5, 29, 23, 24, 49), datetime.datetime(2026, 5, 29, 23, 24, 48), 'salt', 8.63, 75.62, None, 15.35, 42.75, 4.06, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:25:07.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:25:07.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:25:07.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:24:48, diff=19.3039s, valid=True
2026-05-29T23:25:07.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:25:07.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:25:07.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:25:12, diff=-4.693323s, valid=True
2026-05-29T23:25:07.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:25:07.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:25:07.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:24:48, diff=19.313355s, valid=True
2026-05-29T23:25:07.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:25:07.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:25:07.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:25:07.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:25:07.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:25:07.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:25:07.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:25:12, diff=-4.683652s, valid=True
2026-05-29T23:25:07.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:25:07.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:25:07.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:25:07.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022549.31702s, valid=True
2026-05-29T23:25:07.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:25:07.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:25:07.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:25:07.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:25:07.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:25:07.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:25:07.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:25:07.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:25:07.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:25:07.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:25:07.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:25:07.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:25:07.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:25:07.652 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:25:07.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:25:08.234 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:25:08.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:25:08.335 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:25:08.335 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:25:08.523 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:25:08.523 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:25:38.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:25:38.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:25:38.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:25:38.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:25:38.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:25:39.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:25:39.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T23:25:39.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:25:39.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-05-29T23:25:39.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:25:39.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:25:39.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:25:39.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-05-29T23:26: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-05-29T23:26:03.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:26:03.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:26:03.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:26:03.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:26:03.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:26:03.792 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:26:03.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:26:03.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:26:03.793 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:26:03.793 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:26:03.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:26:03.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:26:03.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:26:03.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:26:03.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:26:04.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:26:04.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:26:04.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:26:04.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:26:04.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:26:04.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:26:04.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:26:04.109 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:25:49
2026-05-29T23:26:04.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73141, datetime.datetime(2026, 5, 29, 23, 25, 49), datetime.datetime(2026, 5, 29, 23, 25, 49), 'salt', 8.56, 75.68, None, 20.11, 38.69, 4.04, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:26:04.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:26:04.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:26:04.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:25:49, diff=15.11613s, valid=True
2026-05-29T23:26:04.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:26:04.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:26:04.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:26:12, diff=-7.881055s, valid=True
2026-05-29T23:26:04.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:26:04.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:26:04.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:25:48, diff=16.125535s, valid=True
2026-05-29T23:26:04.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:26:04.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:26:04.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:26:04.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:26:04.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:26:04.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:26:04.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:26:12, diff=-7.871472s, valid=True
2026-05-29T23:26:04.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:26:04.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:26:04.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:26:04.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022606.129194s, valid=True
2026-05-29T23:26:04.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:26:04.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:26:04.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:26:04.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:26:04.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:26:04.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:26:04.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:26:04.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:26:04.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:26:04.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:26:04.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:26:04.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:26:04.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:26:04.514 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:26:04.728 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:26:05.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:26:05.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:26:05.179 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:26:05.179 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:26:05.266 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:26:05.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:26:35.297 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:26:35.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:26:35.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:26:35.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:26:35.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:26:35.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:26:35.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-05-29T23:26:35.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:26:35.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-05-29T23:26:35.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:26:35.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:26:35.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:26:35.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-05-29T23:26:38.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-05-29T23:26:38.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:26:38.953 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:26:38.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:26:38.961 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:26:38.972 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:26:38.973 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:26:38.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:26:38.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:26:38.973 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:26:38.973 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:26:38.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:26:39.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:26:39.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:26:39.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:26:39.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:26:39.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:26:39.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:26:39.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:26:39.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:26:39.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:26:39.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:26:39.229 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:26:39.288 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:26:19
2026-05-29T23:26:39.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73142, datetime.datetime(2026, 5, 29, 23, 26, 19), datetime.datetime(2026, 5, 29, 23, 26, 19), 'salt', 8.6, 75.85, None, 18.7, 27.35, 4.01, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:26:39.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:26:39.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:26:39.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:26:19, diff=20.295833s, valid=True
2026-05-29T23:26:39.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:26:39.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:26:39.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:26:12, diff=27.299356s, valid=True
2026-05-29T23:26:39.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:26:39.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:26:39.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:26:18, diff=21.306735s, valid=True
2026-05-29T23:26:39.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:26:39.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:26:39.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:26:39.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:26:39.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:26:39.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:26:39.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:26:12, diff=27.309772s, valid=True
2026-05-29T23:26:39.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:26:39.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:26:39.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:26:39.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022641.310433s, valid=True
2026-05-29T23:26:39.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:26:39.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:26:39.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:26:39.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:26:39.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:26:39.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:26:39.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:26:39.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:26:39.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:26:39.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:26:39.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:26:39.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:26:39.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:26:39.632 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:26:39.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:26:40.221 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:26:40.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:26:40.324 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:26:40.324 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:26:40.589 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:26:40.589 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:27:10.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:27:10.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:27:10.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:27:11.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:27:11.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:27:11.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:27:11.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-05-29T23:27:11.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:27:11.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-05-29T23:27:11.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:27:11.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:27:11.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:27:11.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-05-29T23:27:17.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-05-29T23:27:17.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:27:17.960 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:27:17.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:27:17.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:27:17.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:27:17.981 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:27:17.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:27:17.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:27:17.982 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:27:17.982 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:27:17.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:27:18.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:27:18.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:27:18.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:27:18.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:27:18.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:27:18.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:27:18.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:27:18.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:27:18.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:27:18.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:27:18.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:27:18.296 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:26:50
2026-05-29T23:27:18.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73143, datetime.datetime(2026, 5, 29, 23, 26, 50), datetime.datetime(2026, 5, 29, 23, 26, 49), 'salt', 8.53, 75.68, None, 18.35, 27.52, 4.04, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:27:18.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:27:18.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:27:18.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:26:49, diff=29.30222s, valid=True
2026-05-29T23:27:18.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:27:18.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:27:18.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:27:12, diff=6.304999s, valid=True
2026-05-29T23:27:18.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:27:18.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:27:18.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:26:49, diff=29.311504s, valid=True
2026-05-29T23:27:18.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:27:18.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:27:18.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:27:18.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:27:18.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:27:18.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:27:18.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:27:12, diff=6.314502s, valid=True
2026-05-29T23:27:18.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:27:18.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:27:18.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:27:18.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022680.315158s, valid=True
2026-05-29T23:27:18.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:27:18.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:27:18.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:27:18.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:27:18.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:27:18.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:27:18.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:27:18.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:27:18.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:27:18.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:27:18.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:27:18.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:27:18.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:27:18.633 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:27:18.868 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:27:19.217 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:27:19.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:27:19.318 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:27:19.318 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:27:19.548 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:27:19.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:27:49.579 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:27:49.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:27:49.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:27:50.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:27:50.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:27:50.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:27:50.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-05-29T23:27:50.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:27:50.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-05-29T23:27:50.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:27:50.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:27:50.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:27:50.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T23:27:53.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-05-29T23:27:53.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:27:53.053 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:27:53.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:27:53.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:27:53.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:27:53.074 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:27:53.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:27:53.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:27:53.075 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:27:53.075 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:27:53.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:27:53.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:27:53.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:27:53.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:27:53.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:27:53.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:27:53.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:27:53.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:27:53.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:27:53.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:27:53.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:27:53.338 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:27:53.397 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:27:50
2026-05-29T23:27:53.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73145, datetime.datetime(2026, 5, 29, 23, 27, 50), datetime.datetime(2026, 5, 29, 23, 27, 50), 'salt', 8.6, 75.75, None, 18.95, 31.34, 4.03, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:27:53.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:27:53.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:27:53.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:27:50, diff=3.403324s, valid=True
2026-05-29T23:27:53.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:27:53.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:27:53.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:28:12, diff=-18.593831s, valid=True
2026-05-29T23:27:53.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:27:53.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:27:53.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:27:49, diff=4.412835s, valid=True
2026-05-29T23:27:53.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:27:53.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:27:53.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:27:53.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:27:53.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:27:53.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:27:53.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:28:12, diff=-18.58404s, valid=True
2026-05-29T23:27:53.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:27:53.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:27:53.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:27:53.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022715.41664s, valid=True
2026-05-29T23:27:53.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:27:53.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:27:53.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:27:53.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:27:53.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:27:53.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:27:53.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:27:53.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:27:53.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:27:53.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:27:53.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:27:53.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:27:53.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:27:53.752 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:27:53.973 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:27:54.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:27:54.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:27:54.498 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:27:54.498 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:27:54.690 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:27:54.690 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:28:24.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:28:24.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:28:24.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:28:25.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:28:25.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:28:25.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:28:25.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-05-29T23:28:25.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:28:25.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-05-29T23:28:25.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:28:25.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:28:25.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:28:25.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-05-29T23:28:27.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-05-29T23:28:27.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:28:27.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:28:27.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:28:27.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:28:27.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:28:27.966 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:28:27.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:28:27.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:28:27.966 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:28:27.966 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:28:27.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:28:28.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:28:28.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:28:28.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:28:28.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:28:28.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:28:28.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:28:28.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:28:28.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:28:28.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:28:28.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:28:28.215 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:28:28.274 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:28:20
2026-05-29T23:28:28.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73146, datetime.datetime(2026, 5, 29, 23, 28, 20), datetime.datetime(2026, 5, 29, 23, 28, 20), 'salt', 8.66, 75.78, None, 16.09, 33.69, 4.02, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:28:28.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:28:28.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:28:28.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:28:20, diff=8.281201s, valid=True
2026-05-29T23:28:28.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:28:28.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:28:28.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:28:12, diff=16.284058s, valid=True
2026-05-29T23:28:28.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:28:28.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:28:28.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:28:19, diff=9.290757s, valid=True
2026-05-29T23:28:28.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:28:28.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:28:28.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:28:28.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:28:28.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:28:28.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:28:28.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:28:12, diff=16.293787s, valid=True
2026-05-29T23:28:28.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:28:28.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:28:28.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:28:28.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022750.294454s, valid=True
2026-05-29T23:28:28.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:28:28.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:28:28.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:28:28.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:28:28.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:28:28.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:28:28.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:28:28.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:28:28.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:28:28.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:28:28.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:28:28.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:28:28.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:28:28.615 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:28:28.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:28:29.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:28:29.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:28:29.283 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:28:29.283 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:28:29.573 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:28:29.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:28:59.604 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:28:59.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:28:59.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:29:00.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:29:00.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:29:00.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:29:00.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-05-29T23:29:00.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:29:00.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-05-29T23:29:00.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:29:00.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:29:00.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:29:00.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-05-29T23:29:03.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-05-29T23:29:03.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:29:03.298 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:29:03.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:29:03.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:29:03.318 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:29:03.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:29:03.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:29:03.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:29:03.319 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:29:03.319 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:29:03.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:29:03.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:29:03.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:29:03.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:29:03.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:29:03.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:29:03.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:29:03.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:29:03.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:29:03.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:29:03.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:29:03.570 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:29:03.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:28:50
2026-05-29T23:29:03.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73147, datetime.datetime(2026, 5, 29, 23, 28, 50), datetime.datetime(2026, 5, 29, 23, 28, 50), 'salt', 8.53, 75.75, None, 18.03, 27.0, 4.03, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:29:03.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:29:03.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:29:03.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:28:50, diff=13.635861s, valid=True
2026-05-29T23:29:03.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:29:03.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:29:03.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:29:12, diff=-8.361384s, valid=True
2026-05-29T23:29:03.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:29:03.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:29:03.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:28:49, diff=14.645272s, valid=True
2026-05-29T23:29:03.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:29:03.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:29:03.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:29:03.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:29:03.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:29:03.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:29:03.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:29:12, diff=-8.351764s, valid=True
2026-05-29T23:29:03.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:29:03.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:29:03.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:29:03.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022785.648895s, valid=True
2026-05-29T23:29:03.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:29:03.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:29:03.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:29:03.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:29:03.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:29:03.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:29:03.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:29:03.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:29:03.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:29:03.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:29:03.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:29:03.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:29:03.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:29:03.966 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:29:04.254 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:29:04.600 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:29:04.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:29:04.700 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:29:04.700 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:29:04.986 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:29:04.986 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:29:35.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:29:35.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:29:35.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:29:35.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:29:35.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:29:35.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:29:35.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-05-29T23:29:35.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:29:35.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-05-29T23:29:35.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:29:35.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:29:35.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:29:35.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-05-29T23:30:01.407 [ERROR] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] processing LCO all-sky image: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
2026-05-29T23:30:01.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:30:01.408 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:30:01.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:30:01.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:30:01.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:30:01.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:30:01.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:30:01.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:30:01.430 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:30:01.431 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:30:01.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:30:01.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:30:01.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:30:01.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:30:01.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:30:01.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:30:01.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:30:01.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:30:01.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:30:01.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:30:01.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:30:01.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:30:01.787 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:29:51
2026-05-29T23:30:01.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73149, datetime.datetime(2026, 5, 29, 23, 29, 51), datetime.datetime(2026, 5, 29, 23, 29, 50), 'salt', 8.56, 75.85, None, 17.5, 31.37, 4.01, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:30:01.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:30:01.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:30:01.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:29:50, diff=11.800711s, valid=True
2026-05-29T23:30:01.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:30:01.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:30:01.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:30:12, diff=-10.193408s, valid=True
2026-05-29T23:30:01.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:30:01.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:30:01.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:29:50, diff=11.820307s, valid=True
2026-05-29T23:30:01.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:30:01.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:30:01.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:30:01.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:30:01.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:30:01.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:30:01.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:30:12, diff=-10.17374s, valid=True
2026-05-29T23:30:01.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:30:01.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:30:01.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:30:01.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022843.827522s, valid=True
2026-05-29T23:30:01.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:30:01.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:30:01.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:30:01.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:30:01.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:30:01.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:30:01.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:30:01.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:30:01.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:30:01.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:30:02.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:30:02.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:30:02.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:30:02.156 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:30:02.372 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:30:02.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:30:02.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:30:02.800 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:30:02.800 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:30:02.984 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:30:02.984 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:30:33.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:30:33.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:30:33.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:30:33.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:30:33.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:30:33.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:30:33.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-05-29T23:30:33.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:30:33.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-05-29T23:30:33.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:30:33.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:30:33.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:30:33.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-05-29T23:30:36.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-05-29T23:30:36.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:30:36.120 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:30:36.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:30:36.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:30:36.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:30:36.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:30:36.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:30:36.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:30:36.141 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:30:36.141 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:30:36.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:30:36.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:30:36.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:30:36.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:30:36.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:30:36.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:30:36.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:30:36.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T23:30:36.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:30:36.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:30:36.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:30:36.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:30:36.466 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:30:21
2026-05-29T23:30:36.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73150, datetime.datetime(2026, 5, 29, 23, 30, 21), datetime.datetime(2026, 5, 29, 23, 30, 21), 'salt', 8.5, 75.85, None, 17.54, 29.28, 4.01, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:30:36.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:30:36.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:30:36.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:30:21, diff=15.472656s, valid=True
2026-05-29T23:30:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:30:36.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:30:36.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:30:12, diff=24.475438s, valid=True
2026-05-29T23:30:36.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:30:36.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:30:36.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:30:20, diff=16.482095s, valid=True
2026-05-29T23:30:36.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:30:36.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:30:36.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:30:36.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:30:36.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:30:36.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T23:30:36.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:30:12, diff=24.48509s, valid=True
2026-05-29T23:30:36.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:30:36.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:30:36.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:30:36.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022878.485773s, valid=True
2026-05-29T23:30:36.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:30:36.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:30:36.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:30:36.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:30:36.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:30:36.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:30:36.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:30:36.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:30:36.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:30:36.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:30:36.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:30:36.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:30:36.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:30:36.872 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:30:37.086 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:30:37.434 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:30:37.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:30: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-05-29T23:30: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-05-29T23:30:37.802 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:30:37.802 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:31:07.832 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:31:07.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:31:07.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:31:08.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:31:08.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:31:08.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:31:08.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-05-29T23:31:08.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:31:08.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-05-29T23:31:08.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:31:08.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:31:08.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:31:08.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-05-29T23:31:12.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-05-29T23:31:12.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:31:12.226 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:31:12.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:31:12.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:31:12.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:31:12.246 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:31:12.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:31:12.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:31:12.247 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:31:12.247 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:31:12.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:31:12.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:31:12.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:31:12.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:31:12.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:31:12.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T23:31:12.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:31:12.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T23:31:12.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:31:12.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:31:12.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:31:12.516 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:31:12.581 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:30:51
2026-05-29T23:31:12.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73151, datetime.datetime(2026, 5, 29, 23, 30, 51), datetime.datetime(2026, 5, 29, 23, 30, 51), 'salt', 8.46, 75.98, None, 19.23, 31.06, 3.98, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:31:12.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:31:12.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:31:12.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:30:51, diff=21.587791s, valid=True
2026-05-29T23:31:12.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:31:12.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T23:31:12.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:31:12, diff=0.590556s, valid=True
2026-05-29T23:31:12.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:31:12.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:31:12.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:30:50, diff=22.597264s, valid=True
2026-05-29T23:31:12.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:31:12.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:31:12.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:31:12.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:31:12.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:31:12.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T23:31:12.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:31:12, diff=0.600246s, valid=True
2026-05-29T23:31:12.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:31:12.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:31:12.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:31:12.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022914.600918s, valid=True
2026-05-29T23:31:12.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:31:12.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:31:12.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:31:12.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:31:12.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:31:12.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:31:12.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:31:12.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:31:12.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:31:12.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:31:12.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:31:12.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:31:12.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:31:12.917 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:31:13.131 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:31:13.477 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:31:13.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:31:13.577 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:31:13.577 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:31:13.839 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:31:13.839 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:31:43.869 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:31:43.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:31:43.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:31:44.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:31:44.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:31:44.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:31:44.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-05-29T23:31:44.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:31:44.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-05-29T23:31:44.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:31:44.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:31:44.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:31:44.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-05-29T23:31:49.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-05-29T23:31:49.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:31:49.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:31:49.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:31:49.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:31:49.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:31:49.442 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:31:49.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:31:49.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:31:49.442 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:31:49.443 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:31:49.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:31:49.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:31:49.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:31:49.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:31:49.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:31:49.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T23:31:49.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:31:49.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T23:31:49.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:31:49.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:31:49.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:31:49.708 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:31:49.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:31:21
2026-05-29T23:31:49.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73152, datetime.datetime(2026, 5, 29, 23, 31, 21), datetime.datetime(2026, 5, 29, 23, 31, 21), 'salt', 8.5, 76.12, None, 17.33, 37.99, 3.96, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:31:49.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:31:49.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:31:49.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:31:21, diff=28.776248s, valid=True
2026-05-29T23:31:49.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:31:49.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T23:31:49.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:31:12, diff=37.77913s, valid=True
2026-05-29T23:31:49.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:31:49.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:31:49.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:31:21, diff=28.7858s, valid=True
2026-05-29T23:31:49.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:31:49.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:31:49.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:31:49.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:31:49.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:31:49.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T23:31:49.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:31:12, diff=37.788754s, valid=True
2026-05-29T23:31:49.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:31:49.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:31:49.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:31:49.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022951.789403s, valid=True
2026-05-29T23:31:49.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:31:49.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:31:49.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:31:49.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:31:49.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:31:49.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:31:49.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:31:49.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:31:49.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:31:49.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:31:49.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:31:50.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:31:50.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:31:50.207 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:31:50.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:31:50.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:31:50.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:31:50.890 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:31:50.891 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:31:51.135 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:31:51.135 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:32:21.165 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:32:21.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:32:21.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:32:21.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:32:21.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:32:21.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:32:21.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-05-29T23:32:21.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:32:21.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-05-29T23:32:21.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:32:21.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:32:21.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:32:21.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-05-29T23:32:29.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-05-29T23:32:29.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:32:29.164 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:32:29.164 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:32:29.173 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:32:29.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:32:29.185 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:32:29.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:32:29.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:32:29.186 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:32:29.186 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:32:29.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:32:29.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:32:29.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:32:29.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:32:29.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:32:29.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T23:32:29.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:32:29.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T23:32:29.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:32:29.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:32:29.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:32:29.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:32:29.511 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:32:22
2026-05-29T23:32:29.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73154, datetime.datetime(2026, 5, 29, 23, 32, 22), datetime.datetime(2026, 5, 29, 23, 32, 22), 'salt', 8.46, 76.28, None, 16.2, 34.23, 3.92, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:32:29.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:32:29.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:32:29.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:32:22, diff=7.517179s, valid=True
2026-05-29T23:32:29.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:32:29.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T23:32:29.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:32:12, diff=17.520845s, valid=True
2026-05-29T23:32:29.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:32:29.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:32:29.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:32:21, diff=8.528081s, valid=True
2026-05-29T23:32:29.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:32:29.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:32:29.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:32:29.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:32:29.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:32:29.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T23:32:29.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:32:12, diff=17.531134s, valid=True
2026-05-29T23:32:29.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:32:29.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:32:29.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:32:29.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1022991.531807s, valid=True
2026-05-29T23:32:29.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:32:29.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:32:29.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:32:29.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:32:29.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:32:29.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:32:29.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:32:29.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:32:29.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:32:29.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:32:29.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:32:29.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:32:29.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:32:29.855 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:32:30.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:32:30.437 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:32:30.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:32:30.538 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:32:30.538 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:32:33.133 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:32:33.133 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:33:03.134 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:33:03.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:33:03.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:33:03.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:33:03.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:33:03.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:33:03.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-05-29T23:33:03.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:33:03.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-05-29T23:33:03.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:33:03.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:33:03.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:33:03.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-05-29T23:33:06.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-05-29T23:33:06.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:33:06.350 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:33:06.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:33:06.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:33:06.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:33:06.370 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:33:06.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:33:06.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:33:06.371 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:33:06.371 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:33:06.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:33:06.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:33:06.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:33:06.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:33:06.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:33:06.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:33:06.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:33:06.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:33:06.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:33:06.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:33:06.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:33:06.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:33:06.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:32:52
2026-05-29T23:33:06.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73155, datetime.datetime(2026, 5, 29, 23, 32, 52), datetime.datetime(2026, 5, 29, 23, 32, 52), 'salt', 8.5, 76.35, None, 18.56, 35.76, 3.92, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:33:06.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:33:06.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:33:06.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:32:52, diff=14.683349s, valid=True
2026-05-29T23:33:06.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:33:06.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:33:06.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:33:12, diff=-5.313837s, valid=True
2026-05-29T23:33:06.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:33:06.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:33:06.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:32:51, diff=15.692847s, valid=True
2026-05-29T23:33:06.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:33:06.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:33:06.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:33:06.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:33:06.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:33:06.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:33:06.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:33:12, diff=-5.304111s, valid=True
2026-05-29T23:33:06.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:33:06.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:33:06.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:33:06.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023028.696564s, valid=True
2026-05-29T23:33:06.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:33:06.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:33:06.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:33:06.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:33:06.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:33:06.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:33:06.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:33:06.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:33:06.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:33:06.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:33:06.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:33:06.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:33:07.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:33:07.078 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:33:07.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:33:07.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:33:07.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:33:07.738 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:33:07.738 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:33:07.925 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:33:07.925 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:33:37.955 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:33:37.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:33:37.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:33:38.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:33:38.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:33:38.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:33:38.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-05-29T23:33:38.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:33:38.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-05-29T23:33:38.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:33:38.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:33:38.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:33:38.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-05-29T23:33:41.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-05-29T23:33:41.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:33:41.793 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:33:41.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:33:41.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:33:41.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:33:41.815 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:33:41.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:33:41.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:33:41.815 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:33:41.815 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:33:41.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:33:41.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:33:41.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:33:41.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:33:41.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:33:42.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:33:42.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:33:42.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:33:42.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:33:42.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:33:42.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:33:42.072 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:33:42.130 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:33:22
2026-05-29T23:33:42.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73156, datetime.datetime(2026, 5, 29, 23, 33, 22), datetime.datetime(2026, 5, 29, 23, 33, 22), 'salt', 8.56, 76.31, None, 17.43, 37.07, 3.92, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:33:42.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:33:42.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:33:42.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:33:22, diff=20.13705s, valid=True
2026-05-29T23:33:42.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:33:42.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:33:42.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:33:12, diff=30.139871s, valid=True
2026-05-29T23:33:42.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:33:42.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:33:42.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:33:21, diff=21.146586s, valid=True
2026-05-29T23:33:42.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:33:42.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:33:42.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:33:42.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:33:42.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:33:42.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:33:42.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:33:12, diff=30.149598s, valid=True
2026-05-29T23:33:42.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:33:42.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:33:42.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:33:42.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023064.150268s, valid=True
2026-05-29T23:33:42.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:33:42.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:33:42.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:33:42.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:33:42.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:33:42.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:33:42.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:33:42.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:33:42.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:33:42.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:33:42.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:33:42.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:33:42.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:33:42.467 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:33:42.696 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:33:43.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:33:43.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:33:43.140 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:33:43.140 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:33:43.325 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:33:43.325 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:34:13.355 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:34:13.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:34:13.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:34:13.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:34:13.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:34:13.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:34:13.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-05-29T23:34:13.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:34:13.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-05-29T23:34:13.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:34:13.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:34:13.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:34:13.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-05-29T23:35:07.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-05-29T23:35:07.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:35:07.813 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:35:07.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:35:07.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:35:07.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:35:07.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:35:07.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:35:07.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:35:07.834 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:35:07.834 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:35:07.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:35:07.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:35:07.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:35:08.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:35:08.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:35:08.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:35:08.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:35:08.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:35:08.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:35:08.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:35:08.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:35:08.120 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:35:08.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:34:53
2026-05-29T23:35:08.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73159, datetime.datetime(2026, 5, 29, 23, 34, 53), datetime.datetime(2026, 5, 29, 23, 34, 52), 'salt', 8.53, 76.25, None, 17.4, 36.81, 3.93, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:35:08.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:35:08.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:35:08.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:34:52, diff=16.189001s, valid=True
2026-05-29T23:35:08.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:35:08.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:35:08.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:35:12, diff=-3.808071s, valid=True
2026-05-29T23:35:08.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:35:08.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:35:08.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:34:52, diff=16.198735s, valid=True
2026-05-29T23:35:08.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:35:08.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:35:08.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:35:08.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:35:08.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:35:08.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:35:08.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:35:12, diff=-3.798169s, valid=True
2026-05-29T23:35:08.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:35:08.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:35:08.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:35:08.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023150.202495s, valid=True
2026-05-29T23:35:08.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:35:08.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:35:08.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:35:08.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:35:08.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:35:08.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:35:08.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:35:08.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:35:08.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:35:08.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:35:08.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:35:08.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:35:08.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:35:08.588 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:35:08.804 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:35:09.161 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:35:09.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:35:09.260 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:35:09.261 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:35:09.446 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:35:09.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:35:39.476 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:35:39.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:35:39.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:35:39.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:35:39.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:35:40.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:35:40.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-05-29T23:35:40.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:35:40.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-05-29T23:35:40.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:35:40.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:35:40.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:35:40.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-05-29T23:35:42.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-05-29T23:35:42.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:35:42.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:35:42.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:35:42.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:35:42.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:35:42.732 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:35:42.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:35:42.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:35:42.732 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:35:42.732 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:35:42.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:35:42.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:35:42.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:35:42.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:35:42.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:35:42.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:35:42.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:35:42.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:35:42.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:35:42.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:35:42.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:35:42.990 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:35:43.049 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:35:23
2026-05-29T23:35:43.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73160, datetime.datetime(2026, 5, 29, 23, 35, 23), datetime.datetime(2026, 5, 29, 23, 35, 23), 'salt', 8.43, 76.21, None, 18.31, 32.42, 3.94, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:35:43.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:35:43.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:35:43.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:35:23, diff=20.055999s, valid=True
2026-05-29T23:35:43.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:35:43.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:35:43.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:35:12, diff=31.058837s, valid=True
2026-05-29T23:35:43.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:35:43.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:35:43.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:35:23, diff=20.065573s, valid=True
2026-05-29T23:35:43.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:35:43.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:35:43.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:35:43.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:35:43.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:35:43.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:35:43.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:35:12, diff=31.068546s, valid=True
2026-05-29T23:35:43.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:35:43.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:35:43.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:35:43.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023185.069223s, valid=True
2026-05-29T23:35:43.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:35:43.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:35:43.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:35:43.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:35:43.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:35:43.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:35:43.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:35:43.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:35:43.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:35:43.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:35:43.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:35:43.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:35:43.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:35:43.389 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:35:43.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:35:43.953 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:35:44.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:35:44.056 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:35:44.056 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:35:44.231 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:35:44.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:36:14.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:36:14.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:36:14.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:36:14.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:36:14.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:36:14.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:36:14.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T23:36:14.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:36:14.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-05-29T23:36:14.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:36:14.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:36:14.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:36:14.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-05-29T23:36:17.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-05-29T23:36:17.618 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:36:17.618 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:36:17.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:36:17.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:36:17.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:36:17.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:36:17.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:36:17.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:36:17.640 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:36:17.640 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:36:17.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:36:17.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:36:17.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:36:17.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:36:17.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:36:17.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:36:17.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:36:17.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:36:17.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:36:17.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:36:17.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:36:17.887 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:36:17.947 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:35:53
2026-05-29T23:36:17.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73161, datetime.datetime(2026, 5, 29, 23, 35, 53), datetime.datetime(2026, 5, 29, 23, 35, 53), 'salt', 8.46, 76.38, None, 18.03, 28.18, 3.9, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:36:17.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:36:17.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:36:17.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:35:53, diff=24.953137s, valid=True
2026-05-29T23:36:17.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:36:17.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:36:17.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:36:12, diff=5.955911s, valid=True
2026-05-29T23:36:17.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:36:17.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:36:17.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:35:53, diff=24.96243s, valid=True
2026-05-29T23:36:17.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:36:17.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:36:17.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:36:17.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:36:17.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:36:17.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:36:17.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:36:12, diff=5.965395s, valid=True
2026-05-29T23:36:17.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:36:17.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:36:17.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:36:17.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023219.966053s, valid=True
2026-05-29T23:36:17.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:36:17.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:36:17.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:36:17.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:36:17.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:36:18.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:36:18.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:36:18.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:36:18.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:36:18.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:36:18.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:36:18.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:36:18.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:36:18.282 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:36:18.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:36:18.845 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:36:18.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:36:18.945 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:36:18.945 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:36:19.190 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:36:19.190 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:36:49.220 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:36:49.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:36:49.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:36:49.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:36:49.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:36:49.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:36:49.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-05-29T23:36:49.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:36: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-05-29T23:36:49.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:36:49.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:36:49.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:36:49.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-05-29T23:37:44.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-05-29T23:37:44.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:37:44.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:37:44.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:37:44.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:37:44.150 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:37:44.150 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:37:44.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:37:44.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:37:44.151 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:37:44.151 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:37:44.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:37:44.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:37:44.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:37:44.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:37:44.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:37:44.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:37:44.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:37:44.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:37:44.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:37:44.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:37:44.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:37:44.418 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:37:44.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:37:24
2026-05-29T23:37:44.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73164, datetime.datetime(2026, 5, 29, 23, 37, 24), datetime.datetime(2026, 5, 29, 23, 37, 24), 'salt', 8.43, 76.18, None, 16.94, 28.32, 3.94, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:37:44.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:37:44.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:37:44.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:37:24, diff=20.490545s, valid=True
2026-05-29T23:37:44.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:37:44.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:37:44.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:37:12, diff=32.493404s, valid=True
2026-05-29T23:37:44.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:37:44.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:37:44.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:37:23, diff=21.500096s, valid=True
2026-05-29T23:37:44.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:37:44.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:37:44.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:37:44.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:37:44.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:37:44.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:37:44.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:37:12, diff=32.503099s, valid=True
2026-05-29T23:37:44.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:37:44.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:37:44.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:37:44.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023306.503763s, valid=True
2026-05-29T23:37:44.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:37:44.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:37:44.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:37:44.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:37:44.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:37:44.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:37:44.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:37:44.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:37:44.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:37:44.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:37:44.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:37:44.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:37:44.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:37:44.827 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:37:45.059 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:37:45.475 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:37:45.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:37:45.575 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:37:45.575 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:37:45.768 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:37:45.768 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:38:15.774 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:38:15.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:38:15.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:38:16.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:38:16.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:38:16.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:38: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-05-29T23:38:16.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:38:16.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-05-29T23:38:16.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:38:16.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:38:16.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:38:16.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-05-29T23:38:19.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-05-29T23:38:19.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:38:19.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:38:19.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:38:19.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:38:19.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:38:19.368 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:38:19.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:38:19.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:38:19.369 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:38:19.369 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:38:19.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:38:19.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:38:19.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:38:19.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:38:19.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:38:19.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:38:19.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:38:19.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:38:19.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:38:19.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:38:19.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:38:19.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:38:19.699 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:37:54
2026-05-29T23:38:19.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73165, datetime.datetime(2026, 5, 29, 23, 37, 54), datetime.datetime(2026, 5, 29, 23, 37, 54), 'salt', 8.46, 76.25, None, 17.33, 45.26, 3.93, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:38:19.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:38:19.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:38:19.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:37:54, diff=25.705763s, valid=True
2026-05-29T23:38:19.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:38:19.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:38:19.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:38:12, diff=7.708593s, valid=True
2026-05-29T23:38:19.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:38:19.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:38:19.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:37:54, diff=25.715517s, valid=True
2026-05-29T23:38:19.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:38:19.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:38:19.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:38:19.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:38:19.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:38:19.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:38:19.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:38:12, diff=7.718527s, valid=True
2026-05-29T23:38:19.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:38:19.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:38:19.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:38:19.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023341.719196s, valid=True
2026-05-29T23:38:19.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:38:19.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:38:19.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:38:19.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:38:19.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:38:19.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:38:19.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:38:19.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:38:19.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:38:19.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:38:19.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:38:19.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:38:20.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:38:20.080 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:38:20.294 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:38:20.648 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:38:20.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:38:20.750 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:38:20.750 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:38:20.947 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:38:20.947 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:38:50.952 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:38:50.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:38:50.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:38:51.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:38:51.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:38:51.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:38:51.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T23:38:51.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:38:51.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-05-29T23:38:51.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:38:51.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:38:51.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:38:51.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-05-29T23:38:54.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-05-29T23:38:54.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:38:54.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:38:54.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:38:55.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:38:55.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:38:55.016 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:38:55.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:38:55.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:38:55.016 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:38:55.016 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:38:55.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:38:55.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:38:55.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:38:55.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:38:55.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:38:55.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:38:55.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:38:55.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:38:55.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:38:55.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:38:55.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:38:55.278 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:38:55.339 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:38:55
2026-05-29T23:38:55.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73167, datetime.datetime(2026, 5, 29, 23, 38, 55), datetime.datetime(2026, 5, 29, 23, 38, 54), 'salt', 8.53, 76.31, None, 20.04, 24.82, 3.92, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:38:55.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:38:55.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:38:55.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:38:54, diff=1.345666s, valid=True
2026-05-29T23:38:55.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:38:55.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:38:55.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:39:12, diff=-16.651548s, valid=True
2026-05-29T23:38:55.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:38:55.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:38:55.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:38:54, diff=1.355007s, valid=True
2026-05-29T23:38:55.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:38:55.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:38:55.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:38:55.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:38:55.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:38:55.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:38:55.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:39:12, diff=-16.641961s, valid=True
2026-05-29T23:38:55.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:38:55.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:38:55.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:38:55.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023377.358702s, valid=True
2026-05-29T23:38:55.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:38:55.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:38:55.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:38:55.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:38:55.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:38:55.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:38:55.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:38:55.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:38:55.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:38:55.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:38:55.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:38:55.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:38:55.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:38:55.681 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:38:55.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:38:56.310 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:38:56.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:38:56.411 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:38:56.412 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:38:56.605 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:38:56.605 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:39:26.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:39:26.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:39:26.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:39:27.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:39:27.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:39:27.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:39:27.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-05-29T23:39:27.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:39:27.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-05-29T23:39:27.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:39:27.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:39:27.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:39:27.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-05-29T23:39:30.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T23:39:30.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:39:30.856 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:39:30.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:39:30.864 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:39:30.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:39:30.880 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:39:30.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:39:30.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:39:30.880 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:39:30.880 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:39:30.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:39:30.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:39:30.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:39:31.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:39:31.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:39:31.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:39:31.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:39:31.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:39:31.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:39:31.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:39:31.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:39:31.158 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:39:31.226 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:39:25
2026-05-29T23:39:31.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73168, datetime.datetime(2026, 5, 29, 23, 39, 25), datetime.datetime(2026, 5, 29, 23, 39, 25), 'salt', 8.43, 76.25, None, 17.29, 41.44, 3.93, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:39:31.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:39:31.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:39:31.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:39:25, diff=6.232431s, valid=True
2026-05-29T23:39:31.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:39:31.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:39:31.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:39:12, diff=19.235353s, valid=True
2026-05-29T23:39:31.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:39:31.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:39:31.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:39:25, diff=6.242135s, valid=True
2026-05-29T23:39:31.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:39:31.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:39:31.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:39:31.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:39:31.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:39:31.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:39:31.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:39:12, diff=19.245379s, valid=True
2026-05-29T23:39:31.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:39:31.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:39:31.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:39:31.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023413.246078s, valid=True
2026-05-29T23:39:31.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:39:31.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:39:31.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:39:31.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:39:31.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:39:31.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:39:31.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:39:31.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:39:31.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:39:31.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:39:31.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:39:31.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:39:31.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:39:31.569 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:39:31.791 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:39:32.158 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:39:32.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:39:32.257 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:39:32.257 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:39:32.451 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:39:32.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:40:02.482 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:40:02.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:40:02.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:40:02.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:40:02.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:40:02.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:40:02.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-05-29T23:40:02.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:40:02.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-05-29T23:40:02.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:40:02.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:40:02.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:40:02.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-05-29T23:40:05.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-05-29T23:40:05.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:40:05.443 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:40:05.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:40:05.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:40:05.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:40:05.468 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:40:05.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:40:05.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:40:05.468 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:40:05.468 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:40:05.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:40:05.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:40:05.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:40:05.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:40:05.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:40:05.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:40:05.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:40:05.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:40:05.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:40:05.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:40:05.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:40:05.745 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:40:05.813 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:39:55
2026-05-29T23:40:05.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73169, datetime.datetime(2026, 5, 29, 23, 39, 55), datetime.datetime(2026, 5, 29, 23, 39, 55), 'salt', 8.56, 76.28, None, 17.11, 36.32, 3.93, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:40:05.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:40:05.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:40:05.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:39:55, diff=10.819816s, valid=True
2026-05-29T23:40:05.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:40:05.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:40:05.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:40:12, diff=-6.177365s, valid=True
2026-05-29T23:40:05.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:40:05.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:40:05.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:39:55, diff=10.829348s, valid=True
2026-05-29T23:40:05.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:40:05.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:40:05.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:40:05.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:40:05.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:40:05.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:40:05.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:40:12, diff=-6.167632s, valid=True
2026-05-29T23:40:05.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:40:05.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:40:05.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:40:05.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023447.833034s, valid=True
2026-05-29T23:40:05.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:40:05.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:40:05.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:40:05.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:40:05.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:40:05.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:40:05.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:40:05.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:40:05.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:40:05.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:40:06.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:40:06.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:40:06.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:40:06.151 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:40:06.429 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:40:06.769 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:40:06.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:40:06.869 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:40:06.869 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:40:07.158 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:40:07.158 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:40:37.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:40:37.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:40:37.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:40:37.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:40:37.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:40:37.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:40:37.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-05-29T23:40:37.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:40:37.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-05-29T23:40:37.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:40:37.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:40:37.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:40:37.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-05-29T23:40:42.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-05-29T23:40:42.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:40:42.718 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:40:42.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:40:42.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:40:42.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:40:42.742 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:40:42.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:40:42.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:40:42.742 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:40:42.742 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:40:42.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:40:42.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:40:42.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:40:42.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:40:42.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:40:42.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:40:42.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:40:43.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:40:43.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:40:43.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:40:43.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:40:43.031 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:40:43.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:40:25
2026-05-29T23:40:43.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73170, datetime.datetime(2026, 5, 29, 23, 40, 25), datetime.datetime(2026, 5, 29, 23, 40, 25), 'salt', 8.63, 76.28, None, 17.82, 29.61, 3.93, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:40:43.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:40:43.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:40:43.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:40:25, diff=18.10223s, valid=True
2026-05-29T23:40:43.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:40:43.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:40:43.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:40:12, diff=31.105102s, valid=True
2026-05-29T23:40:43.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:40:43.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:40:43.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:40:25, diff=18.111924s, valid=True
2026-05-29T23:40:43.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:40:43.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:40:43.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:40:43.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:40:43.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:40:43.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:40:43.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:40:12, diff=31.114939s, valid=True
2026-05-29T23:40:43.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:40:43.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:40:43.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:40:43.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023485.115611s, valid=True
2026-05-29T23:40:43.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:40:43.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:40:43.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:40:43.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:40:43.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:40:43.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:40:43.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:40:43.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:40:43.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:40:43.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:40:43.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:40:43.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:40:43.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:40:43.434 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:40:43.642 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:40:43.987 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:40:44.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:40:44.090 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:40:44.090 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:40:44.242 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:40:44.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:41:14.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:41:14.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:41:14.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:41:14.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:41:14.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:41:14.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:41:14.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-05-29T23:41:14.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:41:14.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-05-29T23:41:14.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:41:14.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:41:14.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:41:14.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-05-29T23:41: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-05-29T23:41:17.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:41:17.515 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:41:17.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:41:17.523 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:41:17.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:41:17.540 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:41:17.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:41:17.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:41:17.540 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:41:17.540 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:41:17.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:41:17.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:41:17.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:41:17.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:41:17.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:41:17.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:41:17.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:41:17.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:41:17.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:41:17.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:41:17.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:41:17.813 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:41:17.877 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:40:56
2026-05-29T23:41:17.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73171, datetime.datetime(2026, 5, 29, 23, 40, 56), datetime.datetime(2026, 5, 29, 23, 40, 55), 'salt', 8.6, 76.21, None, 17.01, 28.01, 3.95, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:41:17.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:41:17.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:41:17.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:40:55, diff=22.883183s, valid=True
2026-05-29T23:41:17.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:41:17.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:41:17.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:41:12, diff=5.886002s, valid=True
2026-05-29T23:41:17.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:41:17.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:41:17.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:40:55, diff=22.892662s, valid=True
2026-05-29T23:41:17.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:41:17.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:41:17.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:41:17.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:41:17.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:41:17.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:41:17.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:41:12, diff=5.895666s, valid=True
2026-05-29T23:41:17.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:41:17.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:41:17.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:41:17.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023519.896327s, valid=True
2026-05-29T23:41:17.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:41:17.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:41:17.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:41:17.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:41:17.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:41:17.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:41:17.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:41:17.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:41:17.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:41:18.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:41:18.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:41:18.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:41:18.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:41:18.284 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:41:18.492 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:41:18.831 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:41:18.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:41:18.933 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:41:18.933 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:41:19.210 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:41:19.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:41:49.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:41:49.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:41:49.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:41:49.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:41:49.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:41:49.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:41:49.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-05-29T23:41:49.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:41:49.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-05-29T23:41:49.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:41:49.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:41:49.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:41:49.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-05-29T23:42:23.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-05-29T23:42:23.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:42:23.223 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:42:23.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:42:23.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:42:23.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:42:23.245 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:42:23.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:42:23.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:42:23.246 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:42:23.246 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:42:23.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:42:23.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T23:42:23.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:42:23.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T23:42:23.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:42:23.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:42:23.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:42:23.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:42:23.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:42:23.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:42:23.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:42:23.533 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:42:23.592 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:41:56
2026-05-29T23:42:23.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73173, datetime.datetime(2026, 5, 29, 23, 41, 56), datetime.datetime(2026, 5, 29, 23, 41, 56), 'salt', 8.5, 76.15, None, 18.46, 30.5, 3.96, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:42:23.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:42:23.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T23:42:23.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:41:56, diff=27.598479s, valid=True
2026-05-29T23:42:23.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:42:23.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:42:23.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:42:12, diff=11.6013s, valid=True
2026-05-29T23:42:23.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:42:23.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T23:42:23.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:41:56, diff=27.607985s, valid=True
2026-05-29T23:42:23.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:42:23.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:42:23.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:42:23.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:42:23.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:42:23.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:42:23.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:42:12, diff=11.611006s, valid=True
2026-05-29T23:42:23.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:42:23.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:42:23.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:42:23.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023585.611672s, valid=True
2026-05-29T23:42:23.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:42:23.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:42:23.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:42:23.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:42:23.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:42:23.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:42:23.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:42:23.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:42:23.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:42:23.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:42:23.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:42:23.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:42:23.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:42:23.931 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:42:24.154 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:42:24.494 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:42:24.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:42:24.595 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:42:24.595 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:42:27.645 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:42:27.646 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:42:57.676 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:42:57.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:42:57.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:42:57.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:42:57.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:42:58.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:42:58.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-05-29T23:42:58.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:42:58.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-05-29T23:42:58.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:42:58.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:42:58.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:42:58.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-05-29T23:43:58.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-05-29T23:43:58.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:43:58.224 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:43:58.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:43:58.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:43:58.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:43:58.245 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:43:58.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:43:58.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:43:58.245 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:43:58.245 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:43:58.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:43:58.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:43:58.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:43:58.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:43:58.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:43:58.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:43:58.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:43:58.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:43:58.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:43:58.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:43:58.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:43:58.551 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:43:58.616 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:43:57
2026-05-29T23:43:58.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73177, datetime.datetime(2026, 5, 29, 23, 43, 57), datetime.datetime(2026, 5, 29, 23, 43, 57), 'salt', 8.36, 76.38, None, 18.21, 35.08, 3.9, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:43:58.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:43:58.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:43:58.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:43:57, diff=1.623235s, valid=True
2026-05-29T23:43:58.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:43:58.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:43:58.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:44:12, diff=-13.37361s, valid=True
2026-05-29T23:43:58.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:43:58.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:43:58.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:43:57, diff=1.633353s, valid=True
2026-05-29T23:43:58.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:43:58.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:43:58.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:43:58.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:43:58.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:43:58.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:43:58.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:44:12, diff=-13.363363s, valid=True
2026-05-29T23:43:58.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:43:58.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:43:58.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:43:58.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023680.637302s, valid=True
2026-05-29T23:43:58.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:43:58.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:43:58.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:43:58.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:43:58.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:43:58.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:43:58.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:43:58.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:43:58.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:43:58.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:43:58.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:43:58.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:43:58.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:43:59.030 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:43:59.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:43:59.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:43:59.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:43:59.703 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:43:59.703 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:43:59.898 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:43:59.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:44:29.927 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:44:29.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:44:29.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:44:30.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:44:30.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:44:30.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:44:30.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-05-29T23:44:30.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:44:30.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T23:44:30.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:44:30.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:44:30.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:44:30.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-05-29T23:45:03.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-05-29T23:45:03.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:45:03.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:45:03.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:45:03.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:45:03.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:45:03.768 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:45:03.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:45:03.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:45:03.769 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:45:03.769 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:45:03.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:45:03.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:45:03.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:45:03.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:45:03.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:45:03.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:45:03.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:45:04.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:45:04.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:45:04.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:45:04.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:45:04.034 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:45:04.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:44:58
2026-05-29T23:45:04.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73179, datetime.datetime(2026, 5, 29, 23, 44, 58), datetime.datetime(2026, 5, 29, 23, 44, 57), 'salt', 8.3, 76.51, None, 17.4, 32.19, 3.88, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:45:04.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:45:04.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:45:04.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:44:57, diff=7.103173s, valid=True
2026-05-29T23:45:04.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:45:04.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:45:04.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:45:12, diff=-7.893985s, valid=True
2026-05-29T23:45:04.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:45:04.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:45:04.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:44:57, diff=7.11272s, valid=True
2026-05-29T23:45:04.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:45:04.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:45:04.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:45:04.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:45:04.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:45:04.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:45:04.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:45:12, diff=-7.884264s, valid=True
2026-05-29T23:45:04.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:45:04.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:45:04.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:45:04.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023746.116393s, valid=True
2026-05-29T23:45:04.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:45:04.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:45:04.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:45:04.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:45:04.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:45:04.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:45:04.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:45:04.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:45:04.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:45:04.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:45:04.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:45:04.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:45:04.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:45:04.435 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:45:04.668 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:45:05.006 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:45:05.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:45:05.104 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:45:05.104 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:45:05.301 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:45:05.301 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:45:35.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:45:35.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:45:35.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:45:35.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:45:35.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:45:36.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:45:36.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-05-29T23:45:36.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:45:36.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-05-29T23:45:36.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:45:36.117 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:45:36.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23: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-05-29T23:45:38.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-05-29T23:45:38.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:45:38.809 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:45:38.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:45:38.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:45:38.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:45:38.829 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:45:38.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:45:38.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:45:38.829 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:45:38.829 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:45:38.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:45:38.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:45:38.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:45:39.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:45:39.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:45:39.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:45:39.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:45:39.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:45:39.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:45:39.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:45:39.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:45:39.093 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:45:39.156 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:45:28
2026-05-29T23:45:39.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73180, datetime.datetime(2026, 5, 29, 23, 45, 28), datetime.datetime(2026, 5, 29, 23, 45, 27), 'salt', 8.43, 76.68, None, 18.74, 27.5, 3.85, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:45:39.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:45:39.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:45:39.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:45:27, diff=12.163169s, valid=True
2026-05-29T23:45:39.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:45:39.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:45:39.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:45:12, diff=27.166209s, valid=True
2026-05-29T23:45:39.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:45:39.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:45:39.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:45:21, diff=18.173376s, valid=True
2026-05-29T23:45:39.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:45:39.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:45:39.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:45:39.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:45:39.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:45:39.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:45:39.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:45:12, diff=27.176495s, valid=True
2026-05-29T23:45:39.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:45:39.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:45:39.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:45:39.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023781.177169s, valid=True
2026-05-29T23:45:39.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:45:39.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:45:39.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:45:39.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:45:39.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:45:39.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:45:39.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:45:39.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:45:39.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:45:39.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:45:39.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:45:39.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:45:39.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:45:39.574 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:45:39.810 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:45:40.176 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:45:40.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:45:40.289 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:45:40.289 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:45:40.574 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:45:40.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:46:10.586 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:46:10.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:46:10.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:46:10.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:46:10.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:46:11.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:46:11.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-05-29T23:46:11.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:46:11.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-05-29T23:46:11.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:46:11.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:46:11.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:46:11.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-05-29T23:46:13.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-05-29T23:46:13.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:46:13.933 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:46:13.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:46:13.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:46:13.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:46:13.954 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:46:13.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:46:13.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:46:13.954 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:46:13.954 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:46:13.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:46:14.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:46:14.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:46:14.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:46:14.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:46:14.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:46:14.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:46:14.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:46:14.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:46:14.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:46:14.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:46:14.205 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:46:14.264 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:45:58
2026-05-29T23:46:14.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73181, datetime.datetime(2026, 5, 29, 23, 45, 58), datetime.datetime(2026, 5, 29, 23, 45, 58), 'salt', 8.53, 76.61, None, 17.61, 22.31, 3.87, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:46:14.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:46:14.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:46:14.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:45:58, diff=16.270606s, valid=True
2026-05-29T23:46:14.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:46:14.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:46:14.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:46:12, diff=2.273437s, valid=True
2026-05-29T23:46:14.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:46:14.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:46:14.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:45:52, diff=22.28005s, valid=True
2026-05-29T23:46:14.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:46:14.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:46:14.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:46:14.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:46:14.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:46:14.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:46:14.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:46:12, diff=2.28312s, valid=True
2026-05-29T23:46:14.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:46:14.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:46:14.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:46:14.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023816.283806s, valid=True
2026-05-29T23:46:14.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:46:14.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:46:14.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:46:14.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:46:14.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:46:14.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:46:14.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:46:14.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:46:14.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:46:14.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:46:14.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:46:14.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:46:14.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:46:14.605 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:46:14.812 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:46:15.154 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:46:15.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:46:15.254 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:46:15.254 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:46:15.441 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:46:15.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:46:45.449 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:46:45.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:46:45.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:46:45.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:46:45.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:46:45.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:46:45.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-05-29T23:46:45.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:46:45.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-05-29T23:46:45.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:46:45.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:46:45.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:46:45.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-05-29T23:46:49.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T23:46:49.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:46:49.956 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:46:49.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:46:49.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:46:49.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:46:49.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:46:49.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:46:49.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:46:49.976 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:46:49.976 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:46:49.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:46:50.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:46:50.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:46:50.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:46:50.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:46:50.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:46:50.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:46:50.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:46:50.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:46:50.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:46:50.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:46:50.241 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:46:50.301 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:46:28
2026-05-29T23:46:50.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73182, datetime.datetime(2026, 5, 29, 23, 46, 28), datetime.datetime(2026, 5, 29, 23, 46, 28), 'salt', 8.53, 76.65, None, 16.69, 20.52, 3.86, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:46:50.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:46:50.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:46:50.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:46:28, diff=22.307179s, valid=True
2026-05-29T23:46:50.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:46:50.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:46:50.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:46:12, diff=38.31003s, valid=True
2026-05-29T23:46:50.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:46:50.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:46:50.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:46:24, diff=26.316738s, valid=True
2026-05-29T23:46:50.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:46:50.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:46:50.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:46:50.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:46:50.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:46:50.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:46:50.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:46:12, diff=38.319781s, valid=True
2026-05-29T23:46:50.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:46:50.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:46:50.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:46:50.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023852.320443s, valid=True
2026-05-29T23:46:50.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:46:50.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:46:50.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:46:50.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:46:50.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:46:50.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:46:50.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:46:50.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:46:50.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:46:51.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:46:53.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:46:53.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:46:53.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:46:53.740 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:46:53.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:46:54.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:46:54.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:46:54.385 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:46:54.385 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:46:54.636 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:46:54.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:47:24.638 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:47:24.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:47:24.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:47:24.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:47:24.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:47:25.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:47:25.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-05-29T23:47:25.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:47:25.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-05-29T23:47:25.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:47:25.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:47:25.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:47:25.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-05-29T23:48:06.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-05-29T23:48:06.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:48:06.288 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:48:06.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:48:06.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:48:06.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:48:06.308 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:48:06.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:48:06.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:48:06.309 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:48:06.309 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:48:06.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:48:06.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:48:06.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:48:06.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:48:06.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:48:06.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:48:06.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:48:06.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:48:06.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:48:06.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:48:06.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:48:06.581 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:48:06.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:47:59
2026-05-29T23:48:06.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73185, datetime.datetime(2026, 5, 29, 23, 47, 59), datetime.datetime(2026, 5, 29, 23, 47, 58), 'salt', 8.5, 76.45, None, 18.88, 23.76, 3.9, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:48:06.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:48:06.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:48:06.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:47:58, diff=8.649211s, valid=True
2026-05-29T23:48:06.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:48:06.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:48:06.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:48:12, diff=-5.347904s, valid=True
2026-05-29T23:48:06.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:48:06.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:48:06.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:47:58, diff=8.658871s, valid=True
2026-05-29T23:48:06.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:48:06.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:48:06.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:48:06.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:48:06.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:48:06.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:48:06.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:48:12, diff=-5.33803s, valid=True
2026-05-29T23:48:06.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:48:06.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:48:06.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:48:06.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1023928.662646s, valid=True
2026-05-29T23:48:06.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:48:06.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:48:06.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:48:06.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:48:06.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:48:06.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:48:06.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:48:06.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:48:06.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:48:06.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:48:06.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:48:06.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:48:06.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:48:06.983 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:48:07.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:48:07.668 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:48:07.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:48:07.767 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:48:07.767 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:48:07.953 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:48:07.953 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:48:37.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:48:37.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:48:37.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:48:38.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:48:38.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:48:38.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:48:38.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-05-29T23:48:38.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:48:38.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-05-29T23:48:38.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:48:38.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:48:38.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:48:38.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-05-29T23:50:01.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-05-29T23:50:01.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:50:01.445 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:50:01.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:50:01.455 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:50:01.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:50:01.469 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:50:01.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:50:01.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:50:01.470 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:50:01.470 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:50:01.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:50:01.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:50:01.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:50:01.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:50:01.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:50:01.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:50:01.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:50:01.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:50:01.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:50:01.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:50:01.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:50:01.763 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:50:01.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:50:00
2026-05-29T23:50:01.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73189, datetime.datetime(2026, 5, 29, 23, 50), datetime.datetime(2026, 5, 29, 23, 49, 59), 'salt', 8.46, 76.51, None, 17.5, 18.43, 3.88, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:50:01.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:50:01.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:50:01.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:49:59, diff=2.829349s, valid=True
2026-05-29T23:50:01.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:50:01.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:50:01.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:50:12, diff=-10.167718s, valid=True
2026-05-29T23:50:01.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:50:01.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:50:01.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:49:54, diff=7.839147s, valid=True
2026-05-29T23:50:01.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:50:01.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:50:01.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:50:01.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:50:01.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:50:01.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:50:01.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:50:12, diff=-10.157754s, valid=True
2026-05-29T23:50:01.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:50:01.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:50:01.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:50:01.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024043.842942s, valid=True
2026-05-29T23:50:01.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:50:01.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:50:01.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:50:01.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:50:01.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:50:01.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:50:01.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:50:01.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:50:01.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:50:01.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:50:02.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:50:02.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:50:02.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:50:02.197 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:50:02.427 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:50:02.768 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:50:02.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:50:02.870 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:50:02.870 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:50:03.056 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:50:03.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:50:33.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:50:33.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:50:33.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:50:33.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:50:33.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:50:33.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:50:33.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-05-29T23:50:33.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:50:33.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-05-29T23:50:33.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:50:33.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:50:33.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:50:33.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-05-29T23:50:36.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-05-29T23:50:36.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:50:36.192 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:50:36.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:50:36.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:50:36.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:50:36.213 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:50:36.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:50:36.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:50:36.213 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:50:36.213 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:50:36.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:50:36.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:50:36.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:50:36.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:50:36.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:50:36.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:50:36.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:50:36.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:50:36.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:50:36.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:50:36.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:50:36.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:50:36.538 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:50:30
2026-05-29T23:50:36.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73190, datetime.datetime(2026, 5, 29, 23, 50, 30), datetime.datetime(2026, 5, 29, 23, 50, 30), 'salt', 8.43, 76.51, None, 16.83, 20.76, 3.88, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:50:36.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:50:36.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:50:36.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:50:30, diff=6.544756s, valid=True
2026-05-29T23:50:36.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:50:36.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:50:36.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:50:12, diff=24.547525s, valid=True
2026-05-29T23:50:36.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:50:36.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:50:36.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:50:25, diff=11.554104s, valid=True
2026-05-29T23:50:36.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:50:36.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:50:36.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:50:36.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:50:36.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:50:36.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:50:36.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:50:12, diff=24.557098s, valid=True
2026-05-29T23:50:36.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:50:36.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:50:36.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:50:36.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024078.557764s, valid=True
2026-05-29T23:50:36.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:50:36.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:50:36.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:50:36.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:50:36.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:50:36.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:50:36.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:50:36.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:50:36.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:50:36.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:50:36.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:50:36.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:50:36.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:50:36.878 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:50:37.183 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:50:37.532 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:50:37.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:50:37.639 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:50:37.639 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:50:37.904 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:50:37.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:51:07.934 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:51:07.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:51:07.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:51:08.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:51:08.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:51:08.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:51:08.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-05-29T23:51:08.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:51:08.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-05-29T23:51:08.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:51:08.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:51:08.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:51:08.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-05-29T23:52:10.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-05-29T23:52:10.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:52:10.981 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:52:10.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:52:10.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:52:11.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:52:11.002 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:52:11.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:52:11.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:52:11.002 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:52:11.002 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:52:11.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:52:11.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:52:11.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:52:11.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:52:11.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:52:11.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:52:11.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:52:11.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:52:11.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:52:11.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:52:11.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:52:11.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:52:11.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:52:01
2026-05-29T23:52:11.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73193, datetime.datetime(2026, 5, 29, 23, 52, 1), datetime.datetime(2026, 5, 29, 23, 52), 'salt', 8.3, 76.65, None, 16.51, 19.89, 3.85, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:52:11.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:52:11.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:52:11.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:52:00, diff=11.341508s, valid=True
2026-05-29T23:52:11.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:52:11.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:52:11.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:52:12, diff=-0.65571s, valid=True
2026-05-29T23:52:11.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:52:11.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:52:11.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:52:00, diff=11.350957s, valid=True
2026-05-29T23:52:11.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:52:11.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:52:11.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:52:11.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:52:11.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:52:11.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:52:11.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:52:12, diff=-0.646058s, valid=True
2026-05-29T23:52:11.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:52:11.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:52:11.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:52:11.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024173.354596s, valid=True
2026-05-29T23:52:11.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:52:11.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:52:11.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:52:11.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:52:11.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:52:11.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:52:11.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:52:11.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:52:11.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:52:11.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:52:11.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:52:11.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:52:11.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:52:11.674 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:52:11.905 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:52:12.263 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:52:12.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:52:12.367 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:52:12.367 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:52:13.001 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:52:13.001 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:52:43.031 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:52:43.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:52:43.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:52:43.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:52:43.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:52:43.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:52:43.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-05-29T23:52:43.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:52: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-05-29T23:52:43.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:52:43.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:52:43.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:52:43.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-05-29T23:53:40.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-05-29T23:53:40.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:53:40.151 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:53:40.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:53:40.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:53:40.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:53:40.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:53:40.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:53:40.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:53:40.172 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:53:40.172 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:53:40.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:53:40.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:53:40.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:53:40.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:53:40.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:53:40.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:53:40.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:53:40.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:53:40.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:53:40.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:53:40.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:53:40.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:53:40.494 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:53:31
2026-05-29T23:53:40.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73196, datetime.datetime(2026, 5, 29, 23, 53, 31), datetime.datetime(2026, 5, 29, 23, 53, 31), 'salt', 8.36, 76.85, None, 17.75, 25.99, 3.81, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:53:40.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:53:40.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:53:40.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:53:31, diff=9.500665s, valid=True
2026-05-29T23:53:40.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:53:40.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:53:40.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:53:12, diff=28.503533s, valid=True
2026-05-29T23:53:40.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:53:40.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:53:40.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:53:24, diff=16.510352s, valid=True
2026-05-29T23:53:40.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:53:40.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:53:40.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:53:40.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:53:40.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:53:40.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:53:40.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:53:12, diff=28.513397s, valid=True
2026-05-29T23:53:40.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:53:40.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:53:40.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:53:40.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024262.51408s, valid=True
2026-05-29T23:53:40.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:53:40.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:53:40.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:53:40.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:53:40.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:53:40.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:53:40.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:53:40.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:53:40.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:53:40.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:53:40.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:53:40.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:53:40.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:53:40.956 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:53:41.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:53:41.568 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:53:41.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:53:41.681 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:53:41.681 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:53:41.874 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:53:41.874 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:54:11.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:54:11.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:54:11.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:54:12.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:54:12.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:54:12.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:54:12.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-05-29T23:54:12.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:54:12.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-05-29T23:54:12.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:54:12.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:54:12.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:54:12.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-05-29T23:54:15.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-05-29T23:54:15.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:54:15.107 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:54:15.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:54:15.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:54:15.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:54:15.131 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:54:15.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:54:15.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:54:15.132 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:54:15.132 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:54:15.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:54:15.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:54:15.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:54:15.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:54:15.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:54:15.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:54:15.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:54:15.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T23:54:15.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:54:15.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:54:15.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:54:15.450 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:54:15.511 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:54:02
2026-05-29T23:54:15.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73197, datetime.datetime(2026, 5, 29, 23, 54, 2), datetime.datetime(2026, 5, 29, 23, 54, 1), 'salt', 8.3, 76.78, None, 18.84, 22.07, 3.83, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:54:15.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:54:15.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:54:15.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:54:01, diff=14.519206s, valid=True
2026-05-29T23:54:15.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:54:15.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:54:15.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:54:12, diff=3.522751s, valid=True
2026-05-29T23:54:15.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:54:15.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:54:15.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:53:56, diff=19.531097s, valid=True
2026-05-29T23:54:15.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:54:15.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:54:15.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:54:15.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:54:15.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:54:15.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T23:54:15.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:54:12, diff=3.534893s, valid=True
2026-05-29T23:54:15.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:54:15.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:54:15.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:54:15.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024297.535732s, valid=True
2026-05-29T23:54:15.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:54:15.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:54:15.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:54:15.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:54:15.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:54:15.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:54:15.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:54:15.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:54:15.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:54:15.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:54:15.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:54:15.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:54:15.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:54:15.872 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:54:16.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:54:16.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:54:16.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:54:16.554 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:54:16.554 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:54:16.748 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:54:16.748 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:54:46.750 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:54:46.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:54:46.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:54:47.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:54:47.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:54:47.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:54:47.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-05-29T23:54:47.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:54:47.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-05-29T23:54:47.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:54:47.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:54:47.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:54: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-05-29T23:55:39.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-05-29T23:55:39.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:55:39.867 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:55:39.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:55:39.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:55:39.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:55:39.888 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:55:39.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:55:39.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:55:39.889 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:55:39.889 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:55:39.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:55:39.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:55:39.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:55:40.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:55:40.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:55:40.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T23:55:40.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:55:40.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T23:55:40.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:55:40.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:55:40.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:55:40.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:55:40.229 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:55:32
2026-05-29T23:55:40.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73200, datetime.datetime(2026, 5, 29, 23, 55, 32), datetime.datetime(2026, 5, 29, 23, 55, 32), 'salt', 8.36, 76.45, None, 17.43, 22.73, 3.89, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:55:40.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:55:40.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:55:40.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:55:32, diff=8.235365s, valid=True
2026-05-29T23:55:40.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:55:40.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T23:55:40.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:54:12, diff=88.238255s, valid=True
2026-05-29T23:55:40.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:55:40.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:55:40.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:55:30, diff=10.24509s, valid=True
2026-05-29T23:55:40.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:55:40.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:55:40.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:55:40.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:55:40.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:55:40.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T23:55:40.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:54:12, diff=88.248116s, valid=True
2026-05-29T23:55:40.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:55:40.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:55:40.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:55:40.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024382.248789s, valid=True
2026-05-29T23:55:40.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:55:40.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:55:40.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:55:40.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:55:40.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:55:40.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:55:40.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:55:40.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:55:40.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:55:40.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:55:40.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:55:40.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:55:40.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:55:40.636 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:55:40.869 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:55:41.233 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:55:41.339 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:55:41.339 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:55:41.339 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:55:41.590 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:55:41.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:56:11.620 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:56:11.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:56:11.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:56:12.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:56:12.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:56:12.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:56:12.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-05-29T23:56:12.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:56:12.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-05-29T23:56:12.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:56:12.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:56:12.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:56:12.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-05-29T23:56:15.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-05-29T23:56:15.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:56:15.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:56:15.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:56:15.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:56:15.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:56:15.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:56:15.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:56:15.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:56:15.928 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:56:15.928 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:56:15.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:56:16.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:56:16.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:56:16.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:56:16.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:56:16.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T23:56:16.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:56:16.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T23:56:16.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:56:16.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:56:16.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:56:16.179 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:56:16.238 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:56:02
2026-05-29T23:56:16.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73201, datetime.datetime(2026, 5, 29, 23, 56, 2), datetime.datetime(2026, 5, 29, 23, 56, 2), 'salt', 8.46, 76.51, None, 16.27, 25.85, 3.88, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:56:16.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:56:16.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:56:16.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:56:02, diff=14.244407s, valid=True
2026-05-29T23:56:16.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:56:16.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T23:56:16.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:54:12, diff=124.247218s, valid=True
2026-05-29T23:56:16.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:56:16.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:56:16.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:56:01, diff=15.253897s, valid=True
2026-05-29T23:56:16.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:56:16.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:56:16.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:56:16.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:56:16.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:56:16.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T23:56:16.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:54:12, diff=124.256929s, valid=True
2026-05-29T23:56:16.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:56:16.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:56:16.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:56:16.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024418.257603s, valid=True
2026-05-29T23:56:16.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:56:16.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:56:16.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:56:16.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:56:16.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:56:16.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:56:16.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:56:16.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:56:16.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:56:16.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:56:16.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:56:16.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:56:16.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:56:16.572 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:56:16.785 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:56:17.129 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:56:17.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:56:17.230 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:56:17.230 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:56:17.428 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:56:17.428 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:56:47.457 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:56:47.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:56:47.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:56:47.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:56:47.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:56:48.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:56:48.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-05-29T23:56:48.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:56: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-05-29T23:56:48.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:56:48.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:56:48.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:56:48.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-05-29T23:56:53.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-05-29T23:56:53.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:56:53.115 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:56:53.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:56:53.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:56:53.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:56:53.138 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:56:53.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:56:53.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:56:53.138 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:56:53.138 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:56:53.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:56:53.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:56:53.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:56:53.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:56:53.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:56:53.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T23:56:53.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:56:53.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T23:56:53.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:56:53.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:56:53.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:56:53.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:56:53.480 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:56:33
2026-05-29T23:56:53.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73202, datetime.datetime(2026, 5, 29, 23, 56, 33), datetime.datetime(2026, 5, 29, 23, 56, 32), 'salt', 8.46, 76.41, None, 18.77, 21.72, 3.9, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:56:53.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:56:53.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:56:53.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:56:32, diff=21.48697s, valid=True
2026-05-29T23:56:53.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:56:53.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T23:56:53.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:54:12, diff=161.489857s, valid=True
2026-05-29T23:56:53.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:56:53.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:56:53.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:56:24, diff=29.496485s, valid=True
2026-05-29T23:56:53.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:56:53.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:56:53.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:56:53.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:56:53.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:56:53.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T23:56:53.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:54:12, diff=161.499515s, valid=True
2026-05-29T23:56:53.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:56:53.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:56:53.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:56:53.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024455.500194s, valid=True
2026-05-29T23:56:53.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:56:53.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:56:53.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:56:53.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:56:53.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:56:53.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:56:53.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:56:53.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:56:53.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:56:53.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:56:53.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:56:53.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:56:53.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:56:53.885 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:56:54.103 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:56:54.452 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:56:54.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:56:54.553 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:56:54.553 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:56:54.751 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:56:54.751 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:57:24.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:57:24.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:57:24.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:57:25.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:57:25.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:57:25.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:57:25.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-05-29T23:57:25.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:57:25.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-05-29T23:57:25.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:57:25.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:57:25.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:57:25.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-05-29T23:58:09.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-05-29T23:58:09.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:58:09.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:58:09.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:58:09.357 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:58:09.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:58:09.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:58:09.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:58:09.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:58:09.370 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:58:09.370 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:58:09.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:58:09.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:58:09.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:58:09.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:58:09.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:58:09.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:58:09.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:58:09.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T23:58:09.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:58:09.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:58:09.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:58:09.628 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:58:09.689 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:58:03
2026-05-29T23:58:09.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73205, datetime.datetime(2026, 5, 29, 23, 58, 3), datetime.datetime(2026, 5, 29, 23, 58, 3), 'salt', 8.4, 76.25, None, 17.86, 21.32, 3.93, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:58:09.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:58:09.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:58:09.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:58:03, diff=6.695412s, valid=True
2026-05-29T23:58:09.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:58:09.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:58:09.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:54:12, diff=237.698212s, valid=True
2026-05-29T23:58:09.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:58:09.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:58:09.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:57:57, diff=12.704824s, valid=True
2026-05-29T23:58:09.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:58:09.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:58:09.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:58:09.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:58:09.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:58:09.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T23:58:09.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:54:12, diff=237.707812s, valid=True
2026-05-29T23:58:09.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:58:09.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:58:09.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:58:09.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024531.708462s, valid=True
2026-05-29T23:58:09.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:58:09.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:58:09.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:58:09.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:58:09.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:58:09.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:58:09.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:58:09.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:58:09.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:58:09.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:58:09.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:58:09.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:58:10.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:58:10.059 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:58:10.281 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:58:10.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:58:10.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:58:10.725 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:58:10.725 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:58:10.921 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:58:10.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:58:40.951 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:58:40.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:58:40.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:58:41.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:58:41.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:58:41.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:58:41.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-05-29T23:58:41.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:58:41.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-05-29T23:58:41.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:58:41.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:58:41.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:58:41.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-05-29T23:59:13.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-05-29T23:59:13.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T23:59:13.330 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T23:59:13.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T23:59:13.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T23:59:13.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T23:59:13.353 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T23:59:13.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T23:59:13.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T23:59:13.354 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T23:59:13.354 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T23:59:13.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T23:59:13.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T23:59:13.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T23:59:13.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T23:59:13.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:59:13.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-29T23:59:13.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T23:59:13.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-29T23:59:13.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T23:59:13.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T23:59:13.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T23:59:13.619 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T23:59:13.678 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 23:59:04
2026-05-29T23:59:13.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73207, datetime.datetime(2026, 5, 29, 23, 59, 4), datetime.datetime(2026, 5, 29, 23, 59, 3), 'salt', 8.43, 76.05, None, 17.82, 30.27, 3.97, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T23:59:13.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T23:59:13.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T23:59:13.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:59:03, diff=10.684139s, valid=True
2026-05-29T23:59:13.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T23:59:13.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-29T23:59:13.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:54:12, diff=301.686899s, valid=True
2026-05-29T23:59:13.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T23:59:13.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T23:59:13.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:59:00, diff=13.693429s, valid=True
2026-05-29T23:59:13.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T23:59:13.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:59:13.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T23:59:13.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T23:59:13.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T23:59:13.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-29T23:59:13.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 23:54:12, diff=301.696417s, valid=True
2026-05-29T23:59:13.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T23:59:13.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T23:59:13.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T23:59:13.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024595.697084s, valid=True
2026-05-29T23:59:13.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T23:59:13.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T23:59:13.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T23:59:13.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T23:59:13.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T23:59:13.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T23:59:13.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T23:59:13.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T23:59:13.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T23:59:13.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T23:59:13.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T23:59:13.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T23:59:13.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T23:59:14.020 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T23:59:14.242 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:59:14.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T23:59:14.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T23:59:14.693 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T23:59:14.693 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T23:59:15.002 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T23:59:15.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T23:59:45.032 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T23:59:45.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T23:59:45.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T23:59:45.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T23:59:45.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T23:59:45.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T23:59:45.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-05-29T23:59:45.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T23:59:45.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-05-29T23:59:45.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T23:59:45.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T23:59:45.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T23:59:45.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-05-30T00:00:18.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-05-30T00:00:18.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:00:18.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:00:18.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:00:18.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:00:18.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:00:18.747 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:00:18.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:00:18.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:00:18.747 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:00:18.747 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:00:18.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:00:18.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:00:18.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:00:18.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:00:18.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:00:18.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:00:18.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:00:19.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:00:19.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:00:19.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:00:19.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:00:19.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:00:19.072 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:00:05
2026-05-30T00:00:19.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73209, datetime.datetime(2026, 5, 30, 0, 0, 5), datetime.datetime(2026, 5, 30, 0, 0, 4), 'salt', 8.46, 76.11, None, 19.02, 23.06, 3.95, 832.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:00:19.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:00:19.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:00:19.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:00:04, diff=15.078535s, valid=True
2026-05-30T00:00:19.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:00:19.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:00:19.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:00:12, diff=7.08132s, valid=True
2026-05-30T00:00:19.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:00:19.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:00:19.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:00:03, diff=16.087937s, valid=True
2026-05-30T00:00:19.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:00:19.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:00:19.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:00:19.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:00:19.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:00:19.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:00:19.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:00:12, diff=7.09094s, valid=True
2026-05-30T00:00:19.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:00:19.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:00:19.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:00:19.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024661.091616s, valid=True
2026-05-30T00:00:19.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:00:19.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:00:19.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:00:19.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:00:19.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:00:19.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:00:19.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:00:19.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:00:19.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:00:19.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:00:19.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:00:19.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:00:19.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:00:19.428 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:00:19.656 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:00:20.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:00:20.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:00:20.202 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:00:20.203 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:00:20.508 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:00:20.508 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:00:50.534 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:00:50.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:00:50.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:00:51.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:00:51.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:00:51.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:00:51.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-05-30T00:00:51.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:00: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-05-30T00:00:51.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:00:51.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:00:51.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:00:51.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-05-30T00:00:54.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-05-30T00:00:54.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:00:54.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:00:54.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:00:54.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:00:54.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:00:54.378 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:00:54.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:00:54.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:00:54.380 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:00:54.380 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:00:54.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:00:54.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:00:54.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:00:54.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:00:54.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:00:54.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T00:00:54.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:00:54.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T00:00:54.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:00:54.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:00:54.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:00:54.684 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:00:54.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:00:35
2026-05-30T00:00:54.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73210, datetime.datetime(2026, 5, 30, 0, 0, 35), datetime.datetime(2026, 5, 30, 0, 0, 35), 'salt', 8.4, 76.02, None, 17.96, 29.26, 3.98, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:00:54.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:00:54.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:00:54.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:00:35, diff=19.769249s, valid=True
2026-05-30T00:00:54.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:00:54.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T00:00:54.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:01:12, diff=-17.227399s, valid=True
2026-05-30T00:00:54.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:00:54.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:00:54.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:00:34, diff=20.780513s, valid=True
2026-05-30T00:00:54.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:00:54.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:00:54.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:00:54.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:00:54.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:00:54.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T00:00:54.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:01:12, diff=-17.215967s, valid=True
2026-05-30T00:00:54.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:00:54.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:00:54.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:00:54.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024696.784813s, valid=True
2026-05-30T00:00:54.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:00:54.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:00:54.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:00:54.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:00:54.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:00:54.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:00:54.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:00:54.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:00:54.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:00:54.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:00:54.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:00:55.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:00:55.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:00:55.111 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:00:55.348 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:00:55.701 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:00:55.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:00:55.803 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:00:55.803 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:00:56.002 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:00:56.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:01:26.027 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:01:26.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:01:26.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:01:26.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:01:26.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:01:26.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:01:26.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-05-30T00:01:26.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:01:26.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-05-30T00:01:26.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:01:26.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:01:26.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:01:26.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-05-30T00:01:32.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-05-30T00:01:32.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:01:32.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:01:32.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:01:32.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:01:32.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:01:32.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:01:32.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:01:32.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:01:32.497 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:01:32.497 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:01:32.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:01:32.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T00:01:32.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:01:32.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T00:01:32.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:01:32.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:01:32.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:01:32.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:01:32.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:01:32.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:01:32.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:01:32.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:01:32.820 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:01:06
2026-05-30T00:01:32.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73211, datetime.datetime(2026, 5, 30, 0, 1, 6), datetime.datetime(2026, 5, 30, 0, 1, 5), 'salt', 8.4, 76.05, None, 18.56, 24.28, 3.97, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:01:32.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:01:32.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T00:01:32.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:01:05, diff=27.826764s, valid=True
2026-05-30T00:01:32.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:01:32.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:01:32.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:01:12, diff=20.82963s, valid=True
2026-05-30T00:01:32.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:01:32.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T00:01:32.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:01:05, diff=27.836443s, valid=True
2026-05-30T00:01:32.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:01:32.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:01:32.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:01:32.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:01:32.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:01:32.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:01:32.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:01:12, diff=20.839531s, valid=True
2026-05-30T00:01:32.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:01:32.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:01:32.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:01:32.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024734.840213s, valid=True
2026-05-30T00:01:32.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:01:32.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:01:32.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:01:32.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:01:32.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:01:32.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:01:32.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:01:32.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:01:32.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:01:32.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:01:33.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:01:33.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:01:33.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:01:33.159 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:01:33.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:01:33.800 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:01:33.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:01:33.901 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:01:33.901 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:01:34.100 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:01:34.100 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:02:04.130 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:02:04.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:02:04.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:02:04.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:02:04.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:02:04.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:02:04.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-05-30T00:02:04.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:02:04.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-05-30T00:02:04.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:02:04.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:02:04.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:02:04.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-05-30T00:02:07.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-05-30T00:02:07.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:02:07.626 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:02:07.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:02:07.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:02:07.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:02:07.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:02:07.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:02:07.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:02:07.647 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:02:07.647 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:02:07.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:02:07.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:02:07.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:02:07.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:02:07.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:02:07.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:02:07.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:02:07.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:02:07.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:02:07.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:02:07.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:02:07.934 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:02:07.996 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:02:06
2026-05-30T00:02:07.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73213, datetime.datetime(2026, 5, 30, 0, 2, 6), datetime.datetime(2026, 5, 30, 0, 2, 6), 'salt', 8.43, 76.18, None, 20.11, 25.81, 3.94, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:02:07.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:02:07.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:02:08.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:02:06, diff=2.003895s, valid=True
2026-05-30T00:02:08.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:02:08.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:02:08.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:02:12, diff=-3.992822s, valid=True
2026-05-30T00:02:08.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:02:08.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:02:08.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:01:58, diff=10.015064s, valid=True
2026-05-30T00:02:08.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:02:08.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:02:08.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:02:08.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:02:08.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:02:08.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:02:08.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:02:12, diff=-3.981409s, valid=True
2026-05-30T00:02:08.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:02:08.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:02:08.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:02:08.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024770.019382s, valid=True
2026-05-30T00:02:08.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:02:08.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:02:08.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:02:08.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:02:08.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:02:08.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:02:08.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:02:08.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:02:08.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:02:08.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:02:08.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:02:08.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:02:08.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:02:08.345 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:02:08.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:02:08.954 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:02:09.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:02: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-05-30T00:02: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-05-30T00:02:09.826 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:02:09.826 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:02:39.856 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:02:39.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:02:39.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:02:40.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:02:40.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:02:40.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:02:40.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T00:02:40.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:02:40.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-05-30T00:02:40.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:02:40.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:02:40.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:02:40.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-05-30T00:02:42.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-05-30T00:02:42.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:02:42.835 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:02:42.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:02:42.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:02:42.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:02:42.857 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:02:42.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:02:42.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:02:42.858 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:02:42.858 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:02:42.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:02:42.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:02:42.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:02:43.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:02:43.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:02:43.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T00:02:43.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:02:43.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T00:02:43.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:02:43.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:02:43.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:02:43.106 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:02:43.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:02:36
2026-05-30T00:02:43.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73214, datetime.datetime(2026, 5, 30, 0, 2, 36), datetime.datetime(2026, 5, 30, 0, 2, 36), 'salt', 8.4, 76.18, None, 21.38, 23.04, 3.94, 832.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:02:43.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:02:43.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:02:43.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:02:36, diff=7.172438s, valid=True
2026-05-30T00:02:43.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:02:43.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T00:02:43.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:03:12, diff=-28.824745s, valid=True
2026-05-30T00:02:43.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:02:43.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:02:43.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:02:29, diff=14.181875s, valid=True
2026-05-30T00:02:43.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:02:43.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:02:43.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:02:43.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:02:43.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:02:43.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T00:02:43.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:03:12, diff=-28.815109s, valid=True
2026-05-30T00:02:43.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:02:43.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:02:43.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:02:43.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024805.185543s, valid=True
2026-05-30T00:02:43.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:02:43.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:02:43.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:02:43.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:02:43.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:02:43.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:02:43.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:02:43.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:02:43.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:02:43.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:02:43.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:02:43.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:02:43.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:02:43.501 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:02:43.788 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:02:44.132 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:02:44.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:02:44.234 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:02:44.234 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:02:44.539 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:02:44.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:03:14.569 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:03:14.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:03:14.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:03:14.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:03:14.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:03:15.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:03:15.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-05-30T00:03:15.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:03:15.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-05-30T00:03:15.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:03:15.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:03:15.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:03:15.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-05-30T00:03:35.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-05-30T00:03:35.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:03:35.528 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:03:35.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:03:35.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:03:35.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:03:35.550 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:03:35.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:03:35.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:03:35.550 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:03:35.550 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:03:35.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:03:35.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T00:03:35.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:03:35.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T00:03:35.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:03:35.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:03:35.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:03:35.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:03:35.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:03:35.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:03:35.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:03:35.804 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:03:35.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:03:07
2026-05-30T00:03:35.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73215, datetime.datetime(2026, 5, 30, 0, 3, 7), datetime.datetime(2026, 5, 30, 0, 3, 6), 'salt', 8.4, 76.08, None, 18.1, 22.38, 3.96, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:03:35.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:03:35.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T00:03:35.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:03:06, diff=29.871231s, valid=True
2026-05-30T00:03:35.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:03:35.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:03:35.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:03:12, diff=23.874586s, valid=True
2026-05-30T00:03:35.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:03:35.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T00:03:35.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:03:01, diff=34.882609s, valid=True
2026-05-30T00:03:35.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:03:35.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:03:35.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:03:35.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:03:35.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:03:35.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:03:35.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:03:12, diff=23.88598s, valid=True
2026-05-30T00:03:35.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:03:35.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:03:35.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:03:35.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024857.886658s, valid=True
2026-05-30T00:03:35.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:03:35.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:03:35.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:03:35.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:03:35.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:03:35.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:03:35.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:03:35.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:03:35.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:03:36.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:03:36.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:03:36.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:03:36.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:03:36.214 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:03:36.437 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:03:36.806 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:03:36.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:03:36.906 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:03:36.906 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:03:37.103 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:03:37.103 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:04:07.133 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:04:07.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:04:07.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:04:07.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:04:07.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:04:07.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:04:07.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-05-30T00:04:07.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:04:07.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-05-30T00:04:07.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:04:07.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:04:07.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:04:07.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-05-30T00:04:10.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-05-30T00:04:10.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:04:10.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:04:10.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:04:10.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:04:10.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:04:10.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:04:10.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:04:10.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:04:10.846 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:04:10.846 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:04:10.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:04:10.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:04:10.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:04:11.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:04:11.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:04:11.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:04:11.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:04:11.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:04:11.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:04:11.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:04:11.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:04:11.130 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:04:11.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:04:07
2026-05-30T00:04:11.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73217, datetime.datetime(2026, 5, 30, 0, 4, 7), datetime.datetime(2026, 5, 30, 0, 4, 7), 'salt', 8.36, 76.08, None, 18.31, 16.09, 3.96, 832.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:04:11.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:04:11.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:04:11.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:04:07, diff=4.198019s, valid=True
2026-05-30T00:04:11.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:04:11.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:04:11.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:04:12, diff=-0.799141s, valid=True
2026-05-30T00:04:11.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:04:11.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:04:11.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:04:04, diff=7.207498s, valid=True
2026-05-30T00:04:11.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:04:11.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:04:11.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:04:11.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:04:11.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:04:11.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:04:11.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:04:12, diff=-0.789487s, valid=True
2026-05-30T00:04:11.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:04:11.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:04:11.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:04:11.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024893.211179s, valid=True
2026-05-30T00:04:11.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:04:11.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:04:11.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:04:11.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:04:11.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:04:11.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:04:11.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:04:11.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:04:11.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:04:11.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:04:11.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:04:11.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:04:11.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:04:11.608 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:04:11.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:04:12.188 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:04:12.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:04:12.293 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:04:12.293 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:04:12.484 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:04:12.484 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:04:42.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:04:42.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:04:42.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:04:42.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:04:42.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:04:42.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:04:42.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-05-30T00:04:42.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:04:42.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-05-30T00:04:42.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:04:42.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:04:42.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:04:42.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-05-30T00:04:45.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-05-30T00:04:45.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:04:45.655 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:04:45.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:04:45.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:04:45.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:04:45.677 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:04:45.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:04:45.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:04:45.677 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:04:45.677 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:04:45.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:04:45.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:04:45.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:04:45.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:04:45.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:04:45.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T00:04:45.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:04:45.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T00:04:45.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:04:45.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:04:45.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:04:45.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:04:45.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:04:37
2026-05-30T00:04:45.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73218, datetime.datetime(2026, 5, 30, 0, 4, 37), datetime.datetime(2026, 5, 30, 0, 4, 37), 'salt', 8.46, 76.15, None, 17.71, 22.54, 3.95, 832.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:04:45.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:04:45.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:04:46.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:04:37, diff=9.000885s, valid=True
2026-05-30T00:04:46.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:04:46.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T00:04:46.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:05:12, diff=-25.9963s, valid=True
2026-05-30T00:04:46.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:04:46.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:04:46.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:04:35, diff=11.010382s, valid=True
2026-05-30T00:04:46.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:04:46.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:04:46.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:04:46.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:04:46.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:04:46.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T00:04:46.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:05:12, diff=-25.986632s, valid=True
2026-05-30T00:04:46.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:04:46.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:04:46.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:04:46.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1024928.01403s, valid=True
2026-05-30T00:04:46.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:04:46.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:04:46.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:04:46.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:04:46.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:04:46.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:04:46.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:04:46.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:04:46.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:04:46.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:04:46.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:04:46.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:04:46.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:04:46.333 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:04:46.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:04:46.898 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:04:47.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:04:47.001 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:04: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-05-30T00:04:47.191 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:04:47.191 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:05:17.220 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:05:17.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:05:17.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:05:17.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:05:17.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:05:17.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:05:17.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-05-30T00:05:17.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:05:17.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-05-30T00:05:17.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:05:17.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:05:17.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:05:17.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-05-30T00:06:12.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-05-30T00:06:12.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:06:12.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:06:12.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:06:12.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:06:12.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:06:12.958 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:06:12.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:06:12.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:06:12.958 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:06:12.958 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:06:12.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:06:13.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:06:13.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:06:13.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:06:13.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:06:13.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:06:13.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:06:13.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:06:13.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:06:13.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:06:13.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:06:13.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:06:13.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:06:08
2026-05-30T00:06:13.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73221, datetime.datetime(2026, 5, 30, 0, 6, 8), datetime.datetime(2026, 5, 30, 0, 6, 7), 'salt', 8.4, 75.92, None, 18.74, 20.03, 3.99, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:06:13.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:06:13.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:06:13.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:06:07, diff=6.291281s, valid=True
2026-05-30T00:06:13.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:06:13.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:06:13.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:06:12, diff=1.294115s, valid=True
2026-05-30T00:06:13.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:06:13.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:06:13.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:05:59, diff=14.301777s, valid=True
2026-05-30T00:06:13.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:06:13.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:06:13.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:06:13.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:06:13.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:06:13.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:06:13.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:06:12, diff=1.305283s, valid=True
2026-05-30T00:06:13.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:06:13.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:06:13.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:06:13.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025015.305978s, valid=True
2026-05-30T00:06:13.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:06:13.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:06:13.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:06:13.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:06:13.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:06:13.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:06:13.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:06:13.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:06:13.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:06:13.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:06:13.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:06:13.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:06:13.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:06:13.690 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:06:13.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:06:14.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:06:14.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:06:14.349 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:06:14.349 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:06:14.618 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:06:14.618 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:06:44.648 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:06:44.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:06:44.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:06:45.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:06:45.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:06:45.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:06:45.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-05-30T00:06:45.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:06:45.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-05-30T00:06:45.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:06:45.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:06:45.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:06:45.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T00:06:48.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-05-30T00:06:48.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:06:48.064 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:06:48.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:06:48.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:06:48.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:06:48.099 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:06:48.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:06:48.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:06:48.100 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:06:48.100 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:06:48.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:06:48.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:06:48.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:06:48.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:06:48.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:06:48.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T00:06:48.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:06:48.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T00:06:48.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:06:48.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:06:48.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:06:48.427 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:06:48.488 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:06:38
2026-05-30T00:06:48.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73222, datetime.datetime(2026, 5, 30, 0, 6, 38), datetime.datetime(2026, 5, 30, 0, 6, 38), 'salt', 8.53, 76.02, None, 17.61, 23.83, 3.98, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:06:48.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:06:48.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:06:48.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:06:38, diff=10.496297s, valid=True
2026-05-30T00:06:48.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:06:48.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T00:06:48.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:07:12, diff=-23.500214s, valid=True
2026-05-30T00:06:48.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:06:48.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:06:48.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:06:31, diff=17.508088s, valid=True
2026-05-30T00:06:48.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:06:48.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:06:48.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:06:48.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:06:48.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:06:48.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T00:06:48.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:07:12, diff=-23.488143s, valid=True
2026-05-30T00:06:48.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:06:48.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:06:48.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:06:48.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025050.512681s, valid=True
2026-05-30T00:06:48.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:06:48.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:06:48.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:06:48.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:06:48.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:06:48.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:06:48.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:06:48.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:06:48.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:06:48.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:06:48.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:06:48.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:06:48.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:06:48.834 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:06:49.047 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:06:49.395 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:06:49.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:06:49.496 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:06:49.496 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:06:49.693 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:06:49.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:07:19.724 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:07:19.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:07:19.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:07:20.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:07:20.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:07:20.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:07:20.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-05-30T00:07:20.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:07:20.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-05-30T00:07:20.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:07:20.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:07:20.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:07:20.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-05-30T00:07:22.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-05-30T00:07:22.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:07:22.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:07:22.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:07:22.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:07:22.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:07:22.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:07:22.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:07:22.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:07:22.928 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:07:22.929 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:07:22.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:07:23.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:07:23.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:07:23.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:07:23.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:07:23.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:07:23.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:07:23.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:07:23.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:07:23.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:07:23.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:07:23.209 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:07:23.273 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:07:09
2026-05-30T00:07:23.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73223, datetime.datetime(2026, 5, 30, 0, 7, 9), datetime.datetime(2026, 5, 30, 0, 7, 8), 'salt', 8.5, 76.08, None, 15.74, 17.78, 3.97, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:07:23.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:07:23.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:07:23.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:07:08, diff=15.279139s, valid=True
2026-05-30T00:07:23.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:07:23.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:07:23.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:07:12, diff=11.281912s, valid=True
2026-05-30T00:07:23.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:07:23.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:07:23.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:07:02, diff=21.288538s, valid=True
2026-05-30T00:07:23.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:07:23.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:07:23.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:07:23.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:07:23.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:07:23.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:07:23.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:07:12, diff=11.291513s, valid=True
2026-05-30T00:07:23.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:07:23.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:07:23.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:07:23.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025085.292178s, valid=True
2026-05-30T00:07:23.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:07:23.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:07:23.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:07:23.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:07:23.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:07:23.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:07:23.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:07:23.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:07:23.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:07:23.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:07:23.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:07:23.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:07:23.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:07:23.612 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:07:23.825 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:07:24.170 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:07:24.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:07:24.270 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:07:24.270 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:07:24.461 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:07:24.461 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:07:54.462 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:07:54.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:07:54.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:07:54.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:07:54.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:07:54.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:07:54.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-05-30T00:07:54.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:07:54.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-05-30T00:07:54.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:07:54.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:07:54.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:07:54.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-05-30T00:07:58.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-05-30T00:07:58.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:07:58.218 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:07:58.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:07:58.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:07:58.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:07:58.240 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:07:58.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:07:58.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:07:58.240 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:07:58.240 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:07:58.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:07:58.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:07:58.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:07:58.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:07:58.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:07:58.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T00:07:58.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:07:58.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T00:07:58.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:07:58.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:07:58.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:07:58.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:07:58.609 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:07:39
2026-05-30T00:07:58.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73224, datetime.datetime(2026, 5, 30, 0, 7, 39), datetime.datetime(2026, 5, 30, 0, 7, 38), 'salt', 8.4, 75.98, None, 15.63, 21.46, 3.98, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:07:58.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:07:58.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:07:58.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:07:38, diff=20.616465s, valid=True
2026-05-30T00:07:58.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:07:58.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T00:07:58.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:08:12, diff=-13.380681s, valid=True
2026-05-30T00:07:58.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:07:58.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:07:58.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:07:33, diff=25.626016s, valid=True
2026-05-30T00:07:58.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:07:58.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:07:58.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:07:58.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:07:58.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:07:58.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T00:07:58.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:08:12, diff=-13.370927s, valid=True
2026-05-30T00:07:58.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:07:58.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:07:58.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:07:58.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025120.629755s, valid=True
2026-05-30T00:07:58.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:07:58.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:07:58.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:07:58.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:07:58.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:07:58.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:07:58.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:07:58.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:07:58.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:07:58.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:07:58.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:07:58.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:07:58.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:07:58.948 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:07:59.162 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:07:59.568 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:07:59.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:07:59.668 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:07:59.668 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:07:59.884 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:07:59.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:08:29.914 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:08:29.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:08:29.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:08:30.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:08:30.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:08:30.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:08:30.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-05-30T00:08:30.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:08:30.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-05-30T00:08:30.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:08:30.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:08:30.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:08:30.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-05-30T00:09:30.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-05-30T00:09:30.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:09:30.839 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:09:30.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:09:30.848 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:09:30.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:09:30.866 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:09:30.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:09:30.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:09:30.867 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:09:30.867 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:09:30.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:09:30.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:09:30.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:09:31.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:09:31.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:09:31.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T00:09:31.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:09:31.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T00:09:31.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:09:31.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:09:31.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:09:31.129 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:09:31.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:09:09
2026-05-30T00:09:31.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73227, datetime.datetime(2026, 5, 30, 0, 9, 9), datetime.datetime(2026, 5, 30, 0, 9, 9), 'salt', 8.4, 76.15, None, 16.62, 15.9, 3.95, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:09:31.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:09:31.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:09:31.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:09:09, diff=22.198001s, valid=True
2026-05-30T00:09:31.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:09:31.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T00:09:31.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:09:12, diff=19.200874s, valid=True
2026-05-30T00:09:31.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:09:31.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:09:31.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:09:08, diff=23.207595s, valid=True
2026-05-30T00:09:31.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:09:31.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:09:31.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:09:31.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:09:31.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:09:31.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T00:09:31.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:09:12, diff=19.210664s, valid=True
2026-05-30T00:09:31.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:09:31.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:09:31.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:09:31.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025213.211351s, valid=True
2026-05-30T00:09:31.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:09:31.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:09:31.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:09:31.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:09:31.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:09:31.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:09:31.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:09:31.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:09:31.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:09:31.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:09:31.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:09:31.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:09:31.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:09:31.532 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:09:31.751 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:09:32.157 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:09:32.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:09:32.259 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:09:32.259 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:09:32.442 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:09:32.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:10:02.462 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:10:02.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:10:02.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:10:02.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:10:02.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:10:03.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:10:03.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-05-30T00:10:03.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:10:03.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-05-30T00:10:03.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:10:03.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:10:03.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:10:03.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-05-30T00:10:05.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-05-30T00:10:05.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:10:05.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:10:05.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:10:05.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:10:05.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:10:05.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:10:05.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:10:05.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:10:05.795 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:10:05.795 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:10:05.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:10:05.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:10:05.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:10:05.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:10:05.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:10:06.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:10:06.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:10:06.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:10:06.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:10:06.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:10:06.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:10:06.072 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:10:06.142 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:09:40
2026-05-30T00:10:06.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73228, datetime.datetime(2026, 5, 30, 0, 9, 40), datetime.datetime(2026, 5, 30, 0, 9, 39), 'salt', 8.33, 76.15, None, 17.29, 18.95, 3.95, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:10:06.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:10:06.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:10:06.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:09:39, diff=27.148724s, valid=True
2026-05-30T00:10:06.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:10:06.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:10:06.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:10:12, diff=-5.848449s, valid=True
2026-05-30T00:10:06.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:10:06.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:10:06.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:09:39, diff=27.158144s, valid=True
2026-05-30T00:10:06.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:10:06.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:10:06.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:10:06.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:10:06.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:10:06.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:10:06.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:10:12, diff=-5.83883s, valid=True
2026-05-30T00:10:06.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:10:06.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:10:06.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:10:06.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025248.161831s, valid=True
2026-05-30T00:10:06.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:10:06.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:10:06.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:10:06.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:10:06.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:10:06.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:10:06.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:10:06.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:10:06.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:10:06.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:10:06.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:10:06.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:10:06.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:10:06.481 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:10:06.787 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:10:07.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:10:07.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:10:07.245 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:10:07.245 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:10:07.333 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:10:07.333 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:10:37.356 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:10:37.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:10:37.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:10:37.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:10:37.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:10:37.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:10:37.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-05-30T00:10:37.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:10:37.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-05-30T00:10:37.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:10:37.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:10:37.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:10:37.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-05-30T00:11:09.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-05-30T00:11:09.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:11:09.541 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:11:09.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:11:09.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:11:09.561 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:11:09.561 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:11:09.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:11:09.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:11:09.561 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:11:09.561 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:11:09.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:11:09.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:11:09.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:11:09.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:11:09.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:11:09.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:11:09.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:11:09.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:11:09.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:11:09.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:11:09.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:11:09.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:11:09.882 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:10:40
2026-05-30T00:11:09.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73230, datetime.datetime(2026, 5, 30, 0, 10, 40), datetime.datetime(2026, 5, 30, 0, 10, 40), 'salt', 8.4, 76.08, None, 18.49, 18.2, 3.96, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:11:09.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:11:09.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:11:09.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:10:40, diff=29.888538s, valid=True
2026-05-30T00:11:09.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:11:09.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:11:09.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:11:12, diff=-2.108413s, valid=True
2026-05-30T00:11:09.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:11:09.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:11:09.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:10:31, diff=38.898396s, valid=True
2026-05-30T00:11:09.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:11:09.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:11:09.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:11:09.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:11:09.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:11:09.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:11:09.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:11:12, diff=-2.098552s, valid=True
2026-05-30T00:11:09.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:11:09.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:11:09.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:11:09.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025311.902121s, valid=True
2026-05-30T00:11:09.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:11:09.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:11:09.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:11:09.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:11:09.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:11:09.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:11:09.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:11:09.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:11:09.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:11:10.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:11:10.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:11:10.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:11:10.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:11:10.234 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:11:10.450 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:11:10.801 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:11:10.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:11:10.901 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:11:10.901 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:11:11.085 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:11:11.086 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:11:41.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:11:41.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:11:41.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:11:41.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:11:41.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:11:41.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:11:41.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-05-30T00:11:41.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:11:41.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-05-30T00:11:41.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:11:41.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:11:42.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:11:42.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-05-30T00:11:47.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-05-30T00:11:47.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:11:47.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:11:47.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:11:47.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:11:47.614 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:11:47.614 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:11:47.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:11:47.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:11:47.614 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:11:47.615 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:11:47.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:11:47.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:11:47.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:11:47.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:11:47.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:11:47.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:11:47.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:11:47.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:11:47.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:11:47.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:11:47.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:11:47.902 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:11:47.966 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:11:40
2026-05-30T00:11:47.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73232, datetime.datetime(2026, 5, 30, 0, 11, 40), datetime.datetime(2026, 5, 30, 0, 11, 40), 'salt', 8.36, 76.05, None, 19.13, 18.13, 3.96, 832.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:11:47.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:11:47.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:11:47.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:11:40, diff=7.974395s, valid=True
2026-05-30T00:11:47.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:11:47.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:11:47.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:12:12, diff=-24.021993s, valid=True
2026-05-30T00:11:47.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:11:47.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:11:47.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:11:34, diff=13.985685s, valid=True
2026-05-30T00:11:47.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:11:47.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:11:47.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:11:47.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:11:47.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:11:47.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:11:47.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:12:12, diff=-24.010819s, valid=True
2026-05-30T00:11:47.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:11:47.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:11:47.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:11:47.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025349.98997s, valid=True
2026-05-30T00:11:47.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:11:47.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:11:47.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:11:47.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:11:47.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:11:48.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:11:48.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:11:48.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:11:48.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:11:48.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:11:48.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:11:48.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:11:48.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:11:48.398 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:11:48.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:11:48.972 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:11:49.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:11:49.077 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:11:49.077 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:11:49.267 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:11:49.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:12:19.298 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:12:19.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:12:19.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:12:19.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:12:19.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:12:19.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:12:19.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-05-30T00:12:19.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:12:19.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-05-30T00:12:19.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:12:19.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:12:19.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:12:19.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-05-30T00:12:50.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-05-30T00:12:51.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:12:51.398 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:12:51.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:12:51.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:12:51.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:12:51.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:12:51.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:12:51.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:12:51.422 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:12:51.422 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:12:51.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:12:51.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:12:51.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:12:51.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:12:51.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:12:51.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:12:51.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:12:51.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:12:51.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:12:51.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:12:51.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:12:51.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:12:51.751 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:12:41
2026-05-30T00:12:51.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73234, datetime.datetime(2026, 5, 30, 0, 12, 41), datetime.datetime(2026, 5, 30, 0, 12, 41), 'salt', 8.43, 75.98, None, 19.51, 19.37, 3.98, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:12:51.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:12:51.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:12:51.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:12:41, diff=10.757496s, valid=True
2026-05-30T00:12:51.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:12:51.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:12:51.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:13:12, diff=-20.23967s, valid=True
2026-05-30T00:12:51.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:12:51.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:12:51.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:12:37, diff=14.766986s, valid=True
2026-05-30T00:12:51.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:12:51.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:12:51.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:12:51.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:12:51.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:12:51.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:12:51.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:13:12, diff=-20.230007s, valid=True
2026-05-30T00:12:51.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:12:51.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:12:51.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:12:51.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025413.770647s, valid=True
2026-05-30T00:12:51.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:12:51.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:12:51.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:12:51.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:12:51.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:12:51.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:12:51.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:12:51.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:12:51.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:12:52.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:12:52.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:12:52.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:12:52.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:12:52.897 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:12:53.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:12:53.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:12:53.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:12:53.580 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:12:53.580 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:12:56.002 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:12:56.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:13:26.032 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:13:26.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:13:26.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:13:26.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:13:26.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:13:26.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:13:26.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-05-30T00:13:26.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:13:26.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-05-30T00:13:26.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:13:26.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:13:26.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:13:26.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-05-30T00:13:33.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-05-30T00:13:33.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:13:33.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:13:33.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:13:33.425 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:13:33.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:13:33.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:13:33.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:13:33.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:13:33.438 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:13:33.438 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:13:33.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:13:33.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:13:33.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:13:33.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:13:33.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:13:33.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:13:33.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:13:33.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:13:33.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:13:33.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:13:33.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:13:33.694 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:13:33.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:13:11
2026-05-30T00:13:33.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73235, datetime.datetime(2026, 5, 30, 0, 13, 11), datetime.datetime(2026, 5, 30, 0, 13, 11), 'salt', 8.33, 75.85, None, 19.02, 19.23, 4.0, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:13:33.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:13:33.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:13:33.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:13:11, diff=22.760598s, valid=True
2026-05-30T00:13:33.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:13:33.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:13:33.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:13:12, diff=21.763434s, valid=True
2026-05-30T00:13:33.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:13:33.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:13:33.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:13:08, diff=25.770076s, valid=True
2026-05-30T00:13:33.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:13:33.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:13:33.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:13:33.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:13:33.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:13:33.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:13:33.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:13:12, diff=21.773116s, valid=True
2026-05-30T00:13:33.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:13:33.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:13:33.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:13:33.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025455.773804s, valid=True
2026-05-30T00:13:33.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:13:33.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:13:33.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:13:33.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:13:33.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:13:33.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:13:33.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:13:33.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:13:33.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:13:33.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:13:34.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:13:34.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:13:34.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:13:34.168 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:13:34.388 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:13:34.741 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:13:34.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:13:34.843 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:13:34.843 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:13:35.032 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:13:35.032 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:14:05.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:14:05.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:14:05.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:14:05.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:14:05.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:14:05.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:14:05.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-05-30T00:14:05.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:14:05.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-05-30T00:14:05.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:14:05.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:14:05.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:14:05.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-05-30T00:14:33.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-05-30T00:14:33.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:14:33.652 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:14:33.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:14:33.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:14:33.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:14:33.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:14:33.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:14:33.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:14:33.675 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:14:33.675 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:14:33.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:14:33.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:14:33.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:14:33.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:14:33.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:14:33.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:14:33.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:14:33.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:14:33.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:14:33.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:14:33.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:14:33.949 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:14:34.010 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:14:12
2026-05-30T00:14:34.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73237, datetime.datetime(2026, 5, 30, 0, 14, 12), datetime.datetime(2026, 5, 30, 0, 14, 11), 'salt', 8.43, 75.88, None, 18.46, 19.35, 4.0, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:14:34.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:14:34.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:14:34.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:14:11, diff=23.018147s, valid=True
2026-05-30T00:14:34.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:14:34.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:14:34.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:14:12, diff=22.02184s, valid=True
2026-05-30T00:14:34.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:14:34.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:14:34.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:14:11, diff=23.032402s, valid=True
2026-05-30T00:14:34.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:14:34.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:14:34.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:14:34.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:14:34.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:14:34.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:14:34.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:14:12, diff=22.036463s, valid=True
2026-05-30T00:14:34.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:14:34.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:14:34.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:14:34.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025516.037428s, valid=True
2026-05-30T00:14:34.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:14:34.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:14:34.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:14:34.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:14:34.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:14:34.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:14:34.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:14:34.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:14:34.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:14:34.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:14:34.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:14:34.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:14:34.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:14:34.421 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:14:34.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:14:35.067 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:14:35.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:14:35.183 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:14:35.183 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:14:35.436 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:14:35.436 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:15:05.449 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:15:05.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:15:05.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:15:05.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:15:05.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:15:05.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:15:05.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-05-30T00:15:05.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:15:05.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-05-30T00:15:05.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:15:05.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:15:05.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:15:05.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-05-30T00:15:08.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-05-30T00:15:08.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:15:08.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:15:08.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:15:08.444 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:15:08.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:15:08.457 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:15:08.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:15:08.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:15:08.458 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:15:08.459 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:15:08.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:15:08.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:15:08.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:15:08.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:15:08.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:15:08.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:15:08.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:15:08.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:15:08.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:15:08.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:15:08.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:15:08.778 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:15:08.837 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:14:42
2026-05-30T00:15:08.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73238, datetime.datetime(2026, 5, 30, 0, 14, 42), datetime.datetime(2026, 5, 30, 0, 14, 42), 'salt', 8.36, 75.88, None, 17.71, 15.34, 3.99, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:15:08.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:15:08.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:15:08.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:14:42, diff=26.843583s, valid=True
2026-05-30T00:15:08.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:15:08.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:15:08.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:15:12, diff=-3.153648s, valid=True
2026-05-30T00:15:08.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:15:08.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:15:08.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:14:33, diff=35.852972s, valid=True
2026-05-30T00:15:08.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:15:08.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:15:08.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:15:08.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:15:08.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:15:08.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:15:08.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:15:12, diff=-3.142426s, valid=True
2026-05-30T00:15:08.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:15:08.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:15:08.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:15:08.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025550.858528s, valid=True
2026-05-30T00:15:08.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:15:08.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:15:08.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:15:08.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:15:08.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:15:08.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:15:08.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:15:08.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:15:09.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:15:09.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:15:09.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:15:09.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:15:09.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:15:09.258 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:15:09.480 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:15:09.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:15:09.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:15:09.944 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:15:09.944 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:15:10.135 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:15:10.135 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:15:40.165 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:15:40.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:15:40.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:15:40.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:15:40.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:15:40.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:15:40.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-05-30T00:15:40.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:15:40.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-05-30T00:15:40.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:15:40.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:15:40.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:15:40.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-05-30T00:15:43.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-05-30T00:15:43.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:15:43.952 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:15:43.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:15:43.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:15:43.972 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:15:43.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:15:43.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:15:43.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:15:43.980 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:15:43.980 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:15:43.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:15:44.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-30T00:15:44.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:15:44.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-30T00:15:44.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:15:44.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T00:15:44.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:15:44.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T00:15:44.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:15:44.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:15:44.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:15:44.245 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:15:44.304 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:15:42
2026-05-30T00:15:44.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73240, datetime.datetime(2026, 5, 30, 0, 15, 42), datetime.datetime(2026, 5, 30, 0, 15, 42), 'salt', 8.27, 75.72, None, 17.75, 15.24, 4.03, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:15:44.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:15:44.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-30T00:15:44.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:15:42, diff=2.31119s, valid=True
2026-05-30T00:15:44.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:15:44.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T00:15:44.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:16:12, diff=-27.685969s, valid=True
2026-05-30T00:15:44.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:15:44.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-30T00:15:44.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:15:35, diff=9.32064s, valid=True
2026-05-30T00:15:44.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:15:44.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:15:44.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:15:44.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:15:44.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:15:44.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T00:15:44.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:16:12, diff=-27.676347s, valid=True
2026-05-30T00:15:44.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:15:44.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:15:44.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:15:44.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025586.324303s, valid=True
2026-05-30T00:15:44.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:15:44.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:15:44.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:15:44.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:15:44.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:15:44.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:15:44.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:15:44.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:15:44.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:15:44.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:15:44.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:15:44.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:15:44.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:15:44.681 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:15:44.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:15:45.284 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:15:45.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:15:45.386 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:15:45.386 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:15:45.618 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:15:45.618 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:16:15.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:16:15.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:16:15.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:16:16.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:16:16.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:16:16.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:16:16.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-05-30T00:16:16.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:16:16.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-05-30T00:16:16.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:16:16.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:16:16.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:16:16.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-05-30T00:16:19.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T00:16:19.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:16:19.111 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:16:19.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:16:19.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:16:19.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:16:19.132 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:16:19.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:16:19.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:16:19.133 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:16:19.133 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:16:19.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:16:19.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:16:19.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:16:19.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:16:19.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:16:19.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:16:19.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:16:19.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:16:19.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:16:19.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:16:19.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:16:19.389 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:16:19.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:16:13
2026-05-30T00:16:19.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73241, datetime.datetime(2026, 5, 30, 0, 16, 13), datetime.datetime(2026, 5, 30, 0, 16, 12), 'salt', 8.3, 75.69, None, 17.43, 18.79, 4.03, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:16:19.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:16:19.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:16:19.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:16:12, diff=7.457266s, valid=True
2026-05-30T00:16:19.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:16:19.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:16:19.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:16:12, diff=7.46009s, valid=True
2026-05-30T00:16:19.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:16:19.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:16:19.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:16:07, diff=12.466913s, valid=True
2026-05-30T00:16:19.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:16:19.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:16:19.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:16:19.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:16:19.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:16:19.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:16:19.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:16:12, diff=7.469939s, valid=True
2026-05-30T00:16:19.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:16:19.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:16:19.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:16:19.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025621.470595s, valid=True
2026-05-30T00:16:19.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:16:19.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:16:19.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:16:19.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:16:19.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:16:19.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:16:19.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:16:19.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:16:19.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:16:19.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:16:19.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:16:19.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:16:19.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:16:19.785 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:16:20.016 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:16:20.373 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:16:20.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:16:20.472 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:16:20.473 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:16:21.028 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:16:21.028 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:16:51.030 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:16:51.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:16:51.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:16:51.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:16:51.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:16:51.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:16:51.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-05-30T00:16:51.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:16:51.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-05-30T00:16:51.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:16:51.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:16:51.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:16:51.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-05-30T00:16:55.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-05-30T00:16:55.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:16:55.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:16:55.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:16:55.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:16:55.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:16:55.743 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:16:55.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:16:55.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:16:55.744 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:16:55.744 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:16:55.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:16:55.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:16:55.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:16:55.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:16:55.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:16:55.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:16:55.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:16:56.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:16:56.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:16:56.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:16:56.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:16:56.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:16:56.076 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:16:43
2026-05-30T00:16:56.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73242, datetime.datetime(2026, 5, 30, 0, 16, 43), datetime.datetime(2026, 5, 30, 0, 16, 42), 'salt', 8.37, 75.75, None, 18.35, 15.64, 4.03, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:16:56.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:16:56.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:16:56.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:16:42, diff=14.082485s, valid=True
2026-05-30T00:16:56.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:16:56.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:16:56.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:17:12, diff=-15.914717s, valid=True
2026-05-30T00:16:56.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:16:56.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:16:56.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:16:38, diff=18.092011s, valid=True
2026-05-30T00:16:56.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:16:56.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:16:56.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:16:56.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:16:56.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:16:56.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:16:56.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:17:12, diff=-15.904995s, valid=True
2026-05-30T00:16:56.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:16:56.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:16:56.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:16:56.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025658.09568s, valid=True
2026-05-30T00:16:56.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:16:56.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:16:56.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:16:56.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:16:56.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:16:56.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:16:56.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:16:56.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:16:56.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:16:56.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:16:56.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:16:56.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:16:56.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:16:56.416 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:16:56.632 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:16:57.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:16:57.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:16:57.139 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:16:57.139 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:16:57.326 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:16:57.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:17:27.356 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:17:27.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:17:27.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:17:27.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:17:27.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:17:27.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:17:27.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-05-30T00:17:27.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:17:27.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-05-30T00:17:27.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:17:27.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:17:27.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:17:27.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-05-30T00:17: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-05-30T00:17:30.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:17:30.696 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:17:30.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:17:30.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:17:30.717 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:17:30.717 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:17:30.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:17:30.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:17:30.718 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:17:30.718 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:17:30.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:17:30.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:17:30.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:17:30.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:17:30.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:17:30.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:17:30.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:17:30.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:17:30.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:17:30.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:17:30.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:17:30.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:17:31.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:17:13
2026-05-30T00:17:31.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73243, datetime.datetime(2026, 5, 30, 0, 17, 13), datetime.datetime(2026, 5, 30, 0, 17, 13), 'salt', 8.37, 75.82, None, 17.54, 13.34, 4.01, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:17:31.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:17:31.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:17:31.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:17:13, diff=18.057008s, valid=True
2026-05-30T00:17:31.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:17:31.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:17:31.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:17:12, diff=19.059867s, valid=True
2026-05-30T00:17:31.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:17:31.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:17:31.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:17:10, diff=21.066593s, valid=True
2026-05-30T00:17:31.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:17:31.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:17:31.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:17:31.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:17:31.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:17:31.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:17:31.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:17:12, diff=19.069615s, valid=True
2026-05-30T00:17:31.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:17:31.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:17:31.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:17:31.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025693.070278s, valid=True
2026-05-30T00:17:31.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:17:31.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:17:31.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:17:31.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:17:31.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:17:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:17:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:17:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:17:31.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:17:31.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:17:31.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:17:31.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:17:31.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:17:31.389 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:17:31.632 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:17:31.999 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:17:32.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:17:32.103 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:17:32.103 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:17:32.292 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:17:32.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:18:02.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:18:02.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:18:02.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:18:02.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:18:02.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:18:02.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:18:02.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-05-30T00:18:02.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:18:02.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-05-30T00:18:02.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:18:02.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:18:02.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:18:02.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-05-30T00:18:05.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-05-30T00:18:05.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:18:05.566 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:18:05.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:18:05.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:18:05.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:18:05.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:18:05.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:18:05.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:18:05.589 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:18:05.589 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:18:05.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:18:05.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:18:05.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:18:05.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:18:05.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:18:05.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:18:05.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:18:05.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:18:05.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:18:05.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:18:05.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:18:05.855 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:18:05.919 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:17:43
2026-05-30T00:18:05.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73244, datetime.datetime(2026, 5, 30, 0, 17, 43), datetime.datetime(2026, 5, 30, 0, 17, 43), 'salt', 8.37, 75.75, None, 18.28, 15.05, 4.03, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:18:05.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:18:05.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:18:05.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:17:43, diff=22.925785s, valid=True
2026-05-30T00:18:05.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:18:05.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:18:05.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:18:12, diff=-6.071423s, valid=True
2026-05-30T00:18:05.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:18:05.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:18:05.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:17:41, diff=24.935257s, valid=True
2026-05-30T00:18:05.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:18:05.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:18:05.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:18:05.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:18:05.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:18:05.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:18:05.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:18:12, diff=-6.061758s, valid=True
2026-05-30T00:18:05.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:18:05.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:18:05.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:18:05.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025727.938904s, valid=True
2026-05-30T00:18:05.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:18:05.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:18:05.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:18:05.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:18:05.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:18:05.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:18:05.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:18:05.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:18:06.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:18:06.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:18:06.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:18:06.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:18:06.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:18:06.258 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:18:06.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:18:06.900 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:18:07.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:18:07.001 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:18:07.001 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:18:07.280 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:18:07.280 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:18:37.311 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:18:37.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:18:37.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:18:37.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:18:37.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:18:37.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:18:37.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-05-30T00:18:37.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:18:37.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-05-30T00:18:37.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:18:37.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:18:37.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:18:37.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T00:18:40.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-05-30T00:18:40.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:18:40.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:18:40.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:18:40.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:18:40.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:18:40.457 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:18:40.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:18:40.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:18:40.458 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:18:40.458 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:18:40.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:18:40.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:18:40.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:18:40.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:18:40.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:18:40.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:18:40.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:18:40.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:18:40.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:18:40.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:18:40.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:18:40.732 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:18:40.795 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:18:13
2026-05-30T00:18:40.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73245, datetime.datetime(2026, 5, 30, 0, 18, 13), datetime.datetime(2026, 5, 30, 0, 18, 13), 'salt', 8.37, 75.85, None, 18.14, 14.09, 4.01, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:18:40.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:18:40.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:18:40.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:18:13, diff=27.801959s, valid=True
2026-05-30T00:18:40.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:18:40.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:18:40.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:18:12, diff=28.804802s, valid=True
2026-05-30T00:18:40.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:18:40.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:18:40.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:18:12, diff=28.81149s, valid=True
2026-05-30T00:18:40.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:18:40.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:18:40.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:18:40.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:18:40.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:18:40.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:18:40.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:18:12, diff=28.814548s, valid=True
2026-05-30T00:18:40.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:18:40.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:18:40.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:18:40.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025762.815223s, valid=True
2026-05-30T00:18:40.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:18:40.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:18:40.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:18:40.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:18:40.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:18:40.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:18:40.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:18:40.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:18:40.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:18:40.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:18:41.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:18:41.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:18:41.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:18:41.131 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:18:41.345 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:18:41.691 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:18:41.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:18:41.790 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:18:41.791 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:18:42.051 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:18:42.051 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:19:12.081 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:19:12.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:19:12.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:19:12.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:19:12.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:19:12.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:19:12.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-05-30T00:19:12.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:19:12.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-05-30T00:19:12.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:19:12.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:19:12.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:19:12.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-05-30T00:19:16.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-05-30T00:19:16.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:19:16.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:19:16.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:19:16.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:19:16.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:19:16.485 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:19:16.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:19:16.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:19:16.486 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:19:16.486 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:19:16.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:19:16.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-30T00:19:16.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:19:16.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-30T00:19:16.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:19:16.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:19:16.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:19:16.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:19:16.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:19:16.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:19:16.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:19:16.761 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:19:16.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:19:14
2026-05-30T00:19:16.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73247, datetime.datetime(2026, 5, 30, 0, 19, 14), datetime.datetime(2026, 5, 30, 0, 19, 13), 'salt', 8.27, 75.92, None, 19.3, 14.23, 3.99, 832.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:19:16.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:19:16.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-30T00:19:16.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:19:13, diff=3.830716s, valid=True
2026-05-30T00:19:16.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:19:16.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:19:16.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:19:12, diff=4.833532s, valid=True
2026-05-30T00:19:16.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:19:16.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-30T00:19:16.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:19:06, diff=10.840254s, valid=True
2026-05-30T00:19:16.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:19:16.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:19:16.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:19:16.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:19:16.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:19:16.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:19:16.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:19:12, diff=4.843316s, valid=True
2026-05-30T00:19:16.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:19:16.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:19:16.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:19:16.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025798.843995s, valid=True
2026-05-30T00:19:16.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:19:16.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:19:16.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:19:16.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:19:16.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:19:16.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:19:16.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:19:16.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:19:16.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:19:16.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:19:17.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:19:17.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:19:17.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:19:17.167 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:19:17.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:19:17.797 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:19:17.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:19:17.903 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:19:17.903 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:19:18.090 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:19:18.090 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:19:48.120 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:19:48.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:19:48.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:19:48.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:19:48.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:19:48.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:19:48.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-05-30T00:19:48.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:19:48.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-05-30T00:19:48.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:19:48.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:19:48.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:19:48.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-05-30T00:19:51.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-05-30T00:19:51.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:19:51.193 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:19:51.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:19:51.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:19:51.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:19:51.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:19:51.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:19:51.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:19:51.212 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:19:51.212 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:19:51.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:19:51.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:19:51.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:19:51.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:19:51.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:19:51.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:19:51.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:19:51.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:19:51.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:19:51.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:19:51.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:19:51.482 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:19:51.544 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:19:44
2026-05-30T00:19:51.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73248, datetime.datetime(2026, 5, 30, 0, 19, 44), datetime.datetime(2026, 5, 30, 0, 19, 44), 'salt', 8.3, 75.92, None, 18.63, 8.11, 3.99, 832.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:19:51.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:19:51.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:19:51.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:19:44, diff=7.551068s, valid=True
2026-05-30T00:19:51.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:19:51.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:19:51.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:20:12, diff=-20.446053s, valid=True
2026-05-30T00:19:51.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:19:51.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:19:51.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:19:36, diff=15.560734s, valid=True
2026-05-30T00:19:51.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:19:51.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:19:51.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:19:51.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:19:51.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:19:51.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:19:51.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:20:12, diff=-20.436217s, valid=True
2026-05-30T00:19:51.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:19:51.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:19:51.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:19:51.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025833.564443s, valid=True
2026-05-30T00:19:51.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:19:51.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:19:51.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:19:51.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:19:51.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:19:51.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:19:51.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:19:51.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:19:51.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:19:51.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:19:51.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:19:51.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:19:51.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:19:51.884 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:19:52.099 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:19:52.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:19:52.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:19:52.549 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:19:52.549 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:19:52.741 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:19:52.741 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:20:22.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:20:22.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:20:22.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:20:23.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:20:23.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:20:23.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:20:23.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-05-30T00:20:23.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:20:23.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-05-30T00:20:23.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:20:23.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:20:23.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:20:23.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-05-30T00:20:59.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-05-30T00:20:59.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:20:59.311 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:20:59.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:20:59.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:20:59.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:20:59.332 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:20:59.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:20:59.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:20:59.332 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:20:59.332 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:20:59.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:20:59.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:20:59.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:20:59.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:20:59.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:20:59.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:20:59.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:20:59.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:20:59.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:20:59.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:20:59.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:20:59.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:20:59.655 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:20:47
2026-05-30T00:20:59.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73250, datetime.datetime(2026, 5, 30, 0, 20, 47), datetime.datetime(2026, 5, 30, 0, 20, 45), 'salt', 8.27, 76.02, None, 18.03, 13.08, 3.97, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:20:59.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:20:59.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:20:59.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:20:45, diff=14.661489s, valid=True
2026-05-30T00:20:59.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:20:59.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:20:59.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:21:12, diff=-12.335664s, valid=True
2026-05-30T00:20:59.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:20:59.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:20:59.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:20:39, diff=20.671049s, valid=True
2026-05-30T00:20:59.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:20:59.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:20:59.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:20:59.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:20:59.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:20:59.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:20:59.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:21:12, diff=-12.32593s, valid=True
2026-05-30T00:20:59.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:20:59.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:20:59.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:20:59.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025901.674757s, valid=True
2026-05-30T00:20:59.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:20:59.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:20:59.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:20:59.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:20:59.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:20:59.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:20:59.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:20:59.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:20:59.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:20:59.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:20:59.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:20:59.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:21:00.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:21:00.084 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:21:00.300 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:21:00.647 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:21:00.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:21:00.747 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:21:00.747 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:21:00.935 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:21:00.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:21:30.947 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:21:30.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:21:30.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:21:31.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:21:31.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:21:31.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:21:31.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T00:21:31.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:21:31.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-05-30T00:21:31.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:21:31.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:21:31.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:21:31.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-05-30T00:21:35.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-05-30T00:21:35.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:21:35.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:21:35.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:21:35.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:21:35.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:21:35.228 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:21:35.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:21:35.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:21:35.229 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:21:35.229 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:21:35.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:21:35.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:21:35.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:21:35.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:21:35.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:21:35.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:21:35.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:21:35.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:21:35.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:21:35.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:21:35.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:21:35.494 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:21:35.554 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:21:18
2026-05-30T00:21:35.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73251, datetime.datetime(2026, 5, 30, 0, 21, 18), datetime.datetime(2026, 5, 30, 0, 21, 17), 'salt', 8.3, 76.12, None, 18.03, 13.41, 3.95, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:21:35.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:21:35.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:21:35.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:21:17, diff=18.560704s, valid=True
2026-05-30T00:21:35.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:21:35.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:21:35.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:21:12, diff=23.563504s, valid=True
2026-05-30T00:21:35.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:21:35.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:21:35.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:21:17, diff=18.570217s, valid=True
2026-05-30T00:21:35.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:21:35.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:21:35.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:21:35.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:21:35.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:21:35.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:21:35.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:21:12, diff=23.573262s, valid=True
2026-05-30T00:21:35.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:21:35.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:21:35.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:21:35.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025937.573988s, valid=True
2026-05-30T00:21:35.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:21:35.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:21:35.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:21:35.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:21:35.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:21:35.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:21:35.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:21:35.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:21:35.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:21:35.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:21:35.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:21:35.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:21:35.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:21:35.893 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:21:36.107 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:21:36.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:21:36.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:21:36.557 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:21:36.557 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:21:36.713 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:21:36.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:22:06.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:22:06.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:22:06.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:22:07.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:22:07.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:22:07.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:22:07.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-05-30T00:22:07.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:22:07.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-05-30T00:22:07.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:22:07.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:22:07.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:22:07.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T00:22:10.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-05-30T00:22:10.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:22:10.750 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:22:10.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:22:10.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:22:10.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:22:10.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:22:10.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:22:10.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:22:10.771 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:22:10.772 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:22:10.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:22:10.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:22:10.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:22:10.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:22:10.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:22:10.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:22:10.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:22:11.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:22:11.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:22:11.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:22:11.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:22:11.028 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:22:11.104 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:21:48
2026-05-30T00:22:11.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73252, datetime.datetime(2026, 5, 30, 0, 21, 48), datetime.datetime(2026, 5, 30, 0, 21, 47), 'salt', 8.23, 76.25, None, 18.24, 8.32, 3.92, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:22:11.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:22:11.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:22:11.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:21:47, diff=24.110861s, valid=True
2026-05-30T00:22:11.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:22:11.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:22:11.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:22:12, diff=-0.886362s, valid=True
2026-05-30T00:22:11.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:22:11.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:22:11.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:21:47, diff=24.120199s, valid=True
2026-05-30T00:22:11.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:22:11.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:22:11.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:22:11.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:22:11.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:22:11.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:22:11.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:22:12, diff=-0.876731s, valid=True
2026-05-30T00:22:11.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:22:11.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:22:11.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:22:11.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1025973.123932s, valid=True
2026-05-30T00:22:11.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:22:11.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:22:11.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:22:11.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:22:11.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:22:11.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:22:11.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:22:11.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:22:11.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:22:11.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:22:11.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:22:11.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:22:11.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:22:11.507 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:22:11.721 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:22:12.067 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:22:12.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:22:12.169 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:22:12.169 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:22:12.359 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:22:12.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:22:42.389 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:22:42.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:22:42.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:22:42.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:22:42.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:22:42.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:22:42.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-05-30T00:22:42.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:22:42.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-05-30T00:22:42.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:22:42.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:22:42.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:22: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-05-30T00:22:45.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-05-30T00:22:45.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:22:45.334 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:22:45.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:22:45.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:22:45.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:22:45.353 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:22:45.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:22:45.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:22:45.353 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:22:45.353 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:22:45.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:22:45.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:22:45.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:22:45.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:22:45.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:22:45.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:22:45.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:22:45.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:22:45.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:22:45.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:22:45.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:22:45.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:22:45.667 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:22:18
2026-05-30T00:22:45.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73253, datetime.datetime(2026, 5, 30, 0, 22, 18), datetime.datetime(2026, 5, 30, 0, 22, 18), 'salt', 8.23, 76.22, None, 17.89, 6.49, 3.93, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:22:45.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:22:45.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:22:45.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:22:18, diff=27.673758s, valid=True
2026-05-30T00:22:45.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:22:45.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:22:45.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:22:12, diff=33.676612s, valid=True
2026-05-30T00:22:45.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:22:45.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:22:45.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:22:17, diff=28.683412s, valid=True
2026-05-30T00:22:45.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:22:45.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:22:45.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:22:45.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:22:45.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:22:45.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:22:45.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:22:12, diff=33.686473s, valid=True
2026-05-30T00:22:45.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:22:45.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:22:45.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:22:45.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026007.687155s, valid=True
2026-05-30T00:22:45.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:22:45.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:22:45.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:22:45.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:22:45.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:22:45.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:22:45.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:22:45.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:22:45.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:22:45.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:22:45.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:22:45.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:22:45.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:22:46.031 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:22:46.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:22:46.590 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:22:46.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:22:46.692 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:22:46.692 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:22:46.881 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:22:46.881 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:23:16.894 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:23:16.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:23:16.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:23:17.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:23:17.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:23:17.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:23:17.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-05-30T00:23:17.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:23:17.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-05-30T00:23:17.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:23:17.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:23:17.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:23:17.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-05-30T00:23:20.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-05-30T00:23:20.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:23:20.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:23:20.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:23:20.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:23:20.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:23:20.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:23:20.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:23:20.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:23:20.158 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:23:20.158 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:23:20.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:23:20.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:23:20.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:23:20.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:23:20.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:23:20.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:23:20.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:23:20.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:23:20.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:23:20.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:23:20.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:23:20.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:23:20.485 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:22:49
2026-05-30T00:23:20.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73254, datetime.datetime(2026, 5, 30, 0, 22, 49), datetime.datetime(2026, 5, 30, 0, 22, 49), 'salt', 8.2, 76.42, None, 16.8, 14.09, 3.89, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:23:20.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:23:20.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:23:20.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:23:19, diff=1.491203s, valid=True
2026-05-30T00:23:20.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:23:20.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:23:20.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:23:12, diff=8.494007s, valid=True
2026-05-30T00:23:20.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:23:20.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:23:20.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:23:18, diff=2.500524s, valid=True
2026-05-30T00:23:20.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:23:20.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:23:20.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:23:20.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:23:20.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:23:20.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:23:20.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:23:12, diff=8.503508s, valid=True
2026-05-30T00:23:20.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:23:20.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:23:20.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:23:20.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026042.504164s, valid=True
2026-05-30T00:23:20.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:23:20.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:23:20.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:23:20.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:23:20.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:23:20.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:23:20.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:23:20.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:23:20.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:23:20.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:23:20.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:23:20.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:23:20.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:23:20.818 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:23:21.032 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:23:21.377 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:23:21.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:23:21.477 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:23:21.477 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:23:21.666 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:23:21.666 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:23:51.696 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:23:51.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:23:51.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:23:51.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:23:52.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:23:53.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:23:53.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T00:23:53.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:23:53.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-05-30T00:23:53.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:23:53.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:23:53.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:23:53.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-05-30T00:23:55.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-05-30T00:23:55.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:23:55.981 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:23:55.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:23:55.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:23:56.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:23:56.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:23:56.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:23:56.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:23:56.002 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:23:56.002 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:23:56.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:23:56.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:23:56.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:23:56.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:23:56.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:23:56.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:23:56.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:23:56.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:23:56.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:23:56.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:23:56.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:23:56.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:23:56.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:23:51
2026-05-30T00:23:56.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73256, datetime.datetime(2026, 5, 30, 0, 23, 51), datetime.datetime(2026, 5, 30, 0, 23, 51), 'salt', 8.23, 76.68, None, 15.28, 2.54, 3.84, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:23:56.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:23:56.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:23:56.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:23:51, diff=5.328476s, valid=True
2026-05-30T00:23:56.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:23:56.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:23:56.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:24:12, diff=-15.668707s, valid=True
2026-05-30T00:23:56.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:23:56.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:23:56.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:23:48, diff=8.338084s, valid=True
2026-05-30T00:23:56.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:23:56.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:23:56.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:23:56.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:23:56.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:23:56.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:23:56.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:24:12, diff=-15.658928s, valid=True
2026-05-30T00:23:56.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:23:56.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:23:56.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:23:56.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026078.341748s, valid=True
2026-05-30T00:23:56.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:23:56.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:23:56.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:23:56.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:23:56.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:23:56.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:23:56.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:23:56.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:23:56.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:23:56.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:23:56.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:23:56.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:23:56.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:23:56.659 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:23:56.875 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:23:57.289 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:23:57.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:23:57.390 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:23:57.390 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:23:57.647 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:23:57.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:24:27.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:24:27.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:24:27.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:24:27.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:24:27.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:24:27.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:24:27.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-05-30T00:24:27.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:24:27.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T00:24:28.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:24:28.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:24:28.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:24:28.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-05-30T00:25:09.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-05-30T00:25:09.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:25:09.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:25:09.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:25:09.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:25:09.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:25:09.484 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:25:09.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:25:09.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:25:09.485 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:25:09.485 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:25:09.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:25:09.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:25:09.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:25:09.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:25:09.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:25:09.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:25:09.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:25:09.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:25:09.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:25:09.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:25:09.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:25:09.741 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:25:09.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:24:52
2026-05-30T00:25:09.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73258, datetime.datetime(2026, 5, 30, 0, 24, 52), datetime.datetime(2026, 5, 30, 0, 24, 51), 'salt', 8.2, 76.85, None, 15.1, 6.25, 3.81, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:25:09.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:25:09.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:25:09.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:24:51, diff=18.807055s, valid=True
2026-05-30T00:25:09.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:25:09.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:25:09.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:25:12, diff=-2.190146s, valid=True
2026-05-30T00:25:09.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:25:09.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:25:09.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:24:50, diff=19.816635s, valid=True
2026-05-30T00:25:09.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:25:09.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:25:09.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:25:09.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:25:09.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:25:09.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:25:09.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:25:12, diff=-2.180249s, valid=True
2026-05-30T00:25:09.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:25:09.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:25:09.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:25:09.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026151.82044s, valid=True
2026-05-30T00:25:09.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:25:09.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:25:09.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:25:09.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:25:09.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:25:09.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:25:09.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:25:09.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:25:09.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:25:09.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:25:10.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:25:10.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:25:10.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:25:10.156 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:25:10.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:25:10.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:25:10.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:25:10.831 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:25:10.832 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:25:11.022 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:25:11.022 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:25:41.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:25:41.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:25:41.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:25:41.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:25:41.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:25:41.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:25:41.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T00:25:41.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:25:41.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-05-30T00:25:41.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:25:41.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:25:41.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:25:41.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-05-30T00:25:44.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-05-30T00:25:44.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:25:44.276 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:25:44.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:25:44.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:25:44.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:25:44.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:25:44.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:25:44.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:25:44.296 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:25:44.296 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:25:44.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:25:44.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:25:44.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:25:44.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:25:44.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:25:44.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:25:44.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:25:44.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:25:44.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:25:44.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:25:44.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:25:44.566 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:25:44.628 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:25:22
2026-05-30T00:25:44.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73259, datetime.datetime(2026, 5, 30, 0, 25, 22), datetime.datetime(2026, 5, 30, 0, 25, 21), 'salt', 8.13, 76.78, None, 17.08, 0.92, 3.82, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:25:44.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:25:44.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:25:44.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:25:21, diff=23.634126s, valid=True
2026-05-30T00:25:44.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:25:44.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:25:44.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:25:12, diff=32.636941s, valid=True
2026-05-30T00:25:44.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:25:44.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:25:44.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:25:19, diff=25.643518s, valid=True
2026-05-30T00:25:44.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:25:44.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:25:44.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:25:44.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:25:44.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:25:44.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:25:44.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:25:12, diff=32.646543s, valid=True
2026-05-30T00:25:44.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:25:44.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:25:44.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:25:44.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026186.647212s, valid=True
2026-05-30T00:25:44.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:25:44.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:25:44.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:25:44.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:25:44.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:25:44.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:25:44.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:25:44.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:25:44.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:25:44.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:25:44.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:25:44.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:25:44.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:25:44.963 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:25:45.263 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:25:45.618 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:25:45.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:25:45.721 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:25:45.721 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:25:45.907 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:25:45.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:26:15.932 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:26:15.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:26:15.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:26:16.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:26:16.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:26:16.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:26:16.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-05-30T00:26:16.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:26:16.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T00:26:16.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:26:16.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:26:16.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:26:16.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-05-30T00:26:19.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-05-30T00:26:19.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:26:19.426 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:26:19.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:26:19.435 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:26:19.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:26:19.447 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:26:19.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:26:19.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:26:19.447 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:26:19.447 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:26:19.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:26:19.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:26:19.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:26:19.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:26:19.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:26:19.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:26:19.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:26:19.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:26:19.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:26:19.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:26:19.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:26:19.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:26:19.780 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:25:52
2026-05-30T00:26:19.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73260, datetime.datetime(2026, 5, 30, 0, 25, 52), datetime.datetime(2026, 5, 30, 0, 25, 52), 'salt', 8.27, 76.35, None, 14.01, 6.63, 3.91, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:26:19.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:26:19.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:26:19.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:25:52, diff=27.786312s, valid=True
2026-05-30T00:26:19.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:26:19.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:26:19.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:26:12, diff=7.789336s, valid=True
2026-05-30T00:26:19.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:26:19.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:26:19.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:25:49, diff=30.79619s, valid=True
2026-05-30T00:26:19.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:26:19.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:26:19.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:26:19.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:26:19.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:26:19.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:26:19.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:26:12, diff=7.799229s, valid=True
2026-05-30T00:26:19.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:26:19.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:26:19.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:26:19.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026221.799933s, valid=True
2026-05-30T00:26:19.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:26:19.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:26:19.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:26:19.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:26:19.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:26:19.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:26:19.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:26:19.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:26:19.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:26:19.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:26:20.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:26:20.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:26:20.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:26:20.152 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:26:20.397 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:26:20.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:26:20.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:26:20.858 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:26:20.858 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:26:21.045 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:26:21.045 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:26:51.075 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:26:51.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:26:51.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:26:51.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:26:51.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:26:51.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:26:51.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-05-30T00:26:51.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:26:51.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-05-30T00:26:51.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:26:51.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:26:51.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:26:51.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-05-30T00:26:54.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-05-30T00:26:54.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:26:54.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:26:54.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:26:54.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:26:54.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:26:54.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:26:54.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:26:54.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:26:54.197 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:26:54.197 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:26:54.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:26:54.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:26:54.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:26:54.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:26:54.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:26:54.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:26:54.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:26:54.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:26:54.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:26:54.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:26:54.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:26:54.456 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:26:54.515 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:26:53
2026-05-30T00:26:54.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73262, datetime.datetime(2026, 5, 30, 0, 26, 53), datetime.datetime(2026, 5, 30, 0, 26, 53), 'salt', 8.43, 76.15, None, 16.13, 10.29, 3.95, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:26:54.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:26:54.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:26:54.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:26:53, diff=1.521736s, valid=True
2026-05-30T00:26:54.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:26:54.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:26:54.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:27:12, diff=-17.475439s, valid=True
2026-05-30T00:26:54.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:26:54.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:26:54.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:26:50, diff=4.531187s, valid=True
2026-05-30T00:26:54.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:26:54.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:26:54.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:26:54.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:26:54.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:26:54.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:26:54.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:27:12, diff=-17.465784s, valid=True
2026-05-30T00:26:54.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:26:54.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:26:54.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:26:54.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026256.534902s, valid=True
2026-05-30T00:26:54.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:26:54.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:26:54.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:26:54.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:26:54.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:26:54.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:26:54.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:26:54.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:26:54.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:26:54.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:26:54.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:26:54.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:26:54.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:26:54.929 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:26:55.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:26:55.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:26:55.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:26:55.586 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:26:55.586 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:26:55.865 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:26:55.865 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:27:25.895 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:27:25.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:27:25.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:27:26.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:27:26.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:27:26.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:27:26.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T00:27:26.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:27:26.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-05-30T00:27:26.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:27:26.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:27:26.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:27:26.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-05-30T00:27:29.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-05-30T00:27:29.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:27:29.889 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:27:29.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:27:29.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:27:29.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:27:29.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:27:29.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:27:29.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:27:29.910 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:27:29.910 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:27:29.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:27:30.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:27:30.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:27:30.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:27:30.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:27:30.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:27:30.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:27:30.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:27:30.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:27:30.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:27:30.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:27:30.184 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:27:30.247 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:27:24
2026-05-30T00:27:30.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73263, datetime.datetime(2026, 5, 30, 0, 27, 24), datetime.datetime(2026, 5, 30, 0, 27, 23), 'salt', 8.47, 76.05, None, 16.48, 9.75, 3.97, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:27:30.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:27:30.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:27:30.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:27:23, diff=7.253222s, valid=True
2026-05-30T00:27:30.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:27:30.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:27:30.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:27:12, diff=18.25612s, valid=True
2026-05-30T00:27:30.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:27:30.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:27:30.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:27:20, diff=10.262994s, valid=True
2026-05-30T00:27:30.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:27:30.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:27:30.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:27:30.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:27:30.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:27:30.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:27:30.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:27:12, diff=18.266039s, valid=True
2026-05-30T00:27:30.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:27:30.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:27:30.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:27:30.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026292.26671s, valid=True
2026-05-30T00:27:30.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:27:30.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:27:30.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:27:30.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:27:30.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:27:30.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:27:30.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:27:30.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:27:30.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:27:30.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:27:30.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:27:30.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:27:30.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:27:30.587 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:27:30.825 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:27:31.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:27:31.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:27:31.313 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:27:31.313 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:27:31.613 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:27:31.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:28:01.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:28:01.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:28:01.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:28:01.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:28:01.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:28:02.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:28:02.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-05-30T00:28:02.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:28:02.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-05-30T00:28:02.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:28:02.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:28:02.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:28:02.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-05-30T00:28:04.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-05-30T00:28:04.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:28:04.598 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:28:04.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:28:04.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:28:04.619 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:28:04.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:28:04.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:28:04.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:28:04.620 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:28:04.620 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:28:04.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:28:04.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:28:04.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:28:04.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:28:04.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:28:04.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:28:04.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:28:04.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:28:04.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:28:04.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:28:04.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:28:04.919 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:28:04.984 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:27:54
2026-05-30T00:28:04.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73264, datetime.datetime(2026, 5, 30, 0, 27, 54), datetime.datetime(2026, 5, 30, 0, 27, 53), 'salt', 8.33, 75.89, None, 14.82, 7.43, 3.99, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:28:04.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:28:04.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:28:04.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:27:53, diff=11.99046s, valid=True
2026-05-30T00:28:04.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:28:04.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:28:04.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:28:12, diff=-7.006661s, valid=True
2026-05-30T00:28:04.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:28:04.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:28:05.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:27:51, diff=14.000079s, valid=True
2026-05-30T00:28:05.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:28:05.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:28:05.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:28:05.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:28:05.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:28:05.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:28:05.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:28:12, diff=-6.9969s, valid=True
2026-05-30T00:28:05.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:28:05.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:28:05.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:28:05.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026327.003769s, valid=True
2026-05-30T00:28:05.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:28:05.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:28:05.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:28:05.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:28:05.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:28:05.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:28:05.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:28:05.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:28:05.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:28:05.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:28:05.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:28:05.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:28:05.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:28:05.392 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:28:05.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:28:05.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:28:06.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:28:06.053 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:28:06.053 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:28:06.143 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:28:06.143 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:28:36.173 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:28:36.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:28:36.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:28:36.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:28:36.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:28:36.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:28:36.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-05-30T00:28:36.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:28:36.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-05-30T00:28:36.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:28:36.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:28:36.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:28:36.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-05-30T00:29:40.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-05-30T00:29:40.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:29:40.220 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:29:40.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:29:40.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:29:40.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:29:40.243 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:29:40.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:29:40.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:29:40.243 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:29:40.243 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:29:40.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:29:40.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:29:40.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:29:40.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:29:40.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:29:40.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:29:40.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:29:40.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:29:40.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:29:40.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:29:40.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:29:40.512 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:29:40.574 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:29:24
2026-05-30T00:29:40.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73267, datetime.datetime(2026, 5, 30, 0, 29, 24), datetime.datetime(2026, 5, 30, 0, 29, 24), 'salt', 8.27, 75.69, None, 17.78, 11.56, 4.03, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:29:40.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:29:40.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:29:40.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:29:24, diff=16.580424s, valid=True
2026-05-30T00:29:40.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:29:40.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:29:40.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:29:12, diff=28.583263s, valid=True
2026-05-30T00:29:40.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:29:40.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:29:40.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:29:23, diff=17.590066s, valid=True
2026-05-30T00:29:40.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:29:40.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:29:40.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:29:40.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:29:40.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:29:40.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:29:40.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:29:12, diff=28.593119s, valid=True
2026-05-30T00:29:40.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:29:40.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:29:40.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:29:40.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026422.593835s, valid=True
2026-05-30T00:29:40.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:29:40.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:29:40.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:29:40.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:29:40.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:29:40.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:29:40.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:29:40.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:29:40.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:29:40.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:29:40.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:29:40.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:29:40.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:29:40.920 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:29:41.158 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:29:41.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:29:41.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:29:41.626 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:29:41.626 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:29:41.880 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:29:41.880 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:30:11.910 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:30:11.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:30:11.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:30:12.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:30:12.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:30:12.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:30:12.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-05-30T00:30:12.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:30:12.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-05-30T00:30:12.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:30:12.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:30:12.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:30:12.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-05-30T00:30:14.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-05-30T00:30:14.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:30:14.913 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:30:14.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:30:14.922 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:30:14.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:30:14.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:30:14.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:30:14.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:30:14.934 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:30:14.934 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:30:14.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:30:15.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:30:15.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:30:15.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:30:15.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:30:15.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:30:15.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:30:15.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:30:15.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:30:15.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:30:15.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:30:15.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:30:15.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:29:55
2026-05-30T00:30:15.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73268, datetime.datetime(2026, 5, 30, 0, 29, 55), datetime.datetime(2026, 5, 30, 0, 29, 54), 'salt', 8.33, 75.45, None, 18.07, 344.79, 4.07, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:30:15.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:30:15.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:30:15.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:29:54, diff=21.262091s, valid=True
2026-05-30T00:30:15.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:30:15.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:30:15.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:30:12, diff=3.264901s, valid=True
2026-05-30T00:30:15.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:30:15.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:30:15.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:29:52, diff=23.271551s, valid=True
2026-05-30T00:30:15.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:30:15.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:30:15.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:30:15.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:30:15.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:30:15.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:30:15.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:30:12, diff=3.274553s, valid=True
2026-05-30T00:30:15.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:30:15.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:30:15.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:30:15.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026457.275217s, valid=True
2026-05-30T00:30:15.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:30:15.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:30:15.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:30:15.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:30:15.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:30:15.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:30:15.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:30:15.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:30:15.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:30:15.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:30:15.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:30:15.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:30:15.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:30:15.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:30:15.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:30:16.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:30:16.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:30:16.363 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:30:16.363 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:30:16.645 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:30:16.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:30:46.675 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:30:46.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:30:46.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:30:46.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:30:46.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:30:47.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:30:47.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-05-30T00:30:47.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:30:47.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-05-30T00:30:47.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:30:47.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:30:47.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:30:47.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-05-30T00:30:50.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-05-30T00:30:50.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:30:50.341 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:30:50.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:30:50.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:30:50.358 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:30:50.359 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:30:50.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:30:50.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:30:50.359 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:30:50.359 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:30:50.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:30:50.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:30:50.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:30:50.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:30:50.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:30:50.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:30:50.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:30:50.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:30:50.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:30:50.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:30:50.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:30:50.640 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:30:50.698 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:30:25
2026-05-30T00:30:50.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73269, datetime.datetime(2026, 5, 30, 0, 30, 25), datetime.datetime(2026, 5, 30, 0, 30, 25), 'salt', 8.5, 75.59, None, 17.93, 4.28, 4.06, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:30:50.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:30:50.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:30:50.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:30:25, diff=25.704906s, valid=True
2026-05-30T00:30:50.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:30:50.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:30:50.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:30:12, diff=38.707795s, valid=True
2026-05-30T00:30:50.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:30:50.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:30:50.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:30:22, diff=28.714573s, valid=True
2026-05-30T00:30:50.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:30:50.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:30:50.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:30:50.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:30:50.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:30:50.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:30:50.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:30:12, diff=38.717674s, valid=True
2026-05-30T00:30:50.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:30:50.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:30:50.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:30:50.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026492.71834s, valid=True
2026-05-30T00:30:50.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:30:50.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:30:50.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:30:50.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:30:50.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:30:50.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:30:50.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:30:50.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:30:50.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:30:50.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:30:50.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:30:50.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:30:50.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:30:51.040 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:30:51.289 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:30:51.635 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:30:51.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:30:51.735 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:30:51.735 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:30:51.917 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:30:51.917 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:31:21.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:31:21.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:31:21.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:31:22.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:31:22.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:31:22.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:31:22.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-05-30T00:31:22.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:31:22.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-05-30T00:31:22.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:31:22.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:31:22.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:31: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-05-30T00:32:09.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-05-30T00:32:09.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:32:09.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:32:09.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:32:09.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:32:09.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:32:09.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:32:09.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:32:09.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:32:09.842 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:32:09.842 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:32:09.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:32:09.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:32:09.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:32:10.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:32:10.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:32:10.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:32:10.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:32:10.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:32:10.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:32:10.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:32:10.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:32:10.099 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:32:10.161 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:31:56
2026-05-30T00:32:10.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73272, datetime.datetime(2026, 5, 30, 0, 31, 56), datetime.datetime(2026, 5, 30, 0, 31, 56), 'salt', 8.6, 74.89, None, 17.82, 355.34, 4.19, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:32:10.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:32:10.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:32:10.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:31:56, diff=14.167253s, valid=True
2026-05-30T00:32:10.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:32:10.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:32:10.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:32:12, diff=-1.829893s, valid=True
2026-05-30T00:32:10.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:32:10.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:32:10.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:31:53, diff=17.176759s, valid=True
2026-05-30T00:32:10.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:32:10.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:32:10.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:32:10.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:32:10.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:32:10.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:32:10.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:32:12, diff=-1.820178s, valid=True
2026-05-30T00:32:10.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:32:10.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:32:10.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:32:10.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026572.18049s, valid=True
2026-05-30T00:32:10.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:32:10.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:32:10.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:32:10.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:32:10.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:32:10.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:32:10.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:32:10.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:32:10.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:32:10.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:32:10.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:32:10.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:32:10.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:32:10.497 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:32:10.713 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:32:11.062 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:32:11.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:32:11.164 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:32:11.164 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:32:11.380 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:32:11.381 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:32:41.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:32:41.402 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:32:41.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:32:41.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:32:41.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:32:42.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:32:42.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T00:32:42.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:32: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-05-30T00:32:42.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:32:42.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:32:42.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:32: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-05-30T00:32:47.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-05-30T00:32:47.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:32:47.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:32:47.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:32:47.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:32:47.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:32:47.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:32:47.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:32:47.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:32:47.613 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:32:47.613 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:32:47.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:32:47.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:32:47.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:32:47.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:32:47.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:32:47.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:32:47.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:32:47.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:32:47.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:32:47.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:32:47.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:32:47.867 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:32:47.925 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:32:26
2026-05-30T00:32:47.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73273, datetime.datetime(2026, 5, 30, 0, 32, 26), datetime.datetime(2026, 5, 30, 0, 32, 26), 'salt', 8.6, 74.92, None, 18.95, 9.26, 4.19, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:32:47.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:32:47.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:32:47.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:32:26, diff=21.931201s, valid=True
2026-05-30T00:32:47.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:32:47.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:32:47.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:32:12, diff=35.93407s, valid=True
2026-05-30T00:32:47.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:32:47.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:32:47.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:32:23, diff=24.940714s, valid=True
2026-05-30T00:32:47.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:32:47.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:32:47.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:32:47.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:32:47.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:32:47.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:32:47.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:32:12, diff=35.943708s, valid=True
2026-05-30T00:32:47.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:32:47.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:32:47.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:32:47.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026609.944358s, valid=True
2026-05-30T00:32:47.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:32:47.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:32:47.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:32:47.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:32:47.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:32:48.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:32:48.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:32:48.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:32:48.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:32:48.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:32:48.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:32:48.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:32:48.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:32:48.266 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:32:48.482 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:32:48.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:32:48.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:32:48.995 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:32:48.996 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:32:49.182 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:32:49.182 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:33:19.212 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:33:19.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:33:19.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:33:19.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:33:19.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:33:19.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:33:19.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-05-30T00:33:19.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:33:19.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-05-30T00:33:19.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:33:19.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:33:19.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:33:19.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-05-30T00:33:22.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-05-30T00:33:22.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:33:22.341 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:33:22.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:33:22.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:33:22.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:33:22.362 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:33:22.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:33:22.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:33:22.362 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:33:22.362 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:33:22.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:33:22.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:33:22.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:33:22.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:33:22.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:33:22.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:33:22.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:33:22.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:33:22.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:33:22.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:33:22.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:33:22.634 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:33:22.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:32:57
2026-05-30T00:33:22.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73274, datetime.datetime(2026, 5, 30, 0, 32, 57), datetime.datetime(2026, 5, 30, 0, 32, 56), 'salt', 8.6, 75.06, None, 17.64, 7.89, 4.16, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:33:22.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:33:22.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:33:22.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:32:56, diff=26.701515s, valid=True
2026-05-30T00:33:22.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:33:22.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:33:22.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:33:12, diff=10.704425s, valid=True
2026-05-30T00:33:22.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:33:22.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:33:22.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:32:53, diff=29.711175s, valid=True
2026-05-30T00:33:22.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:33:22.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:33:22.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:33:22.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:33:22.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:33:22.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:33:22.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:33:12, diff=10.71419s, valid=True
2026-05-30T00:33:22.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:33:22.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:33:22.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:33:22.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026644.714854s, valid=True
2026-05-30T00:33:22.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:33:22.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:33:22.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:33:22.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:33:22.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:33:22.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:33:22.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:33:22.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:33:22.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:33:22.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:33:22.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:33:22.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:33:23.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:33:23.040 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:33:23.264 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:33:23.629 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:33:23.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:33:23.735 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:33:23.735 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:33:24.013 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:33:24.013 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:33:54.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:33:54.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:33:54.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:33:54.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:33:54.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:33:54.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:33:54.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-05-30T00:33:54.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:33:54.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-05-30T00:33:54.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:33:54.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:33:54.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:33:54.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-05-30T00:33:57.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-05-30T00:33:57.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:33:57.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:33:57.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:33:57.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:33:57.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:33:57.147 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:33:57.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:33:57.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:33:57.147 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:33:57.147 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:33:57.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:33:57.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:33:57.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:33:57.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:33:57.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:33:57.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:33:57.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:33:57.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:33:57.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:33:57.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:33:57.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:33:57.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:33:57.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:33:57
2026-05-30T00:33:57.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73276, datetime.datetime(2026, 5, 30, 0, 33, 57), datetime.datetime(2026, 5, 30, 0, 33, 57), 'salt', 8.43, 75.06, None, 16.94, 16.23, 4.15, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:33:57.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:33:57.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:33:57.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:33:57, diff=0.474442s, valid=True
2026-05-30T00:33:57.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:33:57.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:33:57.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:34:12, diff=-14.522756s, valid=True
2026-05-30T00:33:57.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:33:57.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:33:57.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:33:57, diff=0.483873s, valid=True
2026-05-30T00:33:57.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:33:57.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:33:57.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:33:57.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:33:57.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:33:57.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:33:57.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:34:12, diff=-14.512527s, valid=True
2026-05-30T00:33:57.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:33:57.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:33:57.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:33:57.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026679.488337s, valid=True
2026-05-30T00:33:57.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:33:57.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:33:57.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:33:57.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:33:57.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:33:57.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:33:57.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:33:57.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:33:57.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:33:57.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:33:57.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:33:57.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:33:57.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:33:57.828 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:33:58.133 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:33:58.504 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:33:58.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:33:58.604 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:33:58.604 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:33:58.837 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:33:58.837 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:34:28.867 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:34:28.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:34:28.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:34:29.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:34:29.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:34:29.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:34:29.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-05-30T00:34:29.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:34:29.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-05-30T00:34:29.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:34:29.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:34:29.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:34:29.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-05-30T00:34:31.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-05-30T00:34:31.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:34:31.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:34:31.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:34:31.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:34:31.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:34:31.999 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:34:31.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:34:31.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:34:31.999 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:34:31.999 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:34:32.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:34:32.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:34:32.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:34:32.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:34:32.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:34:32.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:34:32.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:34:32.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:34:32.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:34:32.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:34:32.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:34:32.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:34:32.309 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:34:27
2026-05-30T00:34:32.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73277, datetime.datetime(2026, 5, 30, 0, 34, 27), datetime.datetime(2026, 5, 30, 0, 34, 27), 'salt', 8.47, 75.32, None, 17.64, 6.96, 4.11, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:34:32.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:34:32.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:34:32.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:34:27, diff=5.315838s, valid=True
2026-05-30T00:34:32.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:34:32.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:34:32.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:34:12, diff=20.31869s, valid=True
2026-05-30T00:34:32.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:34:32.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:34:32.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:34:24, diff=8.325558s, valid=True
2026-05-30T00:34:32.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:34:32.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:34:32.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:34:32.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:34:32.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:34:32.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:34:32.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:34:12, diff=20.328611s, valid=True
2026-05-30T00:34:32.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:34:32.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:34:32.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:34:32.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026714.329263s, valid=True
2026-05-30T00:34:32.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:34:32.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:34:32.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:34:32.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:34:32.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:34:32.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:34:32.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:34:32.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:34:32.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:34:32.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:34:32.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:34:32.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:34:32.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:34:32.648 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:34:32.862 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:34:33.208 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:34:33.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:34:33.309 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:34:33.309 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:34:33.583 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:34:33.584 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:35:03.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:35:03.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:35:03.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:35:03.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:35:03.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:35:04.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:35:04.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-05-30T00:35:04.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:35:04.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-05-30T00:35:04.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:35:04.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:35:04.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:35:04.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-05-30T00:35:06.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T00:35:06.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:35:06.569 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:35:06.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:35:06.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:35:06.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:35:06.590 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:35:06.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:35:06.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:35:06.590 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:35:06.590 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:35:06.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:35:06.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:35:06.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:35:06.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:35:06.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:35:06.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:35:06.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:35:06.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:35:06.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:35:06.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:35:06.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:35:06.839 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:35:06.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:34:58
2026-05-30T00:35:06.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73278, datetime.datetime(2026, 5, 30, 0, 34, 58), datetime.datetime(2026, 5, 30, 0, 34, 57), 'salt', 8.4, 75.39, None, 18.74, 8.88, 4.09, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:35:06.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:35:06.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:35:06.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:34:57, diff=9.904918s, valid=True
2026-05-30T00:35:06.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:35:06.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:35:06.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:35:12, diff=-5.092239s, valid=True
2026-05-30T00:35:06.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:35:06.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:35:06.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:34:54, diff=12.914641s, valid=True
2026-05-30T00:35:06.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:35:06.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:35:06.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:35:06.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:35:06.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:35:06.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:35:06.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:35:12, diff=-5.08232s, valid=True
2026-05-30T00:35:06.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:35:06.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:35:06.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:35:06.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026748.918347s, valid=True
2026-05-30T00:35:06.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:35:06.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:35:06.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:35:06.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:35:06.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:35:06.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:35:06.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:35:06.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:35:06.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:35:07.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:35:07.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:35:07.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:35:07.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:35:07.233 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:35:07.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:35:07.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:35:07.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:35:07.964 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:35:07.964 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:35:08.146 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:35:08.146 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:35:38.176 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:35:38.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:35:38.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:35:38.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:35:38.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:35:38.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:35:38.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-05-30T00:35:38.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:35:38.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-05-30T00:35:38.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:35:38.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:35:38.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:35:38.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-05-30T00:35:41.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-05-30T00:35:41.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:35:41.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:35:41.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:35:41.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:35:41.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:35:41.366 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:35:41.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:35:41.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:35:41.366 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:35:41.366 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:35:41.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:35:41.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:35:41.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:35:41.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:35:41.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:35:41.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:35:41.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:35:41.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:35:41.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:35:41.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:35:41.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:35:41.623 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:35:41.683 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:35:28
2026-05-30T00:35:41.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73279, datetime.datetime(2026, 5, 30, 0, 35, 28), datetime.datetime(2026, 5, 30, 0, 35, 27), 'salt', 8.33, 75.59, None, 18.03, 1.32, 4.05, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:35:41.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:35:41.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:35:41.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:35:27, diff=14.689586s, valid=True
2026-05-30T00:35:41.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:35:41.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:35:41.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:35:12, diff=29.692425s, valid=True
2026-05-30T00:35:41.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:35:41.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:35:41.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:35:24, diff=17.699915s, valid=True
2026-05-30T00:35:41.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:35:41.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:35:41.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:35:41.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:35:41.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:35:41.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:35:41.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:35:12, diff=29.702992s, valid=True
2026-05-30T00:35:41.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:35:41.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:35:41.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:35:41.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026783.703682s, valid=True
2026-05-30T00:35:41.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:35:41.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:35:41.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:35:41.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:35:41.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:35:41.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:35:41.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:35:41.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:35:41.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:35:41.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:35:41.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:35:41.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:35:41.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:35:42.040 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:35:42.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:35:42.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:35:42.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:35:42.712 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:35:42.712 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:35:42.893 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:35:42.893 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:36:12.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:36:12.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:36:12.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:36:13.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:36:13.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:36:13.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:36:13.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-05-30T00:36:13.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:36:13.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-05-30T00:36:13.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:36:13.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:36:13.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:36:13.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-05-30T00:36:30.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-05-30T00:36:30.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:36:30.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:36:30.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:36:30.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:36:30.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:36:30.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:36:30.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:36:30.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:36:30.658 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:36:30.658 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:36:30.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:36:30.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:36:30.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:36:30.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:36:30.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:36:30.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:36:30.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:36:30.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:36:30.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:36:30.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:36:30.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:36:30.910 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:36:30.967 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:36:28
2026-05-30T00:36:30.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73281, datetime.datetime(2026, 5, 30, 0, 36, 28), datetime.datetime(2026, 5, 30, 0, 36, 28), 'salt', 8.47, 75.12, None, 15.49, 339.68, 4.15, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:36:30.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:36:30.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:36:30.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:36:28, diff=2.9737s, valid=True
2026-05-30T00:36:30.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:36:30.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:36:30.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:36:12, diff=18.97652s, valid=True
2026-05-30T00:36:30.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:36:30.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:36:30.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:36:25, diff=5.983084s, valid=True
2026-05-30T00:36:30.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:36:30.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:36:30.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:36:30.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:36:30.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:36:30.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:36:30.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:36:12, diff=18.986069s, valid=True
2026-05-30T00:36:30.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:36:30.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:36:30.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:36:30.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026832.986737s, valid=True
2026-05-30T00:36:30.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:36:30.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:36:30.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:36:30.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:36:30.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:36:31.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:36:31.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:36:31.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:36:31.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:36:31.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:36:31.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:36:31.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:36:31.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:36:31.404 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:36:31.618 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:36:31.983 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:36:32.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:36:32.087 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:36:32.087 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:36:32.414 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:36:32.414 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:37:02.431 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:37:02.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:37:02.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:37:02.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:37:02.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:37:03.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:37:03.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-05-30T00:37:03.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:37:03.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-05-30T00:37:03.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:37:03.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:37:03.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:37:03.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-05-30T00:37:38.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-05-30T00:37:38.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:37:38.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:37:38.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:37:38.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:37:38.946 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:37:38.946 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:37:38.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:37:38.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:37:38.946 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:37:38.946 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:37:38.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:37:39.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:37:39.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:37:39.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:37:39.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:37:39.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:37:39.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:37:39.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:37:39.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:37:39.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:37:39.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:37:39.215 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:37:39.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:37:29
2026-05-30T00:37:39.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73283, datetime.datetime(2026, 5, 30, 0, 37, 29), datetime.datetime(2026, 5, 30, 0, 37, 28), 'salt', 8.53, 73.73, None, 17.75, 4.04, 4.41, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:37:39.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:37:39.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:37:39.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:37:28, diff=11.282218s, valid=True
2026-05-30T00:37:39.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:37:39.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:37:39.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:37:12, diff=27.285466s, valid=True
2026-05-30T00:37:39.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:37:39.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:37:39.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:37:26, diff=13.293205s, valid=True
2026-05-30T00:37:39.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:37:39.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:37:39.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:37:39.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:37:39.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:37:39.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:37:39.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:37:12, diff=27.296659s, valid=True
2026-05-30T00:37:39.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:37:39.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:37:39.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:37:39.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026901.297413s, valid=True
2026-05-30T00:37:39.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:37:39.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:37:39.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:37:39.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:37:39.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:37:39.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:37:39.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:37:39.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:37:39.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:37:39.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:37:39.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:37:39.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:37:39.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:37:39.626 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:37:39.856 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:37:40.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:37:40.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:37:40.315 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:37:40.315 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:37:40.466 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:37:40.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:38:10.496 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:38:10.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:38:10.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:38:10.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:38:10.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:38:11.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:38:11.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-05-30T00:38:11.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:38:11.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-05-30T00:38:11.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:38:11.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:38:11.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:38:11.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-05-30T00:38:14.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-05-30T00:38:14.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:38:14.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:38:14.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:38:14.376 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:38:14.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:38:14.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:38:14.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:38:14.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:38:14.389 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:38:14.389 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:38:14.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:38:14.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:38:14.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:38:14.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:38:14.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:38:14.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:38:14.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:38:14.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:38:14.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:38:14.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:38:14.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:38:14.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:38:14.709 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:37:59
2026-05-30T00:38:14.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73284, datetime.datetime(2026, 5, 30, 0, 37, 59), datetime.datetime(2026, 5, 30, 0, 37, 59), 'salt', 8.63, 73.4, None, 16.23, 350.5, 4.48, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:38:14.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:38:14.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:38:14.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:37:59, diff=15.715309s, valid=True
2026-05-30T00:38:14.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:38:14.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:38:14.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:38:12, diff=2.718099s, valid=True
2026-05-30T00:38:14.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:38:14.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:38:14.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:37:57, diff=17.72472s, valid=True
2026-05-30T00:38:14.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:38:14.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:38:14.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:38:14.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:38:14.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:38:14.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:38:14.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:38:12, diff=2.72772s, valid=True
2026-05-30T00:38:14.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:38:14.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:38:14.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:38:14.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026936.728373s, valid=True
2026-05-30T00:38:14.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:38:14.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:38:14.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:38:14.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:38:14.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:38:14.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:38:14.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:38:14.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:38:14.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:38:14.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:38:14.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:38:15.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:38:15.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:38:15.116 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:38:15.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:38:15.668 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:38:15.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:38:15.768 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:38:15.768 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:38:16.036 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:38:16.036 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:38:46.066 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:38:46.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:38:46.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:38:46.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:38:46.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:38:46.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:38:46.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-05-30T00:38:46.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:38:46.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-05-30T00:38:46.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:38:46.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:38:46.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:38:46.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-05-30T00:38:49.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-05-30T00:38:49.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:38:49.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:38:49.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:38:49.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:38:49.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:38:49.776 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:38:49.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:38:49.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:38:49.776 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:38:49.777 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:38:49.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:38:49.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:38:49.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:38:49.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:38:49.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:38:50.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:38:50.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:38:50.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:38:50.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:38:50.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:38:50.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:38:50.049 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:38:50.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:38:29
2026-05-30T00:38:50.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73285, datetime.datetime(2026, 5, 30, 0, 38, 29), datetime.datetime(2026, 5, 30, 0, 38, 29), 'salt', 8.63, 72.97, None, 16.34, 7.5, 4.56, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:38:50.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:38:50.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:38:50.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:38:29, diff=21.116311s, valid=True
2026-05-30T00:38:50.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:38:50.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:38:50.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:38:12, diff=38.119236s, valid=True
2026-05-30T00:38:50.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:38:50.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:38:50.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:38:26, diff=24.126959s, valid=True
2026-05-30T00:38:50.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:38:50.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:38:50.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:38:50.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:38:50.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:38:50.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:38:50.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:38:12, diff=38.130561s, valid=True
2026-05-30T00:38:50.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:38:50.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:38:50.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:38:50.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1026972.131293s, valid=True
2026-05-30T00:38:50.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:38:50.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:38:50.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:38:50.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:38:50.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:38:50.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:38:50.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:38:50.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:38:50.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:38:50.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:38:50.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:38:50.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:38:50.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:38:50.450 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:38:50.657 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:38:50.995 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:38:51.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:38:51.093 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:38:51.093 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:38:51.360 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:38:51.360 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:39:21.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:39:21.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:39:21.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:39:21.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:39:21.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:39:21.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:39:21.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-05-30T00:39:21.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:39:21.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-05-30T00:39:21.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:39:21.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:39:21.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:39:21.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-05-30T00:39:48.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-05-30T00:39:48.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:39:48.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:39:48.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:39:48.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:39:48.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:39:48.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:39:48.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:39:48.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:39:48.635 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:39:48.635 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:39:48.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:39:48.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:39:48.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:39:48.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:39:48.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:39:48.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:39:48.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:39:48.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:39:48.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:39:48.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:39:48.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:39:48.952 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:39:49.011 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:39:30
2026-05-30T00:39:49.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73287, datetime.datetime(2026, 5, 30, 0, 39, 30), datetime.datetime(2026, 5, 30, 0, 39, 29), 'salt', 8.8, 72.24, None, 14.86, 2.12, 4.72, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:39:49.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:39:49.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:39:49.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:39:29, diff=20.017934s, valid=True
2026-05-30T00:39:49.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:39:49.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:39:49.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:39:12, diff=37.02071s, valid=True
2026-05-30T00:39:49.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:39:49.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:39:49.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:39:27, diff=22.027262s, valid=True
2026-05-30T00:39:49.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:39:49.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:39:49.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:39:49.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:39:49.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:39:49.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:39:49.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:39:12, diff=37.030214s, valid=True
2026-05-30T00:39:49.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:39:49.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:39:49.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:39:49.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027031.03087s, valid=True
2026-05-30T00:39:49.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:39:49.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:39:49.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:39:49.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:39:49.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:39:49.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:39:49.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:39:49.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:39:49.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:39:49.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:39:49.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:39:49.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:39:49.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:39:49.344 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:39:49.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:39:49.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:39:49.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:39:49.997 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:39:49.997 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:39:50.494 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:39:50.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:40:20.525 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:40:20.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:40:20.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:40:20.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:40:20.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:40:20.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:40:20.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-05-30T00:40:20.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:40:20.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-05-30T00:40:21.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:40:21.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:40:21.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:40:21.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-05-30T00:40:26.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-05-30T00:40:26.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:40:26.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:40:26.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:40:26.754 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:40:26.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:40:26.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:40:26.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:40:26.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:40:26.766 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:40:26.766 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:40:26.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:40:26.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:40:26.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:40:26.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T00:40:26.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:40:26.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:40:26.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:40:27.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:40:27.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:40:27.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:40:27.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:40:27.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:40:27.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:40:00
2026-05-30T00:40:27.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73288, datetime.datetime(2026, 5, 30, 0, 40), datetime.datetime(2026, 5, 30, 0, 39, 59), 'salt', 8.86, 71.94, None, 16.23, 3.32, 4.77, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:40:27.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:40:27.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:40:27.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:39:59, diff=28.10323s, valid=True
2026-05-30T00:40:27.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:40:27.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:40:27.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:40:12, diff=15.106086s, valid=True
2026-05-30T00:40:27.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:40:27.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T00:40:27.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:39:57, diff=30.112827s, valid=True
2026-05-30T00:40:27.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:40:27.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:40:27.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:40:27.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:40:27.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:40:27.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:40:27.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:40:12, diff=15.115848s, valid=True
2026-05-30T00:40:27.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:40:27.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:40:27.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:40:27.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027069.1165s, valid=True
2026-05-30T00:40:27.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:40:27.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:40:27.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:40:27.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:40:27.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:40:27.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:40:27.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:40:27.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:40:27.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:40:27.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:40:27.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:40:27.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:40:27.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:40:27.439 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:40:27.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:40:28.030 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:40:28.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:40:28.130 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:40:28.130 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:40:29.217 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:40:29.217 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:40:59.244 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:40:59.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:40:59.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:40:59.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:40:59.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:40:59.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:40:59.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-05-30T00:40:59.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:40:59.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-05-30T00:40:59.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:40:59.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:40:59.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:40:59.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-05-30T00:41:02.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T00:41:02.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:41:02.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:41:02.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:41:02.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:41:02.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:41:02.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:41:02.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:41:02.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:41:02.587 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:41:02.587 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:41:02.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:41:02.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:41:02.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:41:02.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:41:02.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:41:02.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:41:02.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:41:02.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:41:02.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:41:02.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:41:02.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:41:02.854 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:41:02.914 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:41:00
2026-05-30T00:41:02.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73290, datetime.datetime(2026, 5, 30, 0, 41), datetime.datetime(2026, 5, 30, 0, 41), 'salt', 8.83, 71.64, None, 15.91, 6.56, 4.83, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:41:02.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:41:02.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:41:02.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:41:00, diff=2.920692s, valid=True
2026-05-30T00:41:02.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:41:02.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:41:02.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:41:12, diff=-9.076494s, valid=True
2026-05-30T00:41:02.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:41:02.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:41:02.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:40:57, diff=5.930161s, valid=True
2026-05-30T00:41:02.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:41:02.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:41:02.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:41:02.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:41:02.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:41:02.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:41:02.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:41:12, diff=-9.066818s, valid=True
2026-05-30T00:41:02.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:41:02.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:41:02.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:41:02.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027104.93387s, valid=True
2026-05-30T00:41:02.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:41:02.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:41:02.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:41:02.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:41:02.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:41:02.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:41:02.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:41:02.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:41:03.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:41:03.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:41:03.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:41:03.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:41:03.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:41:03.247 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:41:03.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:41:03.791 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:41:03.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:41:03.890 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:41:03.890 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:41:04.193 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:41:04.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:41:34.223 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:41:34.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:41:34.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:41:34.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:41:34.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:41:34.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:41:34.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-05-30T00:41:34.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:41:34.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-05-30T00:41:34.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:41:34.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:41:34.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:41:34.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-05-30T00:42:11.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-05-30T00:42:11.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:42:11.953 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:42:11.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:42:11.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:42:11.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:42:11.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:42:11.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:42:11.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:42:11.975 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:42:11.975 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:42:11.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:42:12.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:42:12.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:42:12.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:42:12.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:42:12.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:42:12.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:42:12.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:42:12.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:42:12.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:42:12.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:42:12.239 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:42:12.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:42:01
2026-05-30T00:42:12.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73292, datetime.datetime(2026, 5, 30, 0, 42, 1), datetime.datetime(2026, 5, 30, 0, 42), 'salt', 8.86, 71.9, None, 15.74, 5.36, 4.78, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:42:12.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:42:12.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:42:12.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:42:00, diff=12.304151s, valid=True
2026-05-30T00:42:12.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:42:12.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:42:12.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:42:12, diff=0.306956s, valid=True
2026-05-30T00:42:12.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:42:12.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:42:12.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:41:59, diff=13.313616s, valid=True
2026-05-30T00:42:12.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:42:12.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:42:12.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:42:12.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:42:12.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:42:12.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:42:12.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:42:12, diff=0.316949s, valid=True
2026-05-30T00:42:12.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:42:12.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:42:12.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:42:12.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027174.317918s, valid=True
2026-05-30T00:42:12.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:42:12.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:42:12.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:42:12.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:42:12.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:42:12.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:42:12.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:42:12.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:42:12.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:42:12.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:42:12.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:42:12.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:42:12.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:42:12.653 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:42:12.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:42:13.271 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:42:13.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:42:13.373 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:42:13.373 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:42:13.645 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:42:13.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:42:43.675 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:42:43.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:42:43.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:42:44.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:42:44.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:42:44.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:42:44.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-05-30T00:42:44.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:42:44.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-05-30T00:42:44.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:42:44.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:42:44.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:42:44.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-05-30T00:42:47.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-05-30T00:42:47.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:42:47.264 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:42:47.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:42:47.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:42:47.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:42:47.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:42:47.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:42:47.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:42:47.283 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:42:47.283 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:42:47.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:42:47.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:42:47.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:42:47.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:42:47.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:42:47.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:42:47.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:42:47.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:42:47.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:42:47.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:42:47.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:42:47.538 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:42:47.597 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:42:31
2026-05-30T00:42:47.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73293, datetime.datetime(2026, 5, 30, 0, 42, 31), datetime.datetime(2026, 5, 30, 0, 42, 31), 'salt', 8.7, 72.04, None, 15.77, 9.82, 4.75, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:42:47.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:42:47.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:42:47.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:42:31, diff=16.603848s, valid=True
2026-05-30T00:42:47.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:42:47.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:42:47.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:42:12, diff=35.606647s, valid=True
2026-05-30T00:42:47.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:42:47.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:42:47.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:42:28, diff=19.613316s, valid=True
2026-05-30T00:42:47.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:42:47.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:42:47.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:42:47.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:42:47.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:42:47.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:42:47.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:42:12, diff=35.616334s, valid=True
2026-05-30T00:42:47.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:42:47.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:42:47.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:42:47.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027209.617001s, valid=True
2026-05-30T00:42:47.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:42:47.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:42:47.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:42:47.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:42:47.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:42:47.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:42:47.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:42:47.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:42:47.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:42:47.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:42:47.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:42:47.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:42:47.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:42:47.935 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:42:48.143 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:42:48.482 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:42:48.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:42:48.583 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:42:48.583 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:42:48.782 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:42:48.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:43:18.812 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:43:18.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:43:18.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:43:19.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:43:19.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:43:19.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:43:19.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-05-30T00:43:19.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:43:19.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-05-30T00:43:19.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:43:19.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:43:19.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:43:19.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-05-30T00:43:21.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T00:43:21.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:43:21.784 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:43:21.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:43:21.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:43:21.806 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:43:21.806 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:43:21.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:43:21.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:43:21.807 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:43:21.807 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:43:21.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:43:21.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:43:21.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:43:21.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:43:21.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:43:22.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:43:22.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:43:22.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:43:22.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:43:22.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:43:22.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:43:22.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:43:22.132 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:43:01
2026-05-30T00:43:22.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73294, datetime.datetime(2026, 5, 30, 0, 43, 1), datetime.datetime(2026, 5, 30, 0, 43, 1), 'salt', 8.83, 72.24, None, 14.82, 337.31, 4.71, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:43:22.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:43:22.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:43:22.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:43:01, diff=21.13867s, valid=True
2026-05-30T00:43:22.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:43:22.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:43:22.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:43:12, diff=10.141535s, valid=True
2026-05-30T00:43:22.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:43:22.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:43:22.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:42:58, diff=24.148444s, valid=True
2026-05-30T00:43:22.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:43:22.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:43:22.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:43:22.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:43:22.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:43:22.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:43:22.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:43:12, diff=10.151507s, valid=True
2026-05-30T00:43:22.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:43:22.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:43:22.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:43:22.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027244.152199s, valid=True
2026-05-30T00:43:22.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:43:22.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:43:22.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:43:22.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:43:22.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:43:22.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:43:22.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:43:22.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:43:22.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:43:22.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:43:22.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:43:22.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:43:22.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:43:22.551 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:43:22.769 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:43:23.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:43:23.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:43:23.247 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:43:23.247 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:43:23.502 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:43:23.502 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:43:53.505 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:43:53.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:43:53.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:43:53.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:43:53.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:43:54.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:43:54.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-05-30T00:43:54.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:43:54.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-05-30T00:43:54.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:43:54.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:43:54.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:43:54.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T00:43:56.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-05-30T00:43:56.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:43:56.629 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:43:56.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:43:56.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:43:56.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:43:56.655 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:43:56.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:43:56.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:43:56.655 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:43:56.656 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:43:56.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:43:56.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:43:56.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:43:56.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:43:56.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:43:56.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:43:56.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:43:56.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:43:56.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:43:56.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:43:56.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:43:56.912 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:43:56.973 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:43:31
2026-05-30T00:43:56.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73295, datetime.datetime(2026, 5, 30, 0, 43, 31), datetime.datetime(2026, 5, 30, 0, 43, 31), 'salt', 8.8, 71.51, None, 13.94, 12.1, 4.86, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:43:56.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:43:56.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:43:56.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:43:31, diff=25.979054s, valid=True
2026-05-30T00:43:56.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:43:56.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:43:56.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:43:12, diff=44.981921s, valid=True
2026-05-30T00:43:56.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:43:56.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:43:56.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:43:28, diff=28.988606s, valid=True
2026-05-30T00:43:56.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:43:56.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:43:56.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:43:56.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:43:56.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:43:56.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:43:56.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:43:12, diff=44.991689s, valid=True
2026-05-30T00:43:56.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:43:56.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:43:56.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:43:56.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027278.992348s, valid=True
2026-05-30T00:43:56.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:43:56.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:43:56.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:43:56.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:43:56.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:43:57.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:43:57.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:43:57.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:43:57.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:43:57.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:43:57.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:43:57.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:43:57.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:43:57.313 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:43:57.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:43:57.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:43:57.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:43:57.962 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:43:57.962 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:43:58.228 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:43:58.228 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:44:28.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:44:28.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:44:28.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:44:28.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:44:28.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:44:28.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:44:28.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-05-30T00:44:28.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:44:28.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-05-30T00:44:28.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:44:28.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:44:28.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:44:28.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-05-30T00:44:54.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-05-30T00:44:54.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:44:54.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:44:54.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:44:54.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:44:54.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:44:54.484 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:44:54.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:44:54.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:44:54.484 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:44:54.484 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:44:54.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:44:54.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:44:54.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:44:54.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:44:54.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:44:54.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:44:54.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:44:54.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T00:44:54.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:44:54.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:44:54.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:44:54.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:44:54.810 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:44:32
2026-05-30T00:44:54.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73297, datetime.datetime(2026, 5, 30, 0, 44, 32), datetime.datetime(2026, 5, 30, 0, 44, 31), 'salt', 8.9, 71.61, None, 15.95, 0.9, 4.85, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:44:54.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:44:54.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:44:54.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:44:31, diff=23.817164s, valid=True
2026-05-30T00:44:54.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:44:54.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:44:54.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:44:12, diff=42.819953s, valid=True
2026-05-30T00:44:54.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:44:54.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:44:54.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:44:29, diff=25.826664s, valid=True
2026-05-30T00:44:54.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:44:54.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:44:54.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:44:54.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:44:54.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:44:54.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T00:44:54.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:44:12, diff=42.829611s, valid=True
2026-05-30T00:44:54.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:44:54.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:44:54.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:44:54.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027336.830269s, valid=True
2026-05-30T00:44:54.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:44:54.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:44:54.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:44:54.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:44:54.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:44:54.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:44:54.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:44:54.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:44:54.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:44:54.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:44:55.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:44:55.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:44:55.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:44:55.235 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:44:55.453 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:44:55.799 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:44:55.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:44:55.909 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:44:55.909 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:44:56.103 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:44:56.103 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:45:26.123 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:45:26.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:45:26.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:45:26.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:45:26.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:45:26.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:45:26.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-05-30T00:45:26.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:45:26.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T00:45:26.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:45:26.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:45:26.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:45:26.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-05-30T00:45:53.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-05-30T00:45:53.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:45:53.782 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:45:53.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:45:53.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:45:53.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:45:53.803 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:45:53.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:45:53.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:45:53.804 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:45:53.804 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:45:53.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:45:53.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:45:53.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:45:53.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:45:53.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:45:54.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T00:45:54.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:45:54.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T00:45:54.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:45:54.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:45:54.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:45:54.062 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:45:54.120 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:45:32
2026-05-30T00:45:54.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73299, datetime.datetime(2026, 5, 30, 0, 45, 32), datetime.datetime(2026, 5, 30, 0, 45, 32), 'salt', 8.86, 71.24, None, 15.07, 3.53, 4.91, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:45:54.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:45:54.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:45:54.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:45:32, diff=22.12645s, valid=True
2026-05-30T00:45:54.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:45:54.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T00:45:54.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:44:12, diff=102.12928s, valid=True
2026-05-30T00:45:54.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:45:54.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:45:54.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:45:30, diff=24.136014s, valid=True
2026-05-30T00:45:54.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:45:54.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:45:54.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:45:54.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:45:54.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:45:54.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T00:45:54.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:44:12, diff=102.139051s, valid=True
2026-05-30T00:45:54.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:45:54.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:45:54.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:45:54.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027396.13972s, valid=True
2026-05-30T00:45:54.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:45:54.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:45:54.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:45:54.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:45:54.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:45:54.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:45:54.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:45:54.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:45:54.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:45:54.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:45:54.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:45:54.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:45:54.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:45:54.477 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:45:54.689 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:45:55.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:45:55.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:45:55.150 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:45:55.150 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:45:55.352 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:45:55.352 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:46:25.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:46:25.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:46:25.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:46:25.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:46:25.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:46:25.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:46:25.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-05-30T00:46:25.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:46:25.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-05-30T00:46:25.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:46:25.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:46:25.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:46:25.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-05-30T00:47:00.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-05-30T00:47:00.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:47:00.276 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:47:00.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:47:00.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:47:00.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:47:00.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:47:00.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:47:00.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:47:00.296 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:47:00.296 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:47:00.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:47:00.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T00:47:00.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:47:00.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T00:47:00.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:47:00.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:47:00.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:47:00.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:47:00.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:47:00.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:47:00.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:47:00.547 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:47:00.606 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:46:33
2026-05-30T00:47:00.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73301, datetime.datetime(2026, 5, 30, 0, 46, 33), datetime.datetime(2026, 5, 30, 0, 46, 32), 'salt', 8.86, 71.21, None, 17.54, 4.33, 4.92, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:47:00.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:47:00.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T00:47:00.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:46:32, diff=28.612348s, valid=True
2026-05-30T00:47:00.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:47:00.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:47:00.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:44:12, diff=168.615182s, valid=True
2026-05-30T00:47:00.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:47:00.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T00:47:00.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:46:32, diff=28.621884s, valid=True
2026-05-30T00:47:00.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:47:00.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:47:00.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:47:00.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:47:00.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:47:00.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:47:00.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:44:12, diff=168.624876s, valid=True
2026-05-30T00:47:00.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:47:00.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:47:00.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:47:00.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027462.625555s, valid=True
2026-05-30T00:47:00.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:47:00.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:47:00.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:47:00.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:47:00.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:47:00.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:47:00.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:47:00.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:47:00.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:47:00.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:47:00.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:47:00.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:47:00.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:47:01.011 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:47:01.232 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:47:01.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:47:01.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:47:01.704 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:47:01.705 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:47:01.975 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:47:01.975 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:47:32.005 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:47:32.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:47:32.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:47:32.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:47:32.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:47:32.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:47:32.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-05-30T00:47:32.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:47:32.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-05-30T00:47:32.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:47:32.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:47:32.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:47:32.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-05-30T00:47:35.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-05-30T00:47:35.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:47:35.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:47:35.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:47:35.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:47:35.864 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:47:35.864 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:47:35.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:47:35.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:47:35.865 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:47:35.865 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:47:35.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:47:35.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:47:35.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:47:36.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:47:36.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:47:36.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:47:36.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:47:36.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T00:47:36.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:47:36.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:47:36.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:47:36.125 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:47:36.184 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:47:33
2026-05-30T00:47:36.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73303, datetime.datetime(2026, 5, 30, 0, 47, 33), datetime.datetime(2026, 5, 30, 0, 47, 33), 'salt', 8.9, 70.78, None, 12.74, 352.47, 5.01, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:47:36.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:47:36.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:47:36.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:47:33, diff=3.191102s, valid=True
2026-05-30T00:47:36.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:47:36.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:47:36.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:44:12, diff=204.19399s, valid=True
2026-05-30T00:47:36.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:47:36.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:47:36.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:47:31, diff=5.200761s, valid=True
2026-05-30T00:47:36.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:47:36.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:47:36.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:47:36.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:47:36.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:47:36.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T00:47:36.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:44:12, diff=204.203869s, valid=True
2026-05-30T00:47:36.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:47:36.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:47:36.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:47:36.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027498.204663s, valid=True
2026-05-30T00:47:36.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:47:36.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:47:36.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:47:36.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:47:36.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:47:36.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:47:36.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:47:36.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:47:36.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:47:36.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:47:36.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:47:36.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:47:36.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:47:36.532 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:47:36.746 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:47:37.154 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:47:37.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:47:37.256 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:47:37.256 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:47:37.446 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:47:37.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:48:07.476 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:48:07.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:48:07.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:48:07.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:48:07.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:48:08.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:48:08.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-05-30T00:48:08.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:48:08.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-05-30T00:48:08.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:48:08.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:48:08.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:48:08.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-05-30T00:48:33.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-05-30T00:48:33.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:48:33.901 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:48:33.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:48:33.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:48:33.922 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:48:33.922 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:48:33.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:48:33.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:48:33.922 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:48:33.922 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:48:33.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:48:34.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:48:34.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:48:34.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:48:34.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:48:34.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T00:48:34.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:48:34.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T00:48:34.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:48:34.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:48:34.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:48:34.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:48:34.258 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:48:34
2026-05-30T00:48:34.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73305, datetime.datetime(2026, 5, 30, 0, 48, 34), datetime.datetime(2026, 5, 30, 0, 48, 33), 'salt', 9.0, 69.91, None, 12.74, 352.73, 5.19, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:48:34.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:48:34.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:48:34.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:48:33, diff=1.264221s, valid=True
2026-05-30T00:48:34.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:48:34.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T00:48:34.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:44:12, diff=262.267025s, valid=True
2026-05-30T00:48:34.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:48:34.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:48:34.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:48:32, diff=2.273706s, valid=True
2026-05-30T00:48:34.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:48:34.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:48:34.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:48:34.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:48:34.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:48:34.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T00:48:34.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:44:12, diff=262.276682s, valid=True
2026-05-30T00:48:34.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:48:34.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:48:34.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:48:34.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027556.277334s, valid=True
2026-05-30T00:48:34.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:48:34.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:48:34.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:48:34.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:48:34.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:48:34.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:48:34.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:48:34.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:48:34.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:48:34.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:48:34.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:48:34.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:48:34.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:48:34.600 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:48:34.844 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:48:35.194 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:48:35.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:48:35.301 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:48:35.301 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:48:35.491 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:48:35.491 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:49:05.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:49:05.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:49:05.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:49:06.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:49:06.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:49:06.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:49:06.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-05-30T00:49:06.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:49:06.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-05-30T00:49:06.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:49:06.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:49:06.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:49:06.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-05-30T00:49:08.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-05-30T00:49:08.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:49:08.797 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:49:08.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:49:08.806 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:49:08.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:49:08.818 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:49:08.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:49:08.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:49:08.819 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:49:08.819 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:49:08.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:49:08.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:49:08.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:49:09.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:49:09.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:49:09.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:49:09.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:49:09.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:49:09.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:49:09.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:49:09.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:49:09.091 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:49:09.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:49:04
2026-05-30T00:49:09.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73306, datetime.datetime(2026, 5, 30, 0, 49, 4), datetime.datetime(2026, 5, 30, 0, 49, 3), 'salt', 9.06, 69.81, None, 13.02, 2.21, 5.21, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:49:09.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:49:09.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:49:09.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:49:03, diff=6.158831s, valid=True
2026-05-30T00:49:09.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:49:09.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:49:09.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:44:12, diff=297.161583s, valid=True
2026-05-30T00:49:09.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:49:09.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:49:09.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:49:02, diff=7.168189s, valid=True
2026-05-30T00:49:09.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:49:09.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:49:09.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:49:09.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:49:09.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:49:09.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:49:09.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:44:12, diff=297.171169s, valid=True
2026-05-30T00:49:09.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:49:09.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:49:09.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:49:09.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027591.17183s, valid=True
2026-05-30T00:49:09.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:49:09.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:49:09.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:49:09.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:49:09.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:49:09.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:49:09.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:49:09.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:49:09.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:49:09.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:49:09.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:49:09.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:49:09.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:49:09.503 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:49:09.724 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:49:10.094 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:49:10.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:49:10.266 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:49:10.266 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:49:10.456 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:49:10.456 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:49:40.486 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:49:40.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:49:40.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:49:40.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:49:40.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:49:40.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:49:40.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-05-30T00:49:40.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:49:40.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-05-30T00:49:40.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:49:40.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:49:40.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:49:40.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-05-30T00:50:29.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-05-30T00:50:29.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:50:29.538 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:50:29.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:50:29.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:50:29.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:50:29.559 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:50:29.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:50:29.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:50:29.559 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:50:29.559 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:50:29.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:50:29.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:50:29.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:50:29.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:50:29.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:50:29.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:50:29.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:50:29.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:50:29.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:50:29.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:50:29.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:50:29.822 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:50:29.881 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:50:04
2026-05-30T00:50:29.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73308, datetime.datetime(2026, 5, 30, 0, 50, 4), datetime.datetime(2026, 5, 30, 0, 50, 4), 'salt', 9.16, 69.42, None, 15.03, 10.15, 5.29, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:50:29.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:50:29.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:50:29.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:50:04, diff=25.888307s, valid=True
2026-05-30T00:50:29.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:50:29.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:50:29.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:50:12, diff=17.891543s, valid=True
2026-05-30T00:50:29.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:50:29.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:50:29.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:50:02, diff=27.898531s, valid=True
2026-05-30T00:50:29.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:50:29.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:50:29.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:50:29.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:50:29.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:50:29.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:50:29.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:50:12, diff=17.901602s, valid=True
2026-05-30T00:50:29.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:50:29.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:50:29.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:50:29.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027671.90228s, valid=True
2026-05-30T00:50:29.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:50:29.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:50:29.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:50:29.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:50:29.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:50:29.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:50:29.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:50:29.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:50:29.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:50:30.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:50:30.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:50:30.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:50:30.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:50:30.237 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:50:30.454 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:50:30.806 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:50:30.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:50:30.909 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:50:30.909 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:50:32.135 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:50:32.135 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:51:02.139 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:51:02.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:51:02.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:51:02.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:51:02.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:51:03.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:51:03.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-05-30T00:51:03.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:51:03.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-05-30T00:51:03.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:51:03.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:51:03.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:51:03.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-05-30T00:51:05.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-05-30T00:51:05.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:51:05.591 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:51:05.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:51:05.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:51:05.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:51:05.612 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:51:05.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:51:05.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:51:05.613 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:51:05.613 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:51:05.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:51:05.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:51:05.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:51:05.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:51:05.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:51:05.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:51:05.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:51:05.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:51:05.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:51:05.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:51:05.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:51:05.875 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:51:05.936 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:51:05
2026-05-30T00:51:05.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73310, datetime.datetime(2026, 5, 30, 0, 51, 5), datetime.datetime(2026, 5, 30, 0, 51, 4), 'salt', 9.1, 69.78, None, 14.79, 326.7, 5.22, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:51:05.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:51:05.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:51:05.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:51:04, diff=1.943662s, valid=True
2026-05-30T00:51:05.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:51:05.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:51:05.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:51:12, diff=-6.052958s, valid=True
2026-05-30T00:51:05.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:51:05.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:51:05.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:51:03, diff=2.955057s, valid=True
2026-05-30T00:51:05.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:51:05.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:51:05.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:51:05.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:51:05.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:51:05.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:51:05.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:51:12, diff=-6.041424s, valid=True
2026-05-30T00:51:05.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:51:05.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:51:05.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:51:05.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027707.95949s, valid=True
2026-05-30T00:51:05.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:51:05.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:51:05.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:51:05.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:51:05.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:51:06.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:51:06.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:51:06.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:51:06.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:51:06.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:51:06.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:51:06.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:51:06.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:51:06.286 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:51:06.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:51:06.959 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:51:07.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:51:07.061 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:51:07.061 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:51:07.248 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:51:07.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:51:37.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:51:37.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:51:37.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:51:37.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:51:37.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:51:37.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:51:37.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-05-30T00:51:37.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:51:37.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-05-30T00:51:37.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:51:37.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:51:37.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:51:37.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-05-30T00:52:21.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-05-30T00:52:21.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:52:21.989 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:52:21.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:52:21.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:52:22.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:52:22.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:52:22.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:52:22.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:52:22.010 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:52:22.010 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:52:22.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:52:22.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:52:22.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:52:22.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:52:22.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:52:22.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:52:22.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:52:22.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:52:22.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:52:22.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:52:22.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:52:22.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:52:22.319 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:52:05
2026-05-30T00:52:22.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73312, datetime.datetime(2026, 5, 30, 0, 52, 5), datetime.datetime(2026, 5, 30, 0, 52, 5), 'salt', 9.06, 70.28, None, 14.29, 10.74, 5.11, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:52:22.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:52:22.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:52:22.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:52:05, diff=17.326079s, valid=True
2026-05-30T00:52:22.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:52:22.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:52:22.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:52:12, diff=10.328889s, valid=True
2026-05-30T00:52:22.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:52:22.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:52:22.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:52:03, diff=19.33561s, valid=True
2026-05-30T00:52:22.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:52:22.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:52:22.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:52:22.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:52:22.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:52:22.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:52:22.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:52:12, diff=10.338597s, valid=True
2026-05-30T00:52:22.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:52:22.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:52:22.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:52:22.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027784.339258s, valid=True
2026-05-30T00:52:22.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:52:22.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:52:22.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:52:22.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:52:22.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:52:22.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:52:22.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:52:22.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:52:22.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:52:22.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:52:22.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:52:22.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:52:22.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:52:22.654 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:52:22.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:52:23.211 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:52:23.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:52:23.312 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:52:23.312 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:52:23.500 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:52:23.500 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:52:53.531 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:52:53.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:52:53.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:52:53.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:52:53.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:52:54.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:52:54.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T00:52:54.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:52:54.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-05-30T00:52:54.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:52:54.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:52:54.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:52:54.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-05-30T00:52:56.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-05-30T00:52:56.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:52:56.860 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:52:56.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:52:56.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:52:56.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:52:56.882 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:52:56.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:52:56.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:52:56.882 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:52:56.882 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:52:56.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:52:56.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:52:56.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:52:57.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:52:57.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:52:57.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T00:52:57.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:52:57.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T00:52:57.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:52:57.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:52:57.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:52:57.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:52:57.190 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:52:35
2026-05-30T00:52:57.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73313, datetime.datetime(2026, 5, 30, 0, 52, 35), datetime.datetime(2026, 5, 30, 0, 52, 35), 'salt', 9.06, 69.95, None, 11.01, 330.17, 5.18, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:52:57.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:52:57.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:52:57.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:52:35, diff=22.196849s, valid=True
2026-05-30T00:52:57.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:52:57.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T00:52:57.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:53:12, diff=-14.800372s, valid=True
2026-05-30T00:52:57.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:52:57.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:52:57.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:52:34, diff=23.206149s, valid=True
2026-05-30T00:52:57.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:52:57.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:52:57.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:52:57.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:52:57.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:52:57.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T00:52:57.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:53:12, diff=-14.790866s, valid=True
2026-05-30T00:52:57.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:52:57.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:52:57.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:52:57.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027819.209793s, valid=True
2026-05-30T00:52:57.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:52:57.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:52:57.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:52:57.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:52:57.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:52:57.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:52:57.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:52:57.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:52:57.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:52:57.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:52:57.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:52:57.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:52:57.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:52:57.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:52:57.813 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:52:58.163 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:52:58.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:52:58.264 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:52:58.265 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:52:58.455 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:52:58.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:53:28.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:53:28.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:53:28.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:53:28.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:53:28.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:53:28.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:53:28.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-05-30T00:53:28.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:53:28.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-05-30T00:53:28.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:53:28.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:53:28.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:53:28.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-05-30T00:53:31.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-05-30T00:53:31.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:53:31.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:53:31.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:53:31.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:53:31.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:53:31.217 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:53:31.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:53:31.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:53:31.218 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:53:31.218 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:53:31.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:53:31.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:53:31.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:53:31.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:53:31.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:53:31.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:53:31.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:53:31.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:53:31.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:53:31.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:53:31.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:53:31.485 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:53:31.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:53:06
2026-05-30T00:53:31.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73314, datetime.datetime(2026, 5, 30, 0, 53, 6), datetime.datetime(2026, 5, 30, 0, 53, 5), 'salt', 9.1, 69.75, None, 12.95, 354.09, 5.23, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:53:31.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:53:31.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:53:31.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:53:05, diff=26.556613s, valid=True
2026-05-30T00:53:31.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:53:31.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:53:31.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:53:12, diff=19.559502s, valid=True
2026-05-30T00:53:31.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:53:31.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:53:31.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:53:04, diff=27.566434s, valid=True
2026-05-30T00:53:31.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:53:31.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:53:31.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:53:31.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:53:31.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:53:31.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:53:31.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:53:12, diff=19.569497s, valid=True
2026-05-30T00:53:31.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:53:31.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:53:31.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:53:31.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027853.570173s, valid=True
2026-05-30T00:53:31.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:53:31.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:53:31.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:53:31.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:53:31.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:53:31.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:53:31.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:53:31.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:53:31.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:53:31.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:53:31.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:53:31.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:53:31.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:53:31.983 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:53:32.210 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:53:32.595 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:53:32.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:53:32.705 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:53:32.705 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:53:32.961 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:53:32.961 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:54:02.992 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:54:02.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:54:02.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:54:03.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:54:03.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:54:03.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:54: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-05-30T00:54:03.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:54:03.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-05-30T00:54:03.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:54:03.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:54:03.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:54:03.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-05-30T00:54:05.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-05-30T00:54:05.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:54:05.757 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:54:05.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:54:05.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:54:05.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:54:05.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:54:05.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:54:05.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:54:05.779 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:54:05.779 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:54:05.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:54:05.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T00:54:05.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:54:05.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T00:54:05.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:54:05.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:54:05.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:54:06.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:54:06.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:54:06.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:54:06.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:54:06.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:54:06.094 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:53:36
2026-05-30T00:54:06.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73315, datetime.datetime(2026, 5, 30, 0, 53, 36), datetime.datetime(2026, 5, 30, 0, 53, 35), 'salt', 9.03, 69.98, None, 15.7, 347.99, 5.18, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:54:06.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:54:06.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T00:54:06.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:53:35, diff=31.100885s, valid=True
2026-05-30T00:54:06.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:54:06.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:54:06.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:54:12, diff=-5.896299s, valid=True
2026-05-30T00:54:06.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:54:06.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T00:54:06.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:53:34, diff=32.110524s, valid=True
2026-05-30T00:54:06.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:54:06.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:54:06.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:54:06.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:54:06.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:54:06.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:54:06.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:54:12, diff=-5.886492s, valid=True
2026-05-30T00:54:06.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:54:06.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:54:06.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:54:06.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027888.114183s, valid=True
2026-05-30T00:54:06.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:54:06.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:54:06.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:54:06.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:54:06.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:54:06.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:54:06.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:54:06.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:54:06.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:54:06.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:54:06.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:54:06.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:54:06.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:54:06.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:54:06.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:54:07.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:54:07.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:54:07.158 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:54:07.158 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:54:07.347 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:54:07.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:54:37.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:54:37.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:54:37.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:54:37.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:54:37.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:54:37.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:54:37.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-05-30T00:54:37.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:54:37.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-05-30T00:54:37.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:54:37.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:54:37.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:54:37.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-05-30T00:54:40.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-05-30T00:54:40.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:54:40.141 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:54:40.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:54:40.150 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:54:40.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:54:40.161 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:54:40.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:54:40.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:54:40.162 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:54:40.162 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:54:40.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:54:40.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:54:40.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:54:40.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:54:40.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:54:40.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T00:54:40.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:54:40.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T00:54:40.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:54:40.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:54:40.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:54:40.427 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:54:40.489 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:54:36
2026-05-30T00:54:40.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73317, datetime.datetime(2026, 5, 30, 0, 54, 36), datetime.datetime(2026, 5, 30, 0, 54, 36), 'salt', 9.0, 69.98, None, 12.63, 9.82, 5.18, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:54:40.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:54:40.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:54:40.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:54:36, diff=4.495535s, valid=True
2026-05-30T00:54:40.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:54:40.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T00:54:40.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:55:12, diff=-31.501615s, valid=True
2026-05-30T00:54:40.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:54:40.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:54:40.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:54:35, diff=5.505189s, valid=True
2026-05-30T00:54:40.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:54:40.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:54:40.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:54:40.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:54:40.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:54:40.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T00:54:40.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:55:12, diff=-31.491717s, valid=True
2026-05-30T00:54:40.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:54:40.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:54:40.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:54:40.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1027922.508967s, valid=True
2026-05-30T00:54:40.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:54:40.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:54:40.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:54:40.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:54:40.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:54:40.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:54:40.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:54:40.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:54:40.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:54:40.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:54:40.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:54:40.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:54:40.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:54:40.831 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:54:41.052 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:54:41.411 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:54:41.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:54:41.513 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:54:41.513 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:54:41.846 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:54:41.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:55:11.870 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:55:11.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:55:11.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:55:12.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:55:12.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:55:12.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:55:12.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-05-30T00:55:12.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:55:12.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-05-30T00:55:12.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:55:12.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:55:12.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:55:12.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-05-30T00:56:09.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-05-30T00:56:09.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:56:09.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:56:09.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:56:09.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:56:09.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:56:09.579 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:56:09.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:56:09.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:56:09.579 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:56:09.580 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:56:09.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:56:09.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:56:09.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:56:09.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:56:09.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:56:09.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:56:09.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:56:09.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:56:09.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:56:09.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:56:09.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:56:09.847 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:56:09.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:56:07
2026-05-30T00:56:09.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73320, datetime.datetime(2026, 5, 30, 0, 56, 7), datetime.datetime(2026, 5, 30, 0, 56, 7), 'salt', 9.0, 70.61, None, 13.52, 0.9, 5.05, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:56:09.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:56:09.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:56:09.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:56:07, diff=2.924653s, valid=True
2026-05-30T00:56:09.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:56:09.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:56:09.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:56:12, diff=-2.072389s, valid=True
2026-05-30T00:56:09.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:56:09.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:56:09.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:56:05, diff=4.940503s, valid=True
2026-05-30T00:56:09.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:56:09.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:56:09.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:56:09.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:56:09.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:56:09.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:56:09.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:56:12, diff=-2.055158s, valid=True
2026-05-30T00:56:09.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:56:09.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:56:09.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:56:09.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028011.945594s, valid=True
2026-05-30T00:56:09.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:56:09.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:56:09.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:56:09.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:56:09.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:56:10.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:56:10.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:56:10.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:56:10.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:56:10.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:56:10.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:56:10.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:56:10.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:56:10.350 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:56:10.570 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:56:10.926 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:56:11.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:56:11.032 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:56:11.032 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:56:11.241 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:56:11.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:56:41.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:56:41.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:56:41.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:56:41.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:56:41.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:56:41.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:56:41.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-05-30T00:56:41.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:56:41.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-05-30T00:56:41.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:56:41.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:56:41.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:56:41.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-05-30T00:56:45.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-05-30T00:56:45.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:56:45.115 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:56:45.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:56:45.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:56:45.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:56:45.135 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:56:45.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:56:45.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:56:45.136 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:56:45.136 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:56:45.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:56:45.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:56:45.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:56:45.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:56:45.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:56:45.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T00:56:45.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:56:45.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T00:56:45.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:56:45.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:56:45.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:56:45.407 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:56:45.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:56:37
2026-05-30T00:56:45.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73321, datetime.datetime(2026, 5, 30, 0, 56, 37), datetime.datetime(2026, 5, 30, 0, 56, 37), 'salt', 8.93, 70.78, None, 14.82, 6.89, 5.01, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:56:45.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:56:45.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:56:45.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:56:37, diff=8.505301s, valid=True
2026-05-30T00:56:45.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:56:45.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T00:56:45.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:57:12, diff=-26.491802s, valid=True
2026-05-30T00:56:45.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:56:45.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:56:45.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:56:35, diff=10.515008s, valid=True
2026-05-30T00:56:45.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:56:45.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:56:45.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:56:45.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:56:45.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:56:45.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T00:56:45.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:57:12, diff=-26.481912s, valid=True
2026-05-30T00:56:45.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:56:45.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:56:45.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:56:45.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028047.518779s, valid=True
2026-05-30T00:56:45.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:56:45.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:56:45.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:56:45.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:56:45.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:56:45.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:56:45.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:56:45.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:56:45.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:56:45.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:56:45.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:56:45.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:56:45.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:56:45.838 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:56:46.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:56:46.400 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:56:46.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:56:46.502 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:56:46.502 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:56:46.831 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:56:46.831 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:57:16.861 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:57:16.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:57:16.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:57:17.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:57:17.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:57:17.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:57:17.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T00:57:17.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:57:17.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T00:57:17.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:57:17.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:57:17.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:57:17.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-05-30T00:57:20.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T00:57:20.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:57:20.048 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:57:20.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:57:20.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:57:20.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:57:20.070 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:57:20.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:57:20.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:57:20.071 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:57:20.071 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:57:20.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:57:20.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:57:20.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:57:20.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:57:20.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:57:20.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:57:20.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:57:20.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:57:20.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:57:20.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:57:20.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:57:20.330 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:57:20.389 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:57:07
2026-05-30T00:57:20.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73322, datetime.datetime(2026, 5, 30, 0, 57, 7), datetime.datetime(2026, 5, 30, 0, 57, 6), 'salt', 8.8, 70.34, None, 13.62, 347.14, 5.09, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:57:20.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:57:20.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:57:20.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:57:06, diff=14.395497s, valid=True
2026-05-30T00:57:20.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:57:20.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:57:20.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:57:12, diff=8.398311s, valid=True
2026-05-30T00:57:20.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:57:20.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:57:20.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:57:05, diff=15.404872s, valid=True
2026-05-30T00:57:20.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:57:20.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:57:20.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:57:20.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:57:20.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:57:20.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:57:20.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:57:12, diff=8.407877s, valid=True
2026-05-30T00:57:20.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:57:20.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:57:20.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:57:20.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028082.408524s, valid=True
2026-05-30T00:57:20.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:57:20.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:57:20.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:57:20.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:57:20.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:57:20.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:57:20.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:57:20.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:57:20.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:57:20.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:57:20.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:57:20.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:57:20.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:57:20.725 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:57:20.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:57:21.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:57:21.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:57:21.400 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:57:21.400 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:57:21.700 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:57:21.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:57:51.730 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:57:51.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:57:51.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:57:52.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:57:52.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:57:52.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:57:52.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-05-30T00:57:52.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:57:52.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-05-30T00:57:52.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:57:52.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:57:52.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:57:52.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-05-30T00:58:02.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-05-30T00:58:02.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:58:02.466 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:58:02.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:58:02.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:58:02.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:58:02.485 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:58:02.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:58:02.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:58:02.486 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:58:02.486 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:58:02.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:58:02.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:58:02.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:58:02.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:58:02.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:58:02.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T00:58:02.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:58:02.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T00:58:02.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:58:02.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:58:02.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:58:02.811 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:58:02.877 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:57:38
2026-05-30T00:58:02.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73323, datetime.datetime(2026, 5, 30, 0, 57, 38), datetime.datetime(2026, 5, 30, 0, 57, 37), 'salt', 8.93, 70.51, None, 14.57, 3.01, 5.06, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:58:02.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:58:02.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:58:02.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:57:37, diff=25.883179s, valid=True
2026-05-30T00:58:02.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:58:02.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T00:58:02.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:58:12, diff=-9.114029s, valid=True
2026-05-30T00:58:02.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:58:02.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:58:02.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:57:36, diff=26.892714s, valid=True
2026-05-30T00:58:02.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:58:02.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:58:02.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:58:02.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:58:02.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:58:02.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T00:58:02.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:58:12, diff=-9.104296s, valid=True
2026-05-30T00:58:02.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:58:02.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:58:02.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:58:02.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028124.896357s, valid=True
2026-05-30T00:58:02.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:58:02.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:58:02.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:58:02.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:58:02.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:58:02.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:58:02.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:58:02.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:58:02.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:58:03.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:58:03.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:58:03.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:58:03.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:58:03.214 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:58:03.430 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:58:03.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:58:03.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:58:03.953 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:58:03.953 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:58:04.144 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:58:04.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:58:34.175 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:58:34.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:58:34.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:58:34.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:58:34.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:58:34.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:58:34.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-05-30T00:58:34.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:58:34.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-05-30T00:58:34.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:58:34.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:58:34.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:58:34.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-05-30T00:58:36.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-05-30T00:58:36.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:58:36.875 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:58:36.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:58:36.884 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:58:36.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:58:36.899 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:58:36.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:58:36.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:58:36.899 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:58:36.899 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:58:36.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:58:36.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T00:58:36.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:58:37.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T00:58:37.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:58:37.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:58:37.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:58:37.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:58:37.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:58:37.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:58:37.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:58:37.153 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:58:37.213 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:58:08
2026-05-30T00:58:37.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73324, datetime.datetime(2026, 5, 30, 0, 58, 8), datetime.datetime(2026, 5, 30, 0, 58, 7), 'salt', 8.8, 70.44, None, 11.58, 13.95, 5.07, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:58:37.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:58:37.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T00:58:37.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:58:07, diff=30.219166s, valid=True
2026-05-30T00:58:37.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:58:37.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:58:37.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:58:12, diff=25.221911s, valid=True
2026-05-30T00:58:37.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:58:37.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T00:58:37.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:58:06, diff=31.228375s, valid=True
2026-05-30T00:58:37.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:58:37.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:58:37.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:58:37.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:58:37.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:58:37.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:58:37.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:58:12, diff=25.231339s, valid=True
2026-05-30T00:58:37.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:58:37.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:58:37.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:58:37.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028159.232023s, valid=True
2026-05-30T00:58:37.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:58:37.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:58:37.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:58:37.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:58:37.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:58:37.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:58:37.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:58:37.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:58:37.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:58:37.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:58:37.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:58:37.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:58:37.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:58:37.546 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:58:37.759 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:58:38.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:58:38.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:58:38.206 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:58:38.206 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:58:40.611 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:58:40.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:59:10.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:59:10.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:59:10.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:59:11.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:59:11.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:59:11.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:59:11.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-05-30T00:59:11.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:59:11.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T00:59:11.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:59:11.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:59:11.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:59:11.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-05-30T00:59:13.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-05-30T00:59:13.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:59:13.776 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:59:13.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:59:13.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:59:13.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:59:13.798 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:59:13.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:59:13.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:59:13.798 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:59:13.798 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:59:13.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:59:13.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:59:13.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:59:13.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:59:13.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:59:14.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:59:14.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:59:14.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T00:59:14.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:59:14.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:59:14.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:59:14.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:59:14.123 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:59:08
2026-05-30T00:59:14.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73326, datetime.datetime(2026, 5, 30, 0, 59, 8), datetime.datetime(2026, 5, 30, 0, 59, 8), 'salt', 8.93, 69.65, None, 13.41, 3.22, 5.24, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:59:14.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:59:14.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:59:14.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:59:08, diff=6.130065s, valid=True
2026-05-30T00:59:14.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:59:14.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:59:14.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:59:12, diff=2.132877s, valid=True
2026-05-30T00:59:14.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:59:14.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:59:14.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:59:08, diff=6.139651s, valid=True
2026-05-30T00:59:14.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:59:14.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:59:14.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:59:14.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:59:14.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:59:14.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T00:59:14.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:59:12, diff=2.142609s, valid=True
2026-05-30T00:59:14.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:59:14.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:59:14.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:59:14.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028196.143377s, valid=True
2026-05-30T00:59:14.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:59:14.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:59:14.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:59:14.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:59:14.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:59:14.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:59:14.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:59:14.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:59:14.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:59:14.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:59:14.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:59:14.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:59:14.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:59:14.468 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:59:14.786 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:59:15.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:59:15.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:59:15.246 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:59:15.246 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:59:15.450 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:59:15.450 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T00:59:45.481 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T00:59:45.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T00:59:45.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T00:59:45.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T00:59:45.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T00:59:46.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T00:59:46.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-05-30T00:59:46.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T00:59:46.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-05-30T00:59:46.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T00:59:46.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T00:59:46.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T00:59:46.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-05-30T00:59:48.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-05-30T00:59:48.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T00:59:48.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T00:59:48.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T00:59:48.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T00:59:48.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T00:59:48.901 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T00:59:48.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T00:59:48.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T00:59:48.901 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T00:59:48.901 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T00:59:48.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T00:59:48.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T00:59:48.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T00:59:49.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T00:59:49.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:59:49.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T00:59:49.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T00:59:49.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T00:59:49.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T00:59:49.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T00:59:49.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T00:59:49.162 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T00:59:49.222 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 00:59:39
2026-05-30T00:59:49.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73327, datetime.datetime(2026, 5, 30, 0, 59, 39), datetime.datetime(2026, 5, 30, 0, 59, 38), 'salt', 8.96, 70.05, None, 12.95, 8.34, 5.16, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T00:59:49.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T00:59:49.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T00:59:49.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:59:38, diff=11.228364s, valid=True
2026-05-30T00:59:49.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T00:59:49.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T00:59:49.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:00:12, diff=-22.768864s, valid=True
2026-05-30T00:59:49.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T00:59:49.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T00:59:49.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 00:59:37, diff=12.237952s, valid=True
2026-05-30T00:59:49.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T00:59:49.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:59:49.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T00:59:49.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T00:59:49.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T00:59:49.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T00:59:49.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:00:12, diff=-22.759071s, valid=True
2026-05-30T00:59:49.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T00:59:49.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T00:59:49.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T00:59:49.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028231.241588s, valid=True
2026-05-30T00:59:49.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T00:59:49.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T00:59:49.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T00:59:49.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T00:59:49.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T00:59:49.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T00:59:49.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T00:59:49.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T00:59:49.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T00:59:49.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T00:59:49.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T00:59:49.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T00:59:49.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T00:59:49.567 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T00:59:49.788 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:59:50.172 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T00:59:50.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T00:59:50.274 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T00:59:50.274 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T00:59:50.502 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T00:59:50.502 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:00:20.531 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:00:20.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:00:20.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:00:20.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:00:20.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:00:21.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:00:21.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-05-30T01:00:21.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:00:21.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-05-30T01:00:21.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:00:21.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:00:21.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:00:21.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T01:00:24.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-05-30T01:00:24.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:00:24.203 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:00:24.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:00:24.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:00:24.223 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:00:24.223 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:00:24.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:00:24.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:00:24.223 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:00:24.223 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:00:24.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:00:24.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:00:24.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:00:24.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:00:24.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:00:24.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:00:24.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:00:24.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:00:24.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:00:24.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:00:24.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:00:24.473 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:00:24.531 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:00:09
2026-05-30T01:00:24.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73328, datetime.datetime(2026, 5, 30, 1, 0, 9), datetime.datetime(2026, 5, 30, 1, 0, 8), 'salt', 8.96, 70.68, None, 12.81, 2.64, 5.03, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:00:24.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:00:24.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:00:24.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:00:08, diff=16.53793s, valid=True
2026-05-30T01:00:24.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:00:24.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:00:24.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:00:12, diff=12.540724s, valid=True
2026-05-30T01:00:24.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:00:24.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:00:24.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:00:07, diff=17.5474s, valid=True
2026-05-30T01:00:24.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:00:24.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:00:24.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:00:24.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:00:24.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:00:24.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:00:24.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:00:12, diff=12.550368s, valid=True
2026-05-30T01:00:24.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:00:24.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:00:24.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:00:24.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028266.551043s, valid=True
2026-05-30T01:00:24.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:00:24.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:00:24.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:00:24.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:00:24.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:00:24.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:00:24.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:00:24.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:00:24.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:00:24.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:00:24.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:00:24.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:00:24.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:00:24.866 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:00:25.149 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:00:25.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:00:25.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:00:25.598 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:00:25.598 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:00:25.798 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:00:25.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:00:55.829 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:00:55.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:00:55.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:00:56.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:00:56.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:00:56.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:00:56.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-05-30T01:00:56.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:00:56.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-05-30T01:00:56.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:00:56.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:00:56.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:00:56.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-05-30T01:01:27.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-05-30T01:01:27.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:01:27.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:01:27.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:01:27.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:01:27.539 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:01:27.539 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:01:27.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:01:27.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:01:27.540 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:01:27.540 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:01:27.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:01:27.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:01:27.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:01:27.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:01:27.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:01:27.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:01:27.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:01:27.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:01:27.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:01:27.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:01:27.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:01:27.819 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:01:27.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:01:09
2026-05-30T01:01:27.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73330, datetime.datetime(2026, 5, 30, 1, 1, 9), datetime.datetime(2026, 5, 30, 1, 1, 9), 'salt', 8.6, 71.31, None, 13.37, 3.67, 4.89, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:01:27.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:01:27.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:01:27.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:01:09, diff=18.891291s, valid=True
2026-05-30T01:01:27.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:01:27.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:01:27.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:01:12, diff=15.894106s, valid=True
2026-05-30T01:01:27.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:01:27.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:01:27.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:01:08, diff=19.900835s, valid=True
2026-05-30T01:01:27.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:01:27.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:01:27.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:01:27.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:01:27.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:01:27.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:01:27.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:01:12, diff=15.90382s, valid=True
2026-05-30T01:01:27.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:01:27.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:01:27.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:01:27.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028329.904473s, valid=True
2026-05-30T01:01:27.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:01:27.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:01:27.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:01:27.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:01:27.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:01:27.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:01:27.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:01:27.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:01:27.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:01:28.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:01:28.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:01:28.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:01:28.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:01:28.237 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:01:28.473 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:01:28.836 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:01:28.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:01:28.937 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:01:28.938 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:01:29.176 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:01:29.177 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:01:59.196 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:01:59.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:01:59.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:01:59.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:01:59.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:01:59.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:01:59.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-05-30T01:01:59.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:01:59.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-05-30T01:01:59.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:01:59.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:01:59.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:01:59.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-05-30T01:02: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-05-30T01:02:14.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:02:14.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:02:14.946 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:02:14.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:02:14.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:02:14.967 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:02:14.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:02:14.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:02:14.967 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:02:14.967 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:02:14.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:02:15.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:02:15.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:02:15.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:02:15.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:02:15.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:02:15.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:02:15.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:02:15.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:02:15.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:02:15.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:02:15.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:02:15.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:02:10
2026-05-30T01:02:15.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73332, datetime.datetime(2026, 5, 30, 1, 2, 10), datetime.datetime(2026, 5, 30, 1, 2, 9), 'salt', 8.66, 70.78, None, 10.09, 352.4, 5.0, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:02:15.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:02:15.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:02:15.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:02:09, diff=6.304163s, valid=True
2026-05-30T01:02:15.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:02:15.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:02:15.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:02:12, diff=3.306956s, valid=True
2026-05-30T01:02:15.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:02:15.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:02:15.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:02:08, diff=7.313648s, valid=True
2026-05-30T01:02:15.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:02:15.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:02:15.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:02:15.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:02:15.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:02:15.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:02:15.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:02:12, diff=3.316635s, valid=True
2026-05-30T01:02:15.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:02:15.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:02:15.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:02:15.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028377.317287s, valid=True
2026-05-30T01:02:15.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:02:15.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:02:15.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:02:15.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:02:15.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:02:15.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:02:15.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:02:15.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:02:15.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:02:15.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:02:15.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:02:15.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:02:15.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:02:15.703 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:02:15.925 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:02:16.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:02:16.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:02:16.376 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:02:16.376 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:02:16.608 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:02:16.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:02:46.638 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:02:46.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:02:46.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:02:46.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:02:46.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:02:47.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:02:47.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-05-30T01:02:47.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:02:47.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-05-30T01:02:47.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:02:47.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:02:47.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:02: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-05-30T01:02:50.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-05-30T01:02:50.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:02:50.353 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:02:50.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:02:50.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:02:50.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:02:50.373 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:02:50.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:02:50.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:02:50.373 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:02:50.373 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:02:50.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:02:50.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:02:50.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:02:50.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:02:50.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:02:50.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T01:02:50.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:02:50.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T01:02:50.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:02:50.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:02:50.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:02:50.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:02:50.709 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:02:40
2026-05-30T01:02:50.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73333, datetime.datetime(2026, 5, 30, 1, 2, 40), datetime.datetime(2026, 5, 30, 1, 2, 39), 'salt', 8.56, 69.78, None, 17.64, 0.92, 5.19, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:02:50.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:02:50.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:02:50.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:02:39, diff=11.715486s, valid=True
2026-05-30T01:02:50.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:02:50.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T01:02:50.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:03:12, diff=-21.281726s, valid=True
2026-05-30T01:02:50.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:02:50.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:02:50.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:02:38, diff=12.724934s, valid=True
2026-05-30T01:02:50.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:02:50.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:02:50.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:02:50.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:02:50.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:02:50.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T01:02:50.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:03:12, diff=-21.27207s, valid=True
2026-05-30T01:02:50.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:02:50.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:02:50.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:02:50.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028412.728588s, valid=True
2026-05-30T01:02:50.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:02:50.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:02:50.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:02:50.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:02:50.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:02:50.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:02:50.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:02:50.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:02:50.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:02:50.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:02:50.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:02:50.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:02:51.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:02:51.044 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:02:51.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:02:51.603 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:02:51.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:02: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-05-30T01:02: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-05-30T01:02:51.963 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:02:51.963 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:03:21.993 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:03:21.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:03:21.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:03:22.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:03:22.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:03:22.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:03:22.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-05-30T01:03:22.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:03:22.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-05-30T01:03:22.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:03:22.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:03:22.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:03:22.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-05-30T01:04:11.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-05-30T01:04:11.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:04:11.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:04:11.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:04:11.630 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:04:11.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:04:11.642 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:04:11.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:04:11.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:04:11.642 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:04:11.642 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:04:11.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:04:11.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:04:11.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:04:11.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:04:11.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:04:11.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:04:11.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:04:11.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:04:11.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:04:11.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:04:11.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:04:11.905 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:04:11.965 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:04:11
2026-05-30T01:04:11.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73336, datetime.datetime(2026, 5, 30, 1, 4, 11), datetime.datetime(2026, 5, 30, 1, 4, 10), 'salt', 8.96, 68.59, None, 12.95, 0.92, 5.45, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:04:11.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:04:11.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:04:11.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:04:10, diff=1.972705s, valid=True
2026-05-30T01:04:11.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:04:11.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:04:11.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:04:12, diff=-0.023923s, valid=True
2026-05-30T01:04:11.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:04:11.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:04:11.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:04:09, diff=2.984151s, valid=True
2026-05-30T01:04:11.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:04:11.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:04:11.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:04:11.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:04:11.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:04:11.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:04:11.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:04:12, diff=-0.01221s, valid=True
2026-05-30T01:04:11.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:04:11.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:04:11.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:04:11.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028493.988732s, valid=True
2026-05-30T01:04:11.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:04:11.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:04:11.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:04:11.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:04:11.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:04:12.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:04:12.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:04:12.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:04:12.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:04:12.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:04:12.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:04:12.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:04:12.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:04:12.387 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:04:12.611 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:04:12.981 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:04:13.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:04:13.083 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:04:13.083 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:04:13.281 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:04:13.281 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:04:43.311 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:04:43.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:04:43.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:04:43.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:04:43.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:04:43.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:04:43.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-05-30T01:04:43.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:04:43.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-05-30T01:04:43.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:04:43.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:04:43.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:04:43.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-05-30T01:04: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-05-30T01:04:46.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:04:46.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:04:46.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:04:46.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:04:46.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:04:46.052 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:04:46.052 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:04:46.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:04:46.053 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:04:46.053 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:04:46.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:04:46.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:04:46.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:04:46.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:04:46.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:04:46.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T01:04:46.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:04:46.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T01:04:46.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:04:46.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:04:46.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:04:46.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:04:46.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:04:41
2026-05-30T01:04:46.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73337, datetime.datetime(2026, 5, 30, 1, 4, 41), datetime.datetime(2026, 5, 30, 1, 4, 40), 'salt', 9.03, 68.92, None, 13.37, 349.3, 5.39, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:04:46.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:04:46.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:04:46.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:04:40, diff=6.391865s, valid=True
2026-05-30T01:04:46.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:04:46.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T01:04:46.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:05:12, diff=-25.605319s, valid=True
2026-05-30T01:04:46.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:04:46.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:04:46.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:04:39, diff=7.401442s, valid=True
2026-05-30T01:04:46.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:04:46.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:04:46.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:04:46.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:04:46.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:04:46.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T01:04:46.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:05:12, diff=-25.595557s, valid=True
2026-05-30T01:04:46.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:04:46.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:04:46.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:04:46.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028528.405117s, valid=True
2026-05-30T01:04:46.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:04:46.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:04:46.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:04:46.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:04:46.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:04:46.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:04:46.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:04:46.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:04:46.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:04:46.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:04:46.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:04:46.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:04:46.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:04:46.729 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:04:46.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:04:47.315 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:04:47.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:04:47.416 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:04:47.417 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:04:47.616 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:04:47.616 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:05:17.632 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:05:17.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:05:17.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:05:17.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:05:17.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:05:17.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:05:17.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-05-30T01:05:17.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:05:17.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T01:05:18.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:05:18.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:05:18.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:05:18.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T01:05:21.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-05-30T01:05:21.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:05:21.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:05:21.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:05:21.018 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:05:21.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:05:21.024 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:05:21.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:05:21.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:05:21.024 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:05:21.024 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:05:21.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:05:21.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:05:21.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:05:21.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:05:21.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:05:21.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:05:21.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:05:21.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:05:21.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:05:21.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:05:21.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:05:21.293 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:05:21.352 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:05:11
2026-05-30T01:05:21.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73338, datetime.datetime(2026, 5, 30, 1, 5, 11), datetime.datetime(2026, 5, 30, 1, 5, 11), 'salt', 9.13, 68.59, None, 14.43, 349.68, 5.47, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:05:21.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:05:21.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:05:21.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:05:11, diff=10.359955s, valid=True
2026-05-30T01:05:21.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:05:21.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:05:21.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:05:12, diff=9.362855s, valid=True
2026-05-30T01:05:21.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:05:21.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:05:21.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:05:09, diff=12.370387s, valid=True
2026-05-30T01:05:21.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:05:21.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:05:21.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:05:21.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:05:21.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:05:21.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:05:21.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:05:12, diff=9.37393s, valid=True
2026-05-30T01:05:21.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:05:21.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:05:21.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:05:21.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028563.374922s, valid=True
2026-05-30T01:05:21.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:05:21.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:05:21.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:05:21.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:05:21.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:05:21.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:05:21.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:05:21.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:05:21.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:05:21.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:05:21.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:05:21.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:05:21.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:05:21.733 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:05:21.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:05:22.326 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:05:22.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:05:22.437 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:05:22.437 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:05:22.717 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:05:22.717 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:05:52.747 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:05:52.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:05:52.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:05:52.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:05:52.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:05:53.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:05:53.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-05-30T01:05:53.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:05:53.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-05-30T01:05:53.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:05:53.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:05:53.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:05:53.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-05-30T01:05:56.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-05-30T01:05:56.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:05:56.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:05:56.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:05:56.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:05:56.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:05:56.387 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:05:56.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:05:56.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:05:56.387 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:05:56.387 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:05:56.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:05:56.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:05:56.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:05:56.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:05:56.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:05:56.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T01:05:56.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:05:56.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T01:05:56.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:05:56.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:05:56.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:05:56.661 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:05:56.722 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:05:41
2026-05-30T01:05:56.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73339, datetime.datetime(2026, 5, 30, 1, 5, 41), datetime.datetime(2026, 5, 30, 1, 5, 41), 'salt', 9.1, 68.55, None, 16.48, 14.96, 5.47, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:05:56.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:05:56.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:05:56.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:05:41, diff=15.728246s, valid=True
2026-05-30T01:05:56.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:05:56.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T01:05:56.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:06:12, diff=-15.268898s, valid=True
2026-05-30T01:05:56.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:05:56.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:05:56.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:05:40, diff=16.73809s, valid=True
2026-05-30T01:05:56.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:05:56.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:05:56.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:05:56.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:05:56.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:05:56.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T01:05:56.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:06:12, diff=-15.258872s, valid=True
2026-05-30T01:05:56.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:05:56.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:05:56.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:05:56.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028598.741797s, valid=True
2026-05-30T01:05:56.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:05:56.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:05:56.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:05:56.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:05:56.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:05:56.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:05:56.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:05:56.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:05:56.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:05:56.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:05:56.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:05:56.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:05:57.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:05:57.075 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:05:57.296 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:05:57.654 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:05:57.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:05:57.817 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:05:57.817 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:05:58.009 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:05:58.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:06:28.039 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:06:28.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:06:28.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:06:28.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:06:28.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:06:28.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:06:28.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-05-30T01:06:28.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:06:28.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-05-30T01:06:28.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:06:28.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:06:28.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:06:28.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-05-30T01:06:31.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T01:06:31.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:06:31.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:06:31.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:06:31.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:06:31.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:06:31.139 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:06:31.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:06:31.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:06:31.140 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:06:31.140 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:06:31.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:06:31.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:06:31.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:06:31.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:06:31.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:06:31.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:06:31.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:06:31.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:06:31.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:06:31.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:06:31.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:06:31.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:06:31.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:06:11
2026-05-30T01:06:31.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73340, datetime.datetime(2026, 5, 30, 1, 6, 11), datetime.datetime(2026, 5, 30, 1, 6, 11), 'salt', 9.03, 69.12, None, 16.2, 17.59, 5.35, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:06:31.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:06:31.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:06:31.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:06:11, diff=20.516069s, valid=True
2026-05-30T01:06:31.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:06:31.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:06:31.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:06:12, diff=19.518926s, valid=True
2026-05-30T01:06:31.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:06:31.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:06:31.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:06:10, diff=21.525713s, valid=True
2026-05-30T01:06:31.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:06:31.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:06:31.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:06:31.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:06:31.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:06:31.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:06:31.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:06:12, diff=19.528736s, valid=True
2026-05-30T01:06:31.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:06:31.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:06:31.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:06:31.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028633.529402s, valid=True
2026-05-30T01:06:31.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:06:31.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:06:31.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:06:31.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:06:31.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:06:31.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:06:31.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:06:31.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:06:31.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:06:31.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:06:31.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:06:31.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:06:31.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:06:31.852 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:06:32.083 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:06:32.434 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:06:32.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:06:32.535 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:06:32.535 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:06:32.732 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:06:32.732 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:07:02.754 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:07:02.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:07:02.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:07:03.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:07:03.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:07:03.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:07:03.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-05-30T01:07:03.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:07:03.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-05-30T01:07:03.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:07:03.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:07:03.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:07:03.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-05-30T01:07:47.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T01:07:47.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:07:47.253 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:07:47.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:07:47.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:07:47.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:07:47.279 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:07:47.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:07:47.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:07:47.279 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:07:47.279 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:07:47.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:07:47.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:07:47.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:07:47.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:07:47.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:07:47.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T01:07:47.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:07:47.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T01:07:47.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:07:47.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:07:47.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:07:47.559 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:07:47.625 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:07:42
2026-05-30T01:07:47.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73343, datetime.datetime(2026, 5, 30, 1, 7, 42), datetime.datetime(2026, 5, 30, 1, 7, 41), 'salt', 8.76, 70.05, None, 15.88, 352.38, 5.15, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:07:47.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:07:47.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:07:47.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:07:41, diff=6.63192s, valid=True
2026-05-30T01:07:47.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:07:47.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T01:07:47.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:08:12, diff=-24.365106s, valid=True
2026-05-30T01:07:47.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:07:47.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:07:47.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:07:41, diff=6.642116s, valid=True
2026-05-30T01:07:47.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:07:47.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:07:47.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:07:47.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:07:47.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:07:47.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T01:07:47.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:08:12, diff=-24.354705s, valid=True
2026-05-30T01:07:47.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:07:47.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:07:47.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:07:47.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028709.646006s, valid=True
2026-05-30T01:07:47.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:07:47.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:07:47.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:07:47.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:07:47.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:07:47.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:07:47.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:07:47.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:07:47.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:07:47.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:07:47.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:07:47.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:07:47.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:07:47.982 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:07:48.292 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:07:48.652 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:07:48.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:07:48.760 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:07:48.760 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:07:49.007 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:07:49.007 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:08:19.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:08:19.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:08:19.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:08:19.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:08:19.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:08:19.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:08:19.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-05-30T01:08:19.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:08:19.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-05-30T01:08:19.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:08:19.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:08:19.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:08:19.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T01:08:22.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-05-30T01:08:22.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:08:22.278 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:08:22.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:08:22.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:08:22.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:08:22.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:08:22.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:08:22.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:08:22.299 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:08:22.299 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:08:22.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:08:22.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:08:22.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:08:22.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:08:22.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:08:22.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:08:22.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:08:22.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:08:22.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:08:22.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:08:22.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:08:22.569 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:08:22.631 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:08:12
2026-05-30T01:08:22.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73344, datetime.datetime(2026, 5, 30, 1, 8, 12), datetime.datetime(2026, 5, 30, 1, 8, 12), 'salt', 8.76, 70.38, None, 14.54, 6.67, 5.08, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:08:22.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:08:22.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:08:22.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:08:12, diff=10.637778s, valid=True
2026-05-30T01:08:22.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:08:22.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:08:22.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:08:12, diff=10.640546s, valid=True
2026-05-30T01:08:22.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:08:22.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:08:22.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:08:11, diff=11.647344s, valid=True
2026-05-30T01:08:22.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:08:22.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:08:22.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:08:22.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:08:22.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:08:22.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:08:22.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:08:12, diff=10.651222s, valid=True
2026-05-30T01:08:22.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:08:22.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:08:22.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:08:22.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028744.651929s, valid=True
2026-05-30T01:08:22.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:08:22.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:08:22.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:08:22.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:08:22.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:08:22.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:08:22.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:08:22.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:08:22.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:08:22.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:08:22.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:08:22.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:08:22.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:08:22.980 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:08:23.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:08:23.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:08:23.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:08:23.672 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:08:23.672 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:08:23.870 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:08:23.870 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:08:53.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:08:53.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:08:53.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:08:54.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:08:54.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:08:54.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:08:54.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-05-30T01:08:54.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:08:54.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-05-30T01:08:54.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:08:54.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:08:54.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:08: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-05-30T01:08:57.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-05-30T01:08:57.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:08:57.742 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:08:57.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:08:57.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:08:57.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:08:57.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:08:57.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:08:57.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:08:57.777 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:08:57.777 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:08:57.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:08:57.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:08:57.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:08:57.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:08:57.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:08:58.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T01:08:58.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:08:58.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T01:08:58.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:08:58.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:08:58.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:08:58.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:08:58.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:08:43
2026-05-30T01:08:58.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73345, datetime.datetime(2026, 5, 30, 1, 8, 43), datetime.datetime(2026, 5, 30, 1, 8, 42), 'salt', 8.73, 70.48, None, 13.8, 17.87, 5.06, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:08:58.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:08:58.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:08:58.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:08:42, diff=16.131168s, valid=True
2026-05-30T01:08:58.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:08:58.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T01:08:58.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:09:12, diff=-13.865778s, valid=True
2026-05-30T01:08:58.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:08:58.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:08:58.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:08:41, diff=17.142426s, valid=True
2026-05-30T01:08:58.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:08:58.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:08:58.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:08:58.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:08:58.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:08:58.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T01:08:58.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:09:12, diff=-13.85359s, valid=True
2026-05-30T01:08:58.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:08:58.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:08:58.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:08:58.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028780.147115s, valid=True
2026-05-30T01:08:58.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:08:58.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:08:58.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:08:58.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:08:58.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:08:58.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:08:58.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:08:58.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:08:58.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:08:58.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:08:58.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:08:58.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:08:58.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:08:58.650 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:08:58.878 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:08:59.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:08:59.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:08:59.355 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:08:59.355 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:08:59.596 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:08:59.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:09:29.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:09:29.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:09:29.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:09:29.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:09:29.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:09:30.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:09:30.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-05-30T01:09:30.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:09:30.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-05-30T01:09:30.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:09:30.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:09:30.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:09: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-05-30T01:09:33.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-05-30T01:09:33.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:09:33.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:09:33.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:09:33.252 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:09:33.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:09:33.264 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:09:33.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:09:33.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:09:33.265 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:09:33.265 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:09:33.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:09:33.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:09:33.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:09:33.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:09:33.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:09:33.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:09:33.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:09:33.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:09:33.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:09:33.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:09:33.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:09:33.532 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:09:33.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:09:13
2026-05-30T01:09:33.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73346, datetime.datetime(2026, 5, 30, 1, 9, 13), datetime.datetime(2026, 5, 30, 1, 9, 12), 'salt', 8.76, 70.15, None, 14.72, 18.18, 5.13, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:09:33.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:09:33.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:09:33.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:09:12, diff=21.600532s, valid=True
2026-05-30T01:09:33.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:09:33.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:09:33.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:09:12, diff=21.603353s, valid=True
2026-05-30T01:09:33.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:09:33.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:09:33.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:09:11, diff=22.610115s, valid=True
2026-05-30T01:09:33.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:09:33.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:09:33.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:09:33.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:09:33.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:09:33.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:09:33.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:09:12, diff=21.613151s, valid=True
2026-05-30T01:09:33.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:09:33.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:09:33.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:09:33.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028815.613839s, valid=True
2026-05-30T01:09:33.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:09:33.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:09:33.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:09:33.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:09:33.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:09:33.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:09:33.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:09:33.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:09:33.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:09:33.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:09:33.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:09:33.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:09:33.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:09:33.930 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:09:34.163 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:09:34.507 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:09:34.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:09:34.607 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:09:34.607 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:09:34.809 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:09:34.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:10:04.835 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:10:04.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:10:04.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:10:05.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:10:05.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:10:05.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:10:05.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-05-30T01:10:05.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:10:05.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-05-30T01:10:05.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:10:05.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:10:05.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:10:05.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-05-30T01:10: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-05-30T01:10:08.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:10:08.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:10:08.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:10:08.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:10:08.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:10:08.120 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:10:08.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:10:08.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:10:08.120 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:10:08.120 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:10:08.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:10:08.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:10:08.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:10:08.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:10:08.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:10:08.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T01:10:08.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:10:08.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T01:10:08.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:10:08.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:10:08.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:10:08.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:10:08.440 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:09:43
2026-05-30T01:10:08.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73347, datetime.datetime(2026, 5, 30, 1, 9, 43), datetime.datetime(2026, 5, 30, 1, 9, 42), 'salt', 8.8, 70.31, None, 13.83, 4.42, 5.1, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:10:08.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:10:08.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:10:08.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:09:42, diff=26.446642s, valid=True
2026-05-30T01:10:08.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:10:08.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T01:10:08.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:10:12, diff=-3.550527s, valid=True
2026-05-30T01:10:08.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:10:08.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:10:08.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:09:42, diff=26.456157s, valid=True
2026-05-30T01:10:08.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:10:08.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:10:08.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:10:08.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:10:08.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:10:08.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T01:10:08.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:10:12, diff=-3.540806s, valid=True
2026-05-30T01:10:08.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:10:08.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:10:08.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:10:08.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028850.45987s, valid=True
2026-05-30T01:10:08.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:10:08.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:10:08.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:10:08.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:10:08.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:10:08.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:10:08.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:10:08.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:10:08.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:10:08.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:10:08.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:10:08.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:10:08.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:10:08.845 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:10:09.063 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:10:09.409 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:10:09.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:10:09.510 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:10:09.510 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:10:09.710 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:10:09.711 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:10:39.728 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:10:39.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:10:39.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:10:39.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:10:39.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:10:40.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:10:40.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-05-30T01:10:40.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:10:40.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-05-30T01:10:40.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:10:40.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:10:40.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:10:40.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-05-30T01:10:44.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-05-30T01:10:44.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:10:44.139 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:10:44.139 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:10:44.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:10:44.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:10:44.163 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:10:44.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:10:44.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:10:44.164 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:10:44.164 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:10:44.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:10:44.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:10:44.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:10:44.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:10:44.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:10:44.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T01:10:44.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:10:44.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T01:10:44.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:10:44.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:10:44.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:10:44.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:10:44.494 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:10:44
2026-05-30T01:10:44.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73349, datetime.datetime(2026, 5, 30, 1, 10, 44), datetime.datetime(2026, 5, 30, 1, 10, 43), 'salt', 8.76, 70.44, None, 11.82, 351.2, 5.07, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:10:44.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:10:44.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:10:44.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:10:43, diff=1.501116s, valid=True
2026-05-30T01:10:44.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:10:44.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T01:10:44.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:11:12, diff=-27.494843s, valid=True
2026-05-30T01:10:44.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:10:44.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:10:44.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:10:42, diff=2.512726s, valid=True
2026-05-30T01:10:44.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:10:44.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:10:44.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:10:44.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:10:44.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:10:44.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T01:10:44.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:11:12, diff=-27.483891s, valid=True
2026-05-30T01:10:44.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:10:44.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:10:44.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:10:44.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028886.516859s, valid=True
2026-05-30T01:10:44.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:10:44.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:10:44.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:10:44.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:10:44.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:10:44.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:10:44.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:10:44.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:10:44.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:10:44.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:10:44.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:10:44.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:10:44.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:10:44.869 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:10:45.092 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:10:45.449 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:10:45.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:10:45.561 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:10:45.561 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:10:45.757 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:10:45.757 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:11:15.766 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:11:15.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:11:15.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:11:16.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:11:16.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:11:16.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:11:16.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-05-30T01:11:16.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:11:16.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-05-30T01:11:16.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:11:16.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:11:16.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:11:16.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-05-30T01:11:18.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-05-30T01:11:18.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:11:18.552 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:11:18.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:11:18.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:11:18.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:11:18.574 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:11:18.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:11:18.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:11:18.574 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:11:18.574 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:11:18.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:11:18.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:11:18.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:11:18.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:11:18.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:11:18.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:11:18.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:11:18.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 657 rows from lcogt
2026-05-30T01:11:18.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:11:18.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:11:18.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:11:18.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:11:18.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:11:14
2026-05-30T01:11:18.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73350, datetime.datetime(2026, 5, 30, 1, 11, 14), datetime.datetime(2026, 5, 30, 1, 11, 13), 'salt', 8.76, 70.28, None, 12.99, 352.75, 5.1, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:11:18.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:11:18.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:11:18.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:11:13, diff=5.891801s, valid=True
2026-05-30T01:11:18.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:11:18.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:11:18.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:11:12, diff=6.894614s, valid=True
2026-05-30T01:11:18.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:11:18.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:11:18.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:11:13, diff=5.901384s, valid=True
2026-05-30T01:11:18.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:11:18.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:11:18.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:11:18.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:11:18.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:11:18.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 657 rows. Structure expected: 10 fields
2026-05-30T01:11:18.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:11:12, diff=6.904426s, valid=True
2026-05-30T01:11:18.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:11:18.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:11:18.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:11:18.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028920.905098s, valid=True
2026-05-30T01:11:18.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:11:18.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:11:18.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:11:18.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:11:18.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:11:18.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:11:18.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:11:18.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:11:18.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:11:19.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:11:19.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:11:19.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:11:19.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:11:19.288 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:11:19.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:11:19.880 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:11:19.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:11:19.990 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:11:19.990 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:11:20.197 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:11:20.197 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:11:50.225 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:11:50.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:11:50.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:11:50.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:11:50.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:11:50.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:11:50.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T01:11:50.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:11:50.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-05-30T01:11:50.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:11:50.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:11:50.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:11:50.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-05-30T01:12:27.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-05-30T01:12:27.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:12:27.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:12:27.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:12:27.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:12:27.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:12:27.278 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:12:27.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:12:27.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:12:27.279 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:12:27.279 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:12:27.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:12:27.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:12:27.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:12:27.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:12:27.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:12:27.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T01:12:27.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:12:27.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T01:12:27.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:12:27.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:12:27.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:12:27.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:12:27.601 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:12:14
2026-05-30T01:12:27.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73352, datetime.datetime(2026, 5, 30, 1, 12, 14), datetime.datetime(2026, 5, 30, 1, 12, 14), 'salt', 8.83, 70.61, None, 11.96, 330.66, 5.04, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:12:27.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:12:27.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:12:27.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:12:14, diff=13.608163s, valid=True
2026-05-30T01:12:27.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:12:27.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T01:12:27.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:12:12, diff=15.610974s, valid=True
2026-05-30T01:12:27.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:12:27.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:12:27.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:12:14, diff=13.617726s, valid=True
2026-05-30T01:12:27.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:12:27.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:12:27.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:12:27.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:12:27.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:12:27.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T01:12:27.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:12:12, diff=15.620719s, valid=True
2026-05-30T01:12:27.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:12:27.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:12:27.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:12:27.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1028989.621383s, valid=True
2026-05-30T01:12:27.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:12:27.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:12:27.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:12:27.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:12:27.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:12:27.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:12:27.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:12:27.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:12:27.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:12:27.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:12:27.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:12:27.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:12:27.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:12:27.952 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:12:28.180 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:12:28.539 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:12:28.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:12: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-05-30T01:12: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-05-30T01:12:28.841 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:12:28.841 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:12:58.871 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:12:58.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:12:58.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:12:59.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:12:59.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:12:59.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:12:59.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-05-30T01:12:59.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:12:59.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-05-30T01:12:59.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:12:59.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:12:59.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:12:59.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-05-30T01:13:02.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-05-30T01:13:02.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:13:02.975 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:13:02.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:13:02.983 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:13:02.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:13:02.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:13:02.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:13:02.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:13:02.995 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:13:02.995 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:13:03.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:13:03.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:13:03.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:13:03.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:13:03.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:13:03.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T01:13:03.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:13:03.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T01:13:03.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:13:03.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:13:03.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:13:03.344 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:13:03.406 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:12:44
2026-05-30T01:13:03.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73353, datetime.datetime(2026, 5, 30, 1, 12, 44), datetime.datetime(2026, 5, 30, 1, 12, 44), 'salt', 8.76, 70.84, None, 13.41, 2.42, 4.99, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:13:03.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:13:03.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:13:03.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:12:44, diff=19.412792s, valid=True
2026-05-30T01:13:03.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:13:03.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T01:13:03.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:13:12, diff=-8.584223s, valid=True
2026-05-30T01:13:03.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:13:03.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:13:03.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:12:43, diff=20.422858s, valid=True
2026-05-30T01:13:03.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:13:03.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:13:03.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:13:03.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:13:03.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:13:03.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T01:13:03.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:13:12, diff=-8.574021s, valid=True
2026-05-30T01:13:03.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:13:03.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:13:03.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:13:03.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029025.426802s, valid=True
2026-05-30T01:13:03.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:13:03.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:13:03.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:13:03.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:13:03.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:13:03.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:13:03.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:13:03.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:13:03.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:13:03.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:13:03.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:13:03.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:13:03.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:13:03.769 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:13:04.018 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:13:04.433 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:13:04.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:13:04.552 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:13:04.552 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:13:04.741 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:13:04.741 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:13:34.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:13:34.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:13:34.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:13:35.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:13:35.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:13:35.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:13:35.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-05-30T01:13:35.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:13:35.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-05-30T01:13:35.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:13:35.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:13:35.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:13:35.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-05-30T01:13:38.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-05-30T01:13:38.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:13:38.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:13:38.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:13:38.326 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:13:38.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:13:38.338 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:13:38.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:13:38.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:13:38.338 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:13:38.338 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:13:38.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:13:38.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:13:38.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:13:38.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:13:38.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:13:38.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T01:13:38.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:13:38.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T01:13:38.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:13:38.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:13:38.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:13:38.601 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:13:38.661 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:13:15
2026-05-30T01:13:38.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73354, datetime.datetime(2026, 5, 30, 1, 13, 15), datetime.datetime(2026, 5, 30, 1, 13, 14), 'salt', 8.76, 70.38, None, 12.03, 3.62, 5.08, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:13:38.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:13:38.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:13:38.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:13:14, diff=24.66771s, valid=True
2026-05-30T01:13:38.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:13:38.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T01:13:38.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:13:12, diff=26.670492s, valid=True
2026-05-30T01:13:38.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:13:38.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:13:38.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:13:14, diff=24.677046s, valid=True
2026-05-30T01:13:38.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:13:38.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:13:38.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:13:38.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:13:38.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:13:38.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T01:13:38.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:13:12, diff=26.68001s, valid=True
2026-05-30T01:13:38.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:13:38.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:13:38.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:13:38.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029060.680687s, valid=True
2026-05-30T01:13:38.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:13:38.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:13:38.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:13:38.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:13:38.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:13:38.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:13:38.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:13:38.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:13:38.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:13:38.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:13:38.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:13:38.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:13:38.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:13:39.026 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:13:39.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:13:39.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:13:39.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:13:39.783 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:13:39.783 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:13:39.980 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:13:39.980 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:14:10.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:14:10.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:14:10.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:14:10.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:14:10.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:14:10.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:14:10.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-05-30T01:14:10.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:14:10.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-05-30T01:14:10.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:14:10.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:14:10.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:14:10.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-05-30T01:14:13.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-05-30T01:14:13.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:14:13.213 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:14:13.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:14:13.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:14:13.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:14:13.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:14:13.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:14:13.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:14:13.237 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:14:13.237 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:14:13.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:14:13.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:14:13.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:14:13.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:14:13.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:14:13.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T01:14:13.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:14:13.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T01:14:13.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:14:13.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:14:13.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:14:13.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:14:13.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:13:45
2026-05-30T01:14:13.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73355, datetime.datetime(2026, 5, 30, 1, 13, 45), datetime.datetime(2026, 5, 30, 1, 13, 44), 'salt', 8.73, 70.11, None, 11.96, 10.66, 5.14, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:14:13.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:14:13.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:14:13.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:13:44, diff=29.555943s, valid=True
2026-05-30T01:14:13.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:14:13.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T01:14:13.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:14:12, diff=1.558747s, valid=True
2026-05-30T01:14:13.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:14:13.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:14:13.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:13:44, diff=29.565378s, valid=True
2026-05-30T01:14:13.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:14:13.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:14:13.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:14:13.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:14:13.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:14:13.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T01:14:13.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:14:12, diff=1.568411s, valid=True
2026-05-30T01:14:13.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:14:13.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:14:13.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:14:13.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029095.569106s, valid=True
2026-05-30T01:14:13.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:14:13.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:14:13.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:14:13.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:14:13.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:14:13.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:14:13.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:14:13.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:14:13.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:14:13.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:14:13.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:14:13.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:14:13.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:14:13.885 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:14:14.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:14:14.485 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:14:14.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:14:14.586 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:14:14.586 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:14:14.776 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:14:14.776 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:14:44.799 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:14:44.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:14:44.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:14:45.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:14:45.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:14:45.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:14:45.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-05-30T01:14:45.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:14:45.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-05-30T01:14:45.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:14:45.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:14:45.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:14:45.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-05-30T01:14:47.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-05-30T01:14:47.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:14:47.783 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:14:47.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:14:47.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:14:47.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:14:47.803 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:14:47.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:14:47.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:14:47.804 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:14:47.804 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:14:47.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:14:47.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:14:47.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:14:47.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:14:47.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:14:48.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T01:14:48.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:14:48.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T01:14:48.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:14:48.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:14:48.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:14:48.062 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:14:48.121 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:14:45
2026-05-30T01:14:48.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73357, datetime.datetime(2026, 5, 30, 1, 14, 45), datetime.datetime(2026, 5, 30, 1, 14, 45), 'salt', 8.83, 68.72, None, 12.81, 9.96, 5.42, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:14:48.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:14:48.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:14:48.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:14:45, diff=3.128014s, valid=True
2026-05-30T01:14:48.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:14:48.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T01:14:48.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:15:12, diff=-23.869144s, valid=True
2026-05-30T01:14:48.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:14:48.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:14:48.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:14:45, diff=3.137657s, valid=True
2026-05-30T01:14:48.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:14:48.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:14:48.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:14:48.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:14:48.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:14:48.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T01:14:48.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:15:12, diff=-23.859233s, valid=True
2026-05-30T01:14:48.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:14:48.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:14:48.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:14:48.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029130.141441s, valid=True
2026-05-30T01:14:48.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:14:48.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:14:48.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:14:48.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:14:48.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:14:48.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:14:48.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:14:48.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:14:48.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:14:48.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:14:48.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:14:48.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:14:48.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:14:48.478 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:14:48.701 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:14:49.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:14:49.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:14:49.238 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:14:49.238 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:14:49.428 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:14:49.428 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:15:19.447 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:15:19.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:15:19.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:15:19.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:15:19.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:15:19.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:15:19.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-05-30T01:15:19.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:15:19.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-05-30T01:15:19.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:15:19.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:15:19.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:15:19.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-05-30T01:15:22.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-05-30T01:15:22.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:15:22.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:15:22.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:15:22.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:15:22.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:15:22.318 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:15:22.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:15:22.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:15:22.318 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:15:22.318 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:15:22.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:15:22.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:15:22.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:15:22.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:15:22.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:15:22.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T01:15:22.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:15:22.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T01:15:22.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:15:22.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:15:22.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:15:22.586 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:15:22.645 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:15:16
2026-05-30T01:15:22.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73358, datetime.datetime(2026, 5, 30, 1, 15, 16), datetime.datetime(2026, 5, 30, 1, 15, 15), 'salt', 9.16, 67.29, None, 8.22, 344.35, 5.73, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:15:22.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:15:22.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:15:22.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:15:15, diff=7.652233s, valid=True
2026-05-30T01:15:22.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:15:22.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T01:15:22.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:15:12, diff=10.655224s, valid=True
2026-05-30T01:15:22.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:15:22.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:15:22.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:15:12, diff=10.662457s, valid=True
2026-05-30T01:15:22.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:15:22.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:15:22.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:15:22.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:15:22.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:15:22.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T01:15:22.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:15:12, diff=10.665597s, valid=True
2026-05-30T01:15:22.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:15:22.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:15:22.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:15:22.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029164.6663s, valid=True
2026-05-30T01:15:22.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:15:22.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:15:22.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:15:22.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:15:22.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:15:22.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:15:22.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:15:22.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:15:22.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:15:22.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:15:22.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:15:22.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:15:22.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:15:22.990 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:15:23.214 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:15:23.571 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:15:23.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:15:23.680 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:15:23.680 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:15:23.866 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:15:23.866 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:15:53.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:15:53.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:15:53.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:15:54.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:15:54.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:15:54.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:15:54.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-05-30T01:15:54.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:15:54.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T01:15:54.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:15:54.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:15:54.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:15:54.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-05-30T01:16:13.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-05-30T01:16:13.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:16:13.491 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:16:13.491 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:16:13.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:16:13.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:16:13.512 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:16:13.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:16:13.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:16:13.512 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:16:13.512 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:16:13.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:16:13.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:16:13.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:16:13.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:16:13.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:16:13.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T01:16:13.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:16:13.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T01:16:13.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:16:13.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:16:13.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:16:13.769 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:16:13.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:15:46
2026-05-30T01:16:13.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73359, datetime.datetime(2026, 5, 30, 1, 15, 46), datetime.datetime(2026, 5, 30, 1, 15, 45), 'salt', 9.1, 66.73, None, 10.02, 5.95, 5.86, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:16:13.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:16:13.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:16:13.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:15:45, diff=28.835004s, valid=True
2026-05-30T01:16:13.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:16:13.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T01:16:13.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:16:12, diff=1.837809s, valid=True
2026-05-30T01:16:13.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:16:13.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:16:13.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:15:43, diff=30.844428s, valid=True
2026-05-30T01:16:13.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:16:13.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:16:13.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:16:13.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:16:13.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:16:13.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T01:16:13.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:16:12, diff=1.847421s, valid=True
2026-05-30T01:16:13.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:16:13.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:16:13.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:16:13.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029215.848105s, valid=True
2026-05-30T01:16:13.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:16:13.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:16:13.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:16:13.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:16:13.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:16:13.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:16:13.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:16:13.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:16:13.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:16:13.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:16:14.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:16:14.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:16:14.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:16:14.176 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:16:14.474 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:16:14.825 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:16:14.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:16: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-05-30T01:16: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-05-30T01:16:15.155 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:16:15.156 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:16:45.183 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:16:45.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:16:45.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:16:45.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:16:45.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:16:45.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:16:45.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-05-30T01:16:45.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:16:45.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-05-30T01:16:45.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:16:45.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:16:45.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:16: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-05-30T01:16:48.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-05-30T01:16:48.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:16:48.978 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:16:48.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:16:48.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:16:48.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:16:48.997 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:16:48.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:16:48.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:16:48.998 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:16:48.998 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:16:49.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:16:49.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:16:49.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:16:49.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:16:49.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:16:49.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T01:16:49.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:16:49.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T01:16:49.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:16:49.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:16:49.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:16:49.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:16:49.325 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:16:46
2026-05-30T01:16:49.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73361, datetime.datetime(2026, 5, 30, 1, 16, 46), datetime.datetime(2026, 5, 30, 1, 16, 46), 'salt', 9.66, 65.23, None, 11.19, 3.39, 6.2, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:16:49.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:16:49.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:16:49.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:16:46, diff=3.331824s, valid=True
2026-05-30T01:16:49.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:16:49.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T01:16:49.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:17:12, diff=-22.664907s, valid=True
2026-05-30T01:16:49.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:16:49.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:16:49.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:16:46, diff=3.341746s, valid=True
2026-05-30T01:16:49.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:16:49.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:16:49.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:16:49.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:16:49.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:16:49.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T01:16:49.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:17:12, diff=-22.655225s, valid=True
2026-05-30T01:16:49.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:16:49.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:16:49.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:16:49.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029251.345427s, valid=True
2026-05-30T01:16:49.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:16:49.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:16:49.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:16:49.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:16:49.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:16:49.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:16:49.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:16:49.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:16:49.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:16:49.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:16:49.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:16:49.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:16:49.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:16:49.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:16:49.900 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:16:50.318 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:16:50.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:16:50.422 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:16:50.422 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:16:50.606 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:16:50.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:17:20.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:17:20.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:17:20.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:17:20.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:17:20.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:17:21.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:17:21.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-05-30T01:17:21.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:17:21.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-05-30T01:17:21.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:17:21.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:17:21.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:17:21.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-05-30T01:17:45.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-05-30T01:17:45.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:17:45.461 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:17:45.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:17:45.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:17:45.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:17:45.484 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:17:45.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:17:45.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:17:45.485 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:17:45.485 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:17:45.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:17:45.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:17:45.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:17:45.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:17:45.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:17:45.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T01:17:45.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:17:45.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T01:17:45.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:17:45.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:17:45.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:17:45.737 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:17:45.798 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:17:17
2026-05-30T01:17:45.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73362, datetime.datetime(2026, 5, 30, 1, 17, 17), datetime.datetime(2026, 5, 30, 1, 17, 16), 'salt', 9.66, 64.97, None, 9.92, 347.43, 6.26, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:17:45.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:17:45.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:17:45.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:17:16, diff=29.804306s, valid=True
2026-05-30T01:17:45.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:17:45.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T01:17:45.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:17:12, diff=33.80717s, valid=True
2026-05-30T01:17:45.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:17:45.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:17:45.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:17:07, diff=38.813852s, valid=True
2026-05-30T01:17:45.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:17:45.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:17:45.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:17:45.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:17:45.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:17:45.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T01:17:45.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:17:12, diff=33.816853s, valid=True
2026-05-30T01:17:45.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:17:45.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:17:45.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:17:45.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029307.817511s, valid=True
2026-05-30T01:17:45.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:17:45.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:17:45.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:17:45.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:17:45.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:17:45.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:17:45.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:17:45.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:17:45.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:17:45.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:17:46.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:17:46.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:17:46.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:17:46.213 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:17:46.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:17:46.810 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:17:46.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:17:46.912 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:17:46.912 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:17:47.169 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:17:47.169 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:18:17.199 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:18:17.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:18:17.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:18:17.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:18:17.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:18:17.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:18:17.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-05-30T01:18:17.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:18:17.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-05-30T01:18:17.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:18:17.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:18:17.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:18:17.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-05-30T01:18:20.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-05-30T01:18:20.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:18:20.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:18:20.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:18:20.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:18:20.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:18:20.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:18:20.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:18:20.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:18:20.951 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:18:20.951 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:18:20.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:18:21.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:18:21.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:18:21.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:18:21.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:18:21.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T01:18:21.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:18:21.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T01:18:21.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:18:21.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:18:21.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:18:21.200 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:18:21.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:18:17
2026-05-30T01:18:21.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73364, datetime.datetime(2026, 5, 30, 1, 18, 17), datetime.datetime(2026, 5, 30, 1, 18, 17), 'salt', 9.73, 62.78, None, 8.82, 346.3, 6.75, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:18:21.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:18:21.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:18:21.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:18:17, diff=4.266892s, valid=True
2026-05-30T01:18:21.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:18:21.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T01:18:21.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:18:12, diff=9.269699s, valid=True
2026-05-30T01:18:21.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:18:21.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:18:21.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:18:10, diff=11.276457s, valid=True
2026-05-30T01:18:21.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:18:21.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:18:21.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:18:21.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:18:21.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:18:21.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T01:18:21.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:18:12, diff=9.279506s, valid=True
2026-05-30T01:18:21.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:18:21.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:18:21.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:18:21.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029343.280171s, valid=True
2026-05-30T01:18:21.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:18:21.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:18:21.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:18:21.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:18:21.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:18:21.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:18:21.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:18:21.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:18:21.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:18:21.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:18:21.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:18:21.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:18:21.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:18:21.599 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:18:21.816 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:18:22.162 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:18:22.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:18:22.265 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:18:22.265 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:18:22.657 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:18:22.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:18:52.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:18:52.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:18:52.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:18:53.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:18:53.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:18:53.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:18:53.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-05-30T01:18:53.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:18:53.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-05-30T01:18:53.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:18:53.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:18:53.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:18:53.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-05-30T01:18:55.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-05-30T01:18:55.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:18:55.797 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:18:55.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:18:55.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:18:55.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:18:55.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:18:55.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:18:55.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:18:55.818 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:18:55.818 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:18:55.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:18:55.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:18:55.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:18:55.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:18:55.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:18:56.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T01:18:56.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:18:56.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T01:18:56.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:18:56.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:18:56.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:18:56.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:18:56.148 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:18:47
2026-05-30T01:18:56.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73365, datetime.datetime(2026, 5, 30, 1, 18, 47), datetime.datetime(2026, 5, 30, 1, 18, 47), 'salt', 9.96, 61.72, None, 13.66, 352.26, 7.0, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:18:56.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:18:56.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:18:56.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:18:47, diff=9.15466s, valid=True
2026-05-30T01:18:56.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:18:56.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T01:18:56.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:19:12, diff=-15.842573s, valid=True
2026-05-30T01:18:56.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:18:56.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:18:56.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:18:41, diff=15.16412s, valid=True
2026-05-30T01:18:56.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:18:56.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:18:56.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:18:56.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:18:56.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:18:56.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T01:18:56.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:19:12, diff=-15.83291s, valid=True
2026-05-30T01:18:56.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:18:56.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:18:56.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:18:56.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029378.167747s, valid=True
2026-05-30T01:18:56.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:18:56.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:18:56.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:18:56.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:18:56.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:18:56.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:18:56.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:18:56.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:18:56.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:18:56.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:18:56.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:18:56.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:18:56.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:18:56.561 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:18:56.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:18:57.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:18:57.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:18:57.228 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:18:57.228 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:18:57.423 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:18:57.424 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:19:27.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:19:27.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:19:27.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:19:27.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:19:27.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:19:28.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:19:28.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-05-30T01:19:28.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:19:28.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-05-30T01:19:28.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:19:28.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:19:28.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:19:28.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-05-30T01:20:07.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-05-30T01:20:07.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:20:07.107 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:20:07.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:20:07.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:20:07.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:20:07.135 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:20:07.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:20:07.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:20:07.136 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:20:07.136 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:20:07.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:20:07.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:20:07.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:20:07.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:20:07.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:20:07.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T01:20:07.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:20:07.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T01:20:07.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:20:07.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:20:07.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:20:07.418 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:20:07.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:19:48
2026-05-30T01:20:07.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73367, datetime.datetime(2026, 5, 30, 1, 19, 48), datetime.datetime(2026, 5, 30, 1, 19, 47), 'salt', 10.09, 60.92, None, 11.12, 347.64, 7.19, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:20:07.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:20:07.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:20:07.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:19:47, diff=20.489337s, valid=True
2026-05-30T01:20:07.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:20:07.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T01:20:07.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:20:12, diff=-4.50783s, valid=True
2026-05-30T01:20:07.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:20:07.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:20:07.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:19:44, diff=23.498835s, valid=True
2026-05-30T01:20:07.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:20:07.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:20:07.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:20:07.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:20:07.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:20:07.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T01:20:07.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:20:12, diff=-4.498125s, valid=True
2026-05-30T01:20:07.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:20:07.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:20:07.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:20:07.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029449.502534s, valid=True
2026-05-30T01:20:07.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:20:07.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:20:07.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:20:07.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:20:07.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:20:07.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:20:07.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:20:07.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:20:07.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:20:07.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:20:07.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:20:07.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:20:07.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:20:07.817 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:20:08.029 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:20:08.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:20:08.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:20:08.474 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:20:08.474 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:20:08.661 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:20:08.662 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:20:38.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:20:38.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:20:38.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:20:39.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:20:39.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:20:39.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:20:39.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T01:20:39.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:20:39.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-05-30T01:20:39.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:20:39.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:20:39.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:20:39.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-05-30T01:20:41.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-05-30T01:20:41.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:20:41.922 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:20:41.922 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:20:41.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:20:41.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:20:41.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:20:41.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:20:41.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:20:41.942 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:20:41.942 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:20:41.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:20:42.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:20:42.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:20:42.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:20:42.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:20:42.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T01:20:42.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:20:42.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T01:20:42.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:20:42.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:20:42.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:20:42.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:20:42.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:20:18
2026-05-30T01:20:42.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73368, datetime.datetime(2026, 5, 30, 1, 20, 18), datetime.datetime(2026, 5, 30, 1, 20, 18), 'salt', 10.16, 60.36, None, 10.41, 341.09, 7.33, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:20:42.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:20:42.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:20:42.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:20:18, diff=24.284943s, valid=True
2026-05-30T01:20:42.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:20:42.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T01:20:42.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:20:12, diff=30.289143s, valid=True
2026-05-30T01:20:42.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:20:42.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:20:42.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:20:16, diff=26.29932s, valid=True
2026-05-30T01:20:42.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:20:42.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:20:42.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:20:42.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:20:42.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:20:42.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T01:20:42.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:20:12, diff=30.302983s, valid=True
2026-05-30T01:20:42.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:20:42.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:20:42.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:20:42.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029484.304137s, valid=True
2026-05-30T01:20:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:20:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:20:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:20:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:20:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:20:42.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:20:42.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:20:42.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:20:42.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:20:42.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:20:42.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:20:42.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:20:42.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:20:42.643 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:20:42.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:20:43.210 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:20:43.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:20:43.310 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:20:43.310 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:20:43.494 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:20:43.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:21:13.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:21:13.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:21:13.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:21:13.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:21:13.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:21:13.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:21:13.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-05-30T01:21:13.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:21:13.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-05-30T01:21:13.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:21:13.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:21:13.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:21:13.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-05-30T01:21:55.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-05-30T01:21:55.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:21:55.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:21:55.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:21:55.358 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:21:55.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:21:55.370 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:21:55.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:21:55.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:21:55.370 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:21:55.370 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:21:55.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:21:55.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-30T01:21:55.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:21:55.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-30T01:21:55.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:21:55.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:21:55.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:21:55.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:21:55.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:21:55.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:21:55.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:21:55.635 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:21:55.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:21:49
2026-05-30T01:21:55.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73371, datetime.datetime(2026, 5, 30, 1, 21, 49), datetime.datetime(2026, 5, 30, 1, 21, 48), 'salt', 10.19, 59.79, None, 8.93, 347.85, 7.46, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:21:55.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:21:55.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-30T01:21:55.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:21:48, diff=7.701871s, valid=True
2026-05-30T01:21:55.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:21:55.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:21:55.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:22:12, diff=-16.295344s, valid=True
2026-05-30T01:21:55.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:21:55.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-30T01:21:55.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:21:39, diff=16.711294s, valid=True
2026-05-30T01:21:55.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:21:55.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:21:55.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:21:55.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:21:55.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:21:55.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:21:55.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:22:12, diff=-16.2857s, valid=True
2026-05-30T01:21:55.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:21:55.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:21:55.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:21:55.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029557.714965s, valid=True
2026-05-30T01:21:55.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:21:55.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:21:55.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:21:55.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:21:55.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:21:55.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:21:55.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:21:55.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:21:55.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:21:55.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:21:55.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:21:55.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:21:55.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:21:56.038 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:21:56.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:21:56.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:21:56.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:21:56.762 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:21:56.763 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:21:57.011 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:21:57.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:22:27.041 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:22:27.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:22:27.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:22:27.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:22:27.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:22:27.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:22:27.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-05-30T01:22:27.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:22:27.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-05-30T01:22:27.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:22:27.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:22:27.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:22:27.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-05-30T01:22:29.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-05-30T01:22:29.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:22:29.640 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:22:29.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:22:29.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:22:29.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:22:29.660 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:22:29.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:22:29.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:22:29.660 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:22:29.660 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:22:29.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:22:29.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:22:29.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:22:29.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:22:29.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:22:29.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:22:29.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:22:29.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:22:29.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:22:29.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:22:29.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:22:29.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:22:29.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:22:19
2026-05-30T01:22:29.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73372, datetime.datetime(2026, 5, 30, 1, 22, 19), datetime.datetime(2026, 5, 30, 1, 22, 18), 'salt', 10.26, 59.69, None, 13.37, 333.69, 7.49, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:22:29.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:22:29.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:22:29.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:22:18, diff=11.992955s, valid=True
2026-05-30T01:22:29.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:22:29.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:22:29.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:22:12, diff=17.996237s, valid=True
2026-05-30T01:22:29.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:22:29.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:22:30.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:22:19, diff=11.003227s, valid=True
2026-05-30T01:22:30.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:22:30.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:22:30.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:22:30.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:22:30.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:22:30.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:22:30.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:22:12, diff=18.006482s, valid=True
2026-05-30T01:22:30.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:22:30.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:22:30.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:22:30.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029592.007178s, valid=True
2026-05-30T01:22:30.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:22:30.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:22:30.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:22:30.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:22:30.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:22:30.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:22:30.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:22:30.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:22:30.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:22:30.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:22:30.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:22:30.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:22:30.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:22:30.340 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:22:30.570 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:22:30.953 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:22:31.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:22: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-05-30T01:22: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-05-30T01:22:31.236 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:22:31.236 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:23:01.240 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:23:01.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:23:01.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:23:01.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:23:01.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:23:01.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:23:01.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-05-30T01:23:01.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:23:01.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T01:23:01.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:23:01.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:23:01.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:23:01.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-05-30T01:23:04.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-05-30T01:23:04.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:23:04.189 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:23:04.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:23:04.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:23:04.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:23:04.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:23:04.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:23:04.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:23:04.214 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:23:04.215 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:23:04.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:23:04.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:23:04.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:23:04.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:23:04.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:23:04.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:23:04.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:23:04.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:23:04.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:23:04.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:23:04.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:23:04.470 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:23:04.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:22:49
2026-05-30T01:23:04.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73373, datetime.datetime(2026, 5, 30, 1, 22, 49), datetime.datetime(2026, 5, 30, 1, 22, 49), 'salt', 10.22, 59.76, None, 9.95, 343.46, 7.46, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:23:04.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:23:04.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:23:04.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:22:49, diff=15.535483s, valid=True
2026-05-30T01:23:04.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:23:04.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:23:04.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:23:12, diff=-7.461685s, valid=True
2026-05-30T01:23:04.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:23:04.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:23:04.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:22:49, diff=15.544882s, valid=True
2026-05-30T01:23:04.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:23:04.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:23:04.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:23:04.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:23:04.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:23:04.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:23:04.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:23:12, diff=-7.452107s, valid=True
2026-05-30T01:23:04.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:23:04.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:23:04.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:23:04.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029626.548552s, valid=True
2026-05-30T01:23:04.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:23:04.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:23:04.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:23:04.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:23:04.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:23:04.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:23:04.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:23:04.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:23:04.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:23:04.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:23:04.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:23:04.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:23:04.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:23:04.869 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:23:05.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:23:05.515 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:23:05.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:23:05.617 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:23:05.617 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:23:05.899 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:23:05.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:23:35.919 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:23:35.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:23:35.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:23:36.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:23:36.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:23:36.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:23:36.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-05-30T01:23:36.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:23:36.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-05-30T01:23:36.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:23:36.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:23:36.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:23:36.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T01:24:15.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-05-30T01:24:15.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:24:15.594 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:24:15.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:24:15.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:24:15.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:24:15.615 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:24:15.615 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:24:15.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:24:15.616 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:24:15.616 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:24:15.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:24:15.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:24:15.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:24:15.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:24:15.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:24:15.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:24:15.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:24:15.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:24:15.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:24:15.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:24:15.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:24:15.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:24:15.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:23:49
2026-05-30T01:24:15.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73375, datetime.datetime(2026, 5, 30, 1, 23, 49), datetime.datetime(2026, 5, 30, 1, 23, 49), 'salt', 10.12, 60.49, None, 13.16, 341.23, 7.29, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:24:15.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:24:15.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:24:15.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:23:49, diff=26.934266s, valid=True
2026-05-30T01:24:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:24:15.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:24:15.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:24:12, diff=3.937059s, valid=True
2026-05-30T01:24:15.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:24:15.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:24:15.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:23:45, diff=30.943771s, valid=True
2026-05-30T01:24:15.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:24:15.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:24:15.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:24:15.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:24:15.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:24:15.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:24:15.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:24:12, diff=3.946805s, valid=True
2026-05-30T01:24:15.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:24:15.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:24:15.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:24:15.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029697.947468s, valid=True
2026-05-30T01:24:15.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:24:15.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:24:15.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:24:15.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:24:15.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:24:16.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:24:16.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:24:16.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:24:16.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:24:16.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:24:16.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:24:16.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:24:16.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:24:16.266 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:24:16.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:24:16.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:24:16.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:24:16.934 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:24: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-05-30T01:24:17.123 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:24:17.123 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:24:47.133 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:24:47.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:24:47.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:24:47.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:24:47.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:24:47.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:24:47.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-05-30T01:24:47.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:24:47.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-05-30T01:24:47.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:24:47.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:24:47.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:24:47.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T01:25:32.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-05-30T01:25:32.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:25:32.328 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:25:32.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:25:32.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:25:32.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:25:32.348 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:25:32.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:25:32.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:25:32.349 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:25:32.349 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:25:32.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:25:32.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:25:32.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:25:32.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:25:32.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:25:32.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:25:32.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:25:32.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:25:32.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:25:32.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:25:32.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:25:32.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:25:32.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:25:20
2026-05-30T01:25:32.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73378, datetime.datetime(2026, 5, 30, 1, 25, 20), datetime.datetime(2026, 5, 30, 1, 25, 20), 'salt', 10.06, 60.36, None, 13.52, 344.73, 7.32, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:25:32.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:25:32.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:25:32.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:25:20, diff=12.698599s, valid=True
2026-05-30T01:25:32.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:25:32.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:25:32.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:25:12, diff=20.701433s, valid=True
2026-05-30T01:25:32.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:25:32.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:25:32.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:25:20, diff=12.708212s, valid=True
2026-05-30T01:25:32.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:25:32.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:25:32.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:25:32.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:25:32.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:25:32.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:25:32.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:25:12, diff=20.711216s, valid=True
2026-05-30T01:25:32.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:25:32.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:25:32.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:25:32.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029774.711883s, valid=True
2026-05-30T01:25:32.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:25:32.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:25:32.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:25:32.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:25:32.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:25:32.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:25:32.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:25:32.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:25:32.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:25:32.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:25:32.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:25:32.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:25:32.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:25:33.098 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:25:33.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:25:33.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:25:33.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:25:33.761 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:25:33.761 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:25:33.946 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:25:33.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:26:03.969 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:26:03.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:26:03.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:26:04.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:26:04.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:26:04.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:26:04.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-05-30T01:26:04.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:26:04.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-05-30T01:26:04.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:26:04.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:26:04.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:26:04.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-05-30T01:26:13.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-05-30T01:26:13.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:26:13.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:26:13.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:26:13.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:26:13.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:26:13.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:26:13.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:26:13.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:26:13.944 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:26:13.944 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:26:13.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:26:14.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:26:14.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:26:14.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:26:14.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:26:14.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:26:14.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:26:14.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:26:14.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:26:14.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:26:14.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:26:14.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:26:14.256 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:25:50
2026-05-30T01:26:14.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73379, datetime.datetime(2026, 5, 30, 1, 25, 50), datetime.datetime(2026, 5, 30, 1, 25, 50), 'salt', 9.99, 60.36, None, 11.4, 351.49, 7.31, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:26:14.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:26:14.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:26:14.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:25:50, diff=24.262633s, valid=True
2026-05-30T01:26:14.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:26:14.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:26:14.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:26:12, diff=2.265485s, valid=True
2026-05-30T01:26:14.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:26:14.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:26:14.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:25:41, diff=33.27225s, valid=True
2026-05-30T01:26:14.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:26:14.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:26:14.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:26:14.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:26:14.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:26:14.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:26:14.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:26:12, diff=2.275293s, valid=True
2026-05-30T01:26:14.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:26:14.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:26:14.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:26:14.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029816.275957s, valid=True
2026-05-30T01:26:14.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:26:14.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:26:14.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:26:14.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:26:14.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:26:14.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:26:14.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:26:14.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:26:14.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:26:14.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:26:14.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:26:14.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:26:14.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:26:14.605 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:26:14.825 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:26:15.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:26:15.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:26:15.287 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:26:15.287 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:26:15.474 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:26:15.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:26:45.566 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:26:45.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:26:45.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:26:45.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:26:45.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:26:46.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:26:46.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-05-30T01:26:46.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:26:46.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-05-30T01:26:46.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:26:46.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:26:46.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:26:46.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-05-30T01:26:48.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-05-30T01:26:48.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:26:48.438 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:26:48.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:26:48.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:26:48.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:26:48.459 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:26:48.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:26:48.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:26:48.460 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:26:48.460 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:26:48.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:26:48.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:26:48.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:26:48.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:26:48.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:26:48.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:26:48.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:26:48.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:26:48.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:26:48.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:26:48.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:26:48.711 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:26:48.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:26:21
2026-05-30T01:26:48.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73380, datetime.datetime(2026, 5, 30, 1, 26, 21), datetime.datetime(2026, 5, 30, 1, 26, 20), 'salt', 10.09, 59.93, None, 14.86, 325.01, 7.42, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:26:48.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:26:48.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:26:48.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:26:20, diff=28.776624s, valid=True
2026-05-30T01:26:48.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:26:48.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:26:48.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:26:12, diff=36.77944s, valid=True
2026-05-30T01:26:48.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:26:48.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:26:48.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:26:12, diff=36.786121s, valid=True
2026-05-30T01:26:48.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:26:48.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:26:48.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:26:48.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:26:48.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:26:48.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:26:48.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:26:12, diff=36.789174s, valid=True
2026-05-30T01:26:48.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:26:48.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:26:48.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:26:48.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029850.789848s, valid=True
2026-05-30T01:26:48.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:26:48.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:26:48.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:26:48.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:26:48.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:26:48.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:26:48.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:26:48.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:26:48.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:26:48.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:26:49.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:26:49.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:26:49.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:26:49.175 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:26:49.387 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:26:49.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:26:49.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:26:49.836 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:26:49.837 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:26:50.185 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:26:50.185 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:27:20.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:27:20.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:27:20.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:27:20.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:27:20.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:27:20.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:27:20.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-05-30T01:27:20.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:27:20.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-05-30T01:27:20.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:27:20.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:27:20.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:27:20.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-05-30T01:28:25.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-05-30T01:28:25.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:28:25.725 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:28:25.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:28:25.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:28:25.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:28:25.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:28:25.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:28:25.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:28:25.748 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:28:25.748 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:28:25.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:28:25.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-30T01:28:25.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:28:25.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-30T01:28:25.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:28:25.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:28:25.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:28:25.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:28:25.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:28:26.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:28:26.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:28:26.001 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:28:26.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:28:21
2026-05-30T01:28:26.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73384, datetime.datetime(2026, 5, 30, 1, 28, 21), datetime.datetime(2026, 5, 30, 1, 28, 21), 'salt', 10.06, 59.83, None, 13.62, 347.35, 7.44, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:28:26.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:28:26.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-30T01:28:26.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:28:21, diff=5.067024s, valid=True
2026-05-30T01:28:26.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:28:26.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:28:26.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:28:12, diff=14.06986s, valid=True
2026-05-30T01:28:26.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:28:26.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-30T01:28:26.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:28:18, diff=8.076483s, valid=True
2026-05-30T01:28:26.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:28:26.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:28:26.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:28:26.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:28:26.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:28:26.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:28:26.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:28:12, diff=14.079522s, valid=True
2026-05-30T01:28:26.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:28:26.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:28:26.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:28:26.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029948.080198s, valid=True
2026-05-30T01:28:26.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:28:26.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:28:26.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:28:26.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:28:26.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:28:26.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:28:26.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:28:26.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:28:26.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:28:26.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:28:26.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:28:26.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:28:26.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:28:26.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:28:26.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:28:26.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:28:27.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:28:27.053 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:28: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-05-30T01:28:27.244 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:28:27.244 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:28:57.274 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:28:57.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:28:57.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:28:57.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:28:57.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:28:57.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:28:57.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-05-30T01:28:57.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:28:57.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-05-30T01:28:57.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:28:57.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:28:57.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:28:57.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-05-30T01:29:10.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-05-30T01:29:10.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:29:10.313 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:29:10.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:29:10.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:29:10.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:29:10.335 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:29:10.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:29:10.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:29:10.335 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:29:10.335 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:29:10.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:29:10.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:29:10.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:29:10.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:29:10.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:29:10.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:29:10.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:29:10.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:29:10.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:29:10.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:29:10.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:29:10.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:29:10.654 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:28:52
2026-05-30T01:29:10.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73385, datetime.datetime(2026, 5, 30, 1, 28, 52), datetime.datetime(2026, 5, 30, 1, 28, 51), 'salt', 10.06, 59.59, None, 13.37, 334.46, 7.5, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:29:10.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:29:10.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:29:10.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:28:51, diff=19.660567s, valid=True
2026-05-30T01:29:10.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:29:10.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:29:10.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:29:12, diff=-1.336529s, valid=True
2026-05-30T01:29:10.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:29:10.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:29:10.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:28:49, diff=21.670348s, valid=True
2026-05-30T01:29:10.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:29:10.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:29:10.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:29:10.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:29:10.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:29:10.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:29:10.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:29:12, diff=-1.326564s, valid=True
2026-05-30T01:29:10.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:29:10.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:29:10.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:29:10.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1029992.674313s, valid=True
2026-05-30T01:29:10.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:29:10.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:29:10.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:29:10.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:29:10.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:29:10.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:29:10.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:29:10.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:29:10.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:29:10.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:29:10.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:29:10.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:29:11.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:29:11.064 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:29:11.284 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:29:11.648 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:29:11.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:29: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-05-30T01:29: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-05-30T01:29:12.007 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:29:12.007 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:29:42.037 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:29:42.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:29:42.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:29:42.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:29:42.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:29:42.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:29:42.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T01:29:42.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:29:42.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-05-30T01:29:42.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:29:42.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:29:42.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:29:42.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-05-30T01:29:45.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-05-30T01:29:45.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:29:45.591 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:29:45.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:29:45.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:29:45.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:29:45.610 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:29:45.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:29:45.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:29:45.611 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:29:45.611 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:29:45.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:29:45.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:29:45.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:29:45.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:29:45.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:29:45.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:29:45.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:29:45.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:29:45.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:29:45.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:29:45.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:29:45.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:29:45.927 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:29:22
2026-05-30T01:29:45.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73386, datetime.datetime(2026, 5, 30, 1, 29, 22), datetime.datetime(2026, 5, 30, 1, 29, 21), 'salt', 10.09, 59.79, None, 13.3, 343.15, 7.45, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:29:45.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:29:45.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:29:45.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:29:21, diff=24.933219s, valid=True
2026-05-30T01:29:45.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:29:45.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:29:45.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:29:12, diff=33.936068s, valid=True
2026-05-30T01:29:45.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:29:45.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:29:45.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:29:21, diff=24.942794s, valid=True
2026-05-30T01:29:45.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:29:45.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:29:45.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:29:45.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:29:45.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:29:45.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:29:45.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:29:12, diff=33.945857s, valid=True
2026-05-30T01:29:45.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:29:45.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:29:45.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:29:45.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030027.946532s, valid=True
2026-05-30T01:29:45.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:29:45.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:29:45.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:29:45.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:29:45.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:29:46.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:29:46.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:29:46.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:29:46.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:29:46.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:29:46.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:29:46.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:29:46.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:29:46.272 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:29:46.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:29:46.888 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:29:47.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:29:47.016 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:29:47.016 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:29:47.207 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:29:47.207 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:30:17.219 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:30:17.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:30:17.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:30:17.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:30:17.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:30:17.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:30:17.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T01:30:17.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:30:17.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-05-30T01:30:17.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:30:17.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:30:17.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:30:17.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-05-30T01:30:50.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-05-30T01:30:50.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:30:50.754 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:30:50.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:30:50.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:30:50.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:30:50.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:30:50.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:30:50.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:30:50.775 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:30:50.775 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:30:50.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:30:50.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:30:50.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:30:50.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:30:50.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:30:51.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:30:51.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:30:51.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:30:51.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:30:51.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:30:51.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:30:51.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:30:51.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:30:22
2026-05-30T01:30:51.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73388, datetime.datetime(2026, 5, 30, 1, 30, 22), datetime.datetime(2026, 5, 30, 1, 30, 21), 'salt', 10.02, 59.1, None, 16.27, 342.56, 7.61, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:30:51.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:30:51.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:30:51.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:30:21, diff=30.114509s, valid=True
2026-05-30T01:30:51.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:30:51.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:30:51.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:30:12, diff=39.117395s, valid=True
2026-05-30T01:30:51.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:30:51.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:30:51.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:30:14, diff=37.124187s, valid=True
2026-05-30T01:30:51.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:30:51.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:30:51.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:30:51.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:30:51.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:30:51.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:30:51.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:30:12, diff=39.127418s, valid=True
2026-05-30T01:30:51.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:30:51.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:30:51.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:30:51.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030093.12829s, valid=True
2026-05-30T01:30:51.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:30:51.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:30:51.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:30:51.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:30:51.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:30:51.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:30:51.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:30:51.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:30:51.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:30:51.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:30:51.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:30:51.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:30:51.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:30:51.461 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:30:51.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:30:52.036 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:30:52.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:30:52.141 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:30:52.141 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:30:52.329 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:30:52.329 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:31:22.353 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:31:22.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:31:22.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:31:22.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:31:22.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:31:23.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:31:23.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-05-30T01:31:23.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:31:23.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-05-30T01:31:23.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:31:23.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:31:23.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:31:23.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-05-30T01:31:58.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-05-30T01:31:58.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:31:58.144 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:31:58.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:31:58.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:31:58.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:31:58.165 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:31:58.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:31:58.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:31:58.165 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:31:58.165 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:31:58.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:31:58.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-30T01:31:58.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:31:58.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-30T01:31:58.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:31:58.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:31:58.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:31:58.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:31:58.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:31:58.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:31:58.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:31:58.416 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:31:58.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:31:54
2026-05-30T01:31:58.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73391, datetime.datetime(2026, 5, 30, 1, 31, 54), datetime.datetime(2026, 5, 30, 1, 31, 53), 'salt', 10.19, 57.54, None, 13.8, 343.99, 8.0, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:31:58.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:31:58.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-30T01:31:58.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:31:53, diff=5.482094s, valid=True
2026-05-30T01:31:58.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:31:58.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:31:58.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:32:12, diff=-13.515038s, valid=True
2026-05-30T01:31:58.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:31:58.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-30T01:31:58.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:31:48, diff=10.491607s, valid=True
2026-05-30T01:31:58.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:31:58.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:31:58.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:31:58.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:31:58.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:31:58.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:31:58.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:32:12, diff=-13.505356s, valid=True
2026-05-30T01:31:58.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:31:58.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:31:58.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:31:58.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030160.495302s, valid=True
2026-05-30T01:31:58.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:31:58.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:31:58.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:31:58.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:31:58.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:31:58.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:31:58.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:31:58.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:31:58.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:31:58.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:31:58.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:31:58.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:31:58.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:31:58.813 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:31:59.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:31:59.430 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:31:59.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:31:59.529 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:31:59.529 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:31:59.722 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:31:59.722 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:32:29.752 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:32:29.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:32:29.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:32:30.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:32:30.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:32:30.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:32:30.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-05-30T01:32:30.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:32:30.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-05-30T01:32:30.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:32:30.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:32:30.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:32:30.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-05-30T01:32:36.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-05-30T01:32:36.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:32:36.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:32:36.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:32:36.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:32:36.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:32:36.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:32:36.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:32:36.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:32:36.066 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:32:36.066 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:32:36.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:32:36.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:32:36.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:32:36.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:32:36.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:32:36.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:32:36.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:32:36.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:32:36.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:32:36.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:32:36.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:32:36.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:32:36.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:32:24
2026-05-30T01:32:36.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73392, datetime.datetime(2026, 5, 30, 1, 32, 24), datetime.datetime(2026, 5, 30, 1, 32, 23), 'salt', 10.32, 57.9, None, 13.48, 335.87, 7.91, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:32:36.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:32:36.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:32:36.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:32:23, diff=13.392205s, valid=True
2026-05-30T01:32:36.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:32:36.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:32:36.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:32:12, diff=24.395027s, valid=True
2026-05-30T01:32:36.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:32:36.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:32:36.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:32:19, diff=17.401679s, valid=True
2026-05-30T01:32:36.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:32:36.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:32:36.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:32:36.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:32:36.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:32:36.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:32:36.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:32:12, diff=24.404819s, valid=True
2026-05-30T01:32:36.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:32:36.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:32:36.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:32:36.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030198.405515s, valid=True
2026-05-30T01:32:36.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:32:36.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:32:36.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:32:36.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:32:36.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:32:36.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:32:36.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:32:36.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:32:36.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:32:36.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:32:36.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:32:36.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:32:36.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:32:36.730 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:32:36.962 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:32:37.306 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:32:37.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:32:37.408 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:32:37.408 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:32:37.595 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:32:37.595 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:33:07.602 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:33:07.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:33:07.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:33:07.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:33:07.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:33:08.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:33:08.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-05-30T01:33:08.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:33:08.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-05-30T01:33:08.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:33:08.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:33:08.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:33:08.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-05-30T01:33:31.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-05-30T01:33:31.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:33:31.207 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:33:31.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:33:31.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:33:31.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:33:31.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:33:31.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:33:31.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:33:31.227 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:33:31.228 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:33:31.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:33:31.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:33:31.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:33:31.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:33:31.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:33:31.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:33:31.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:33:31.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:33:31.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:33:31.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:33:31.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:33:31.489 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:33:31.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:33:24
2026-05-30T01:33:31.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73394, datetime.datetime(2026, 5, 30, 1, 33, 24), datetime.datetime(2026, 5, 30, 1, 33, 23), 'salt', 10.36, 57.14, None, 10.59, 331.95, 8.11, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:33:31.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:33:31.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:33:31.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:33:23, diff=8.556352s, valid=True
2026-05-30T01:33:31.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:33:31.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:33:31.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:33:12, diff=19.559214s, valid=True
2026-05-30T01:33:31.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:33:31.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:33:31.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:33:22, diff=9.56605s, valid=True
2026-05-30T01:33:31.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:33:31.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:33:31.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:33:31.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:33:31.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:33:31.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:33:31.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:33:12, diff=19.569119s, valid=True
2026-05-30T01:33:31.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:33:31.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:33:31.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:33:31.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030253.569799s, valid=True
2026-05-30T01:33:31.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:33:31.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:33:31.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:33:31.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:33:31.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:33:31.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:33:31.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:33:31.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:33:31.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:33:31.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:33:31.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:33:31.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:33:31.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:33:31.893 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:33:32.195 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:33:32.539 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:33:32.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:33:32.639 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:33: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-05-30T01:33:32.923 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:33:32.923 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:34:02.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:34:02.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:34:02.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:34:03.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:34:03.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:34:03.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:34:03.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-05-30T01:34:03.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:34:03.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-05-30T01:34:03.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:34:03.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:34:03.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:34:03.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-05-30T01:34:05.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-05-30T01:34:05.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:34:05.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:34:05.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:34:05.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:34:05.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:34:05.867 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:34:05.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:34:05.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:34:05.868 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:34:05.868 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:34:05.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:34:05.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:34:05.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:34:06.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:34:06.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:34:06.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:34:06.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:34:06.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:34:06.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:34:06.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:34:06.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:34:06.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:34:06.176 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:33:54
2026-05-30T01:34:06.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73395, datetime.datetime(2026, 5, 30, 1, 33, 54), datetime.datetime(2026, 5, 30, 1, 33, 54), 'salt', 10.39, 56.51, None, 13.27, 335.84, 8.26, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:34:06.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:34:06.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:34:06.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:33:54, diff=12.183005s, valid=True
2026-05-30T01:34:06.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:34:06.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:34:06.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:34:12, diff=-5.813903s, valid=True
2026-05-30T01:34:06.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:34:06.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:34:06.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:33:54, diff=12.193148s, valid=True
2026-05-30T01:34:06.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:34:06.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:34:06.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:34:06.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:34:06.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:34:06.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:34:06.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:34:12, diff=-5.803795s, valid=True
2026-05-30T01:34:06.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:34:06.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:34:06.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:34:06.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030288.196887s, valid=True
2026-05-30T01:34:06.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:34:06.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:34:06.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:34:06.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:34:06.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:34:06.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:34:06.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:34:06.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:34:06.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:34:06.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:34:06.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:34:06.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:34:06.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:34:06.518 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:34:06.738 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:34:07.093 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:34:07.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:34:07.195 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:34:07.195 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:34:07.399 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:34:07.399 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:34:37.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:34:37.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:34:37.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:34:37.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:34:37.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:34:37.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:34:37.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-05-30T01:34:37.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:34:37.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-05-30T01:34:37.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:34:37.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:34:37.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:34:37.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-05-30T01:34:40.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T01:34:40.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:34:40.278 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:34:40.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:34:40.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:34:40.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:34:40.292 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:34:40.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:34:40.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:34:40.293 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:34:40.293 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:34:40.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:34:40.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:34:40.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:34:40.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:34:40.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:34:40.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:34:40.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:34:40.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:34:40.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:34:40.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:34:40.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:34:40.540 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:34:40.598 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:34:25
2026-05-30T01:34:40.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73396, datetime.datetime(2026, 5, 30, 1, 34, 25), datetime.datetime(2026, 5, 30, 1, 34, 24), 'salt', 10.52, 55.81, None, 15.46, 338.87, 8.44, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:34:40.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:34:40.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:34:40.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:34:24, diff=16.604917s, valid=True
2026-05-30T01:34:40.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:34:40.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:34:40.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:34:12, diff=28.6078s, valid=True
2026-05-30T01:34:40.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:34:40.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:34:40.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:34:15, diff=25.614478s, valid=True
2026-05-30T01:34:40.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:34:40.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:34:40.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:34:40.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:34:40.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:34:40.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:34:40.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:34:12, diff=28.61757s, valid=True
2026-05-30T01:34:40.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:34:40.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:34:40.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:34:40.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030322.618247s, valid=True
2026-05-30T01:34:40.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:34:40.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:34:40.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:34:40.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:34:40.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:34:40.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:34:40.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:34:40.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:34:40.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:34:40.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:34:40.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:34:40.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:34:40.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:34:41.008 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:34:41.223 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:34:41.570 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:34:41.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:34:41.674 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:34:41.674 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:34:41.868 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:34:41.869 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:35:11.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:35:11.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:35:11.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:35:12.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:35:12.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:35:12.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:35:12.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-05-30T01:35:12.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:35:12.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-05-30T01:35:12.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:35:12.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:35:12.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:35:12.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-05-30T01:35:28.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-05-30T01:35:28.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:35:28.407 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:35:28.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:35:28.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:35:28.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:35:28.427 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:35:28.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:35:28.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:35:28.427 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:35:28.427 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:35:28.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:35:28.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:35:28.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:35:28.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:35:28.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:35:28.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:35:28.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:35:28.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:35:28.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:35:28.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:35:28.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:35:28.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:35:28.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:35:25
2026-05-30T01:35:28.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73398, datetime.datetime(2026, 5, 30, 1, 35, 25), datetime.datetime(2026, 5, 30, 1, 35, 25), 'salt', 10.56, 54.72, None, 16.69, 349.06, 8.73, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:35:28.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:35:28.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:35:28.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:35:25, diff=3.787395s, valid=True
2026-05-30T01:35:28.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:35:28.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:35:28.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:35:12, diff=16.790207s, valid=True
2026-05-30T01:35:28.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:35:28.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:35:28.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:35:18, diff=10.796913s, valid=True
2026-05-30T01:35:28.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:35:28.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:35:28.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:35:28.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:35:28.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:35:28.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:35:28.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:35:12, diff=16.799932s, valid=True
2026-05-30T01:35:28.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:35:28.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:35:28.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:35:28.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030370.8006s, valid=True
2026-05-30T01:35:28.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:35:28.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:35:28.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:35:28.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:35:28.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:35:28.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:35:28.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:35:28.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:35:28.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:35:28.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:35:28.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:35:29.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:35:29.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:35:29.119 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:35:29.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:35:29.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:35:29.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:35:29.788 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:35:29.788 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:35:30.013 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:35:30.013 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:36:00.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:36:00.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:36:00.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:36:00.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:36:00.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:36:00.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:36:00.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-05-30T01:36:00.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:36:00.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-05-30T01:36:00.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:36:00.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:36:00.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:36:00.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-05-30T01:36:03.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-05-30T01:36:03.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:36:03.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:36:03.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:36:03.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:36:03.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:36:03.186 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:36:03.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:36:03.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:36:03.186 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:36:03.186 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:36:03.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:36:03.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:36:03.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:36:03.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:36:03.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:36:03.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:36:03.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:36:03.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:36:03.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:36:03.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:36:03.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:36:03.442 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:36:03.506 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:35:55
2026-05-30T01:36:03.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73399, datetime.datetime(2026, 5, 30, 1, 35, 55), datetime.datetime(2026, 5, 30, 1, 35, 55), 'salt', 10.69, 53.89, None, 14.72, 337.16, 8.95, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:36:03.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:36:03.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:36:03.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:35:55, diff=8.512348s, valid=True
2026-05-30T01:36:03.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:36:03.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:36:03.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:36:12, diff=-8.484805s, valid=True
2026-05-30T01:36:03.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:36:03.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:36:03.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:35:49, diff=14.521912s, valid=True
2026-05-30T01:36:03.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:36:03.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:36:03.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:36:03.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:36:03.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:36:03.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:36:03.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:36:12, diff=-8.475014s, valid=True
2026-05-30T01:36:03.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:36:03.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:36:03.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:36:03.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030405.525656s, valid=True
2026-05-30T01:36:03.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:36:03.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:36:03.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:36:03.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:36:03.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:36:03.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:36:03.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:36:03.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:36:03.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:36:03.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:36:03.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:36:03.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:36:03.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:36:03.915 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:36:04.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:36:04.477 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:36:04.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:36:04.578 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:36:04.578 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:36:04.769 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:36:04.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:36:34.799 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:36:34.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:36:34.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:36:35.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:36:35.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:36:35.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:36: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-05-30T01:36:35.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:36:35.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-05-30T01:36:35.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:36:35.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:36:35.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:36:35.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-05-30T01:36:37.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-05-30T01:36:37.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:36:37.678 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:36:37.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:36:37.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:36:37.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:36:37.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:36:37.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:36:37.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:36:37.699 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:36:37.699 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:36:37.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:36:37.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:36:37.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:36:37.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:36:37.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:36:37.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:36:37.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:36:37.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:36:37.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:36:37.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:36:37.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:36:37.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:36:38.017 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:36:25
2026-05-30T01:36:38.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73400, datetime.datetime(2026, 5, 30, 1, 36, 25), datetime.datetime(2026, 5, 30, 1, 36, 25), 'salt', 10.79, 53.79, None, 13.87, 325.21, 8.98, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:36:38.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:36:38.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:36:38.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:36:25, diff=13.023345s, valid=True
2026-05-30T01:36:38.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:36:38.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:36:38.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:36:12, diff=26.02619s, valid=True
2026-05-30T01:36:38.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:36:38.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:36:38.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:36:21, diff=17.032937s, valid=True
2026-05-30T01:36:38.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:36:38.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:36:38.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:36:38.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:36:38.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:36:38.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:36:38.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:36:12, diff=26.036005s, valid=True
2026-05-30T01:36:38.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:36:38.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:36:38.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:36:38.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030440.036677s, valid=True
2026-05-30T01:36:38.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:36:38.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:36:38.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:36:38.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:36:38.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:36:38.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:36:38.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:36:38.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:36:38.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:36:38.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:36:38.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:36:38.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:36:38.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:36:38.355 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:36:38.568 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:36:38.913 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:36:39.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:36:39.014 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:36:39.014 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:36:39.203 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:36:39.203 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:37:09.234 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:37:09.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:37:09.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:37:09.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:37:09.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:37:09.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:37:09.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-05-30T01:37:09.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:37:09.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-05-30T01:37:09.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:37:09.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:37:09.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:37:09.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-05-30T01:37:17.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-05-30T01:37:17.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:37:17.188 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:37:17.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:37:17.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:37:17.208 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:37:17.209 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:37:17.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:37:17.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:37:17.209 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:37:17.209 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:37:17.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:37:17.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:37:17.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:37:17.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:37:17.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:37:17.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:37:17.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:37:17.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:37:17.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:37:17.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:37:17.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:37:17.463 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:37:17.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:36:56
2026-05-30T01:37:17.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73401, datetime.datetime(2026, 5, 30, 1, 36, 56), datetime.datetime(2026, 5, 30, 1, 36, 55), 'salt', 10.79, 53.82, None, 17.57, 340.68, 8.98, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:37:17.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:37:17.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:37:17.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:36:55, diff=22.535539s, valid=True
2026-05-30T01:37:17.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:37:17.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:37:17.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:37:12, diff=5.538438s, valid=True
2026-05-30T01:37:17.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:37:17.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:37:17.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:36:52, diff=25.545317s, valid=True
2026-05-30T01:37:17.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:37:17.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:37:17.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:37:17.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:37:17.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:37:17.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:37:17.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:37:12, diff=5.548348s, valid=True
2026-05-30T01:37:17.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:37:17.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:37:17.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:37:17.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030479.549018s, valid=True
2026-05-30T01:37:17.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:37:17.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:37:17.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:37:17.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:37:17.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:37:17.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:37:17.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:37:17.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:37:17.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:37:17.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:37:17.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:37:17.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:37:17.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:37:17.935 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:37:18.144 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:37:18.484 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:37:18.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:37:18.585 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:37:18.585 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:37:18.771 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:37:18.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:37:48.801 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:37:48.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:37:48.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:37:49.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:37:49.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:37:49.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:37:49.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-05-30T01:37:49.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:37:49.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-05-30T01:37:49.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:37:49.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:37:49.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:37:49.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-05-30T01:37:51.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-05-30T01:37:51.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:37:51.697 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:37:51.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:37:51.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:37:51.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:37:51.716 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:37:51.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:37:51.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:37:51.716 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:37:51.716 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:37:51.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:37:51.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:37:51.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:37:51.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:37:51.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:37:51.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:37:51.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:37:51.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:37:51.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:37:51.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:37:51.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:37:51.975 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:37:52.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:37:26
2026-05-30T01:37:52.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73402, datetime.datetime(2026, 5, 30, 1, 37, 26), datetime.datetime(2026, 5, 30, 1, 37, 26), 'salt', 10.72, 53.42, None, 15.17, 341.9, 9.07, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:37:52.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:37:52.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:37:52.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:37:26, diff=26.043673s, valid=True
2026-05-30T01:37:52.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:37:52.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:37:52.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:37:12, diff=40.046494s, valid=True
2026-05-30T01:37:52.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:37:52.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:37:52.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:37:24, diff=28.053206s, valid=True
2026-05-30T01:37:52.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:37:52.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:37:52.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:37:52.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:37:52.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:37:52.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:37:52.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:37:12, diff=40.056199s, valid=True
2026-05-30T01:37:52.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:37:52.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:37:52.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:37:52.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030514.056858s, valid=True
2026-05-30T01:37:52.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:37:52.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:37:52.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:37:52.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:37:52.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:37:52.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:37:52.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:37:52.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:37:52.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:37:52.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:37:52.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:37:52.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:37:52.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:37:52.371 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:37:52.575 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:37:52.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:37:53.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:37:53.004 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:37:53.004 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:37:53.186 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:37:53.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:38:23.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:38:23.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:38:23.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:38:23.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:38:23.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:38:23.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:38: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-05-30T01:38:23.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:38: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-05-30T01:38:23.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:38:23.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:38:23.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:38:23.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-05-30T01:38:27.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T01:38:27.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:38:27.066 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:38:27.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:38:27.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:38:27.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:38:27.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:38:27.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:38:27.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:38:27.086 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:38:27.086 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:38:27.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:38:27.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:38:27.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:38:27.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:38:27.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:38:27.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:38:27.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:38:27.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:38:27.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:38:27.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:38:27.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:38:27.350 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:38:27.412 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:38:26
2026-05-30T01:38:27.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73404, datetime.datetime(2026, 5, 30, 1, 38, 26), datetime.datetime(2026, 5, 30, 1, 38, 25), 'salt', 10.85, 53.16, None, 12.81, 337.89, 9.15, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:38:27.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:38:27.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:38:27.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:38:25, diff=2.418796s, valid=True
2026-05-30T01:38:27.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:38:27.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:38:27.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:38:12, diff=15.421687s, valid=True
2026-05-30T01:38:27.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:38:27.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:38:27.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:38:17, diff=10.428572s, valid=True
2026-05-30T01:38:27.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:38:27.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:38:27.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:38:27.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:38:27.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:38:27.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:38:27.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:38:12, diff=15.431723s, valid=True
2026-05-30T01:38:27.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:38:27.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:38:27.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:38:27.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030549.432391s, valid=True
2026-05-30T01:38:27.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:38:27.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:38:27.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:38:27.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:38:27.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:38:27.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:38:27.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:38:27.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:38:27.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:38:27.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:38:27.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:38:27.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:38:27.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:38:27.820 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:38:28.048 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:38:28.391 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:38:28.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:38: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-05-30T01:38: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-05-30T01:38:28.673 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:38:28.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:38:58.674 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:38:58.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:38:58.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:38:58.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:38:58.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:38:59.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:38: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-05-30T01:38:59.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:38:59.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-05-30T01:38:59.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:38:59.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:38:59.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:38:59.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-05-30T01:39:37.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-05-30T01:39:37.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:39:37.303 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:39:37.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:39:37.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:39:37.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:39:37.317 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:39:37.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:39:37.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:39:37.317 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:39:37.317 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:39:37.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:39:37.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:39:37.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:39:37.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:39:37.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:39:37.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:39:37.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:39:37.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:39:37.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:39:37.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:39:37.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:39:37.580 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:39:37.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:39:27
2026-05-30T01:39:37.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73406, datetime.datetime(2026, 5, 30, 1, 39, 27), datetime.datetime(2026, 5, 30, 1, 39, 26), 'salt', 10.89, 52.66, None, 16.13, 354.53, 9.29, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:39:37.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:39:37.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:39:37.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:39:26, diff=11.655495s, valid=True
2026-05-30T01:39:37.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:39:37.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:39:37.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:39:12, diff=25.658335s, valid=True
2026-05-30T01:39:37.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:39:37.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:39:37.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:39:19, diff=18.665011s, valid=True
2026-05-30T01:39:37.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:39:37.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:39:37.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:39:37.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:39:37.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:39:37.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:39:37.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:39:12, diff=25.668022s, valid=True
2026-05-30T01:39:37.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:39:37.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:39:37.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:39:37.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030619.668693s, valid=True
2026-05-30T01:39:37.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:39:37.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:39:37.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:39:37.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:39:37.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:39:37.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:39:37.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:39:37.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:39:37.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:39:37.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:39:37.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:39:37.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:39:37.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:39:37.996 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:39:38.211 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:39:38.556 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:39:38.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:39:38.665 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:39:38.665 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:39:38.947 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:39:38.947 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:40:08.977 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:40:08.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:40:08.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:40:09.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:40:09.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:40:09.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:40:09.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-05-30T01:40:09.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:40:09.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-05-30T01:40:09.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:40:09.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:40:09.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:40:09.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-05-30T01:40:12.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-05-30T01:40:12.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:40:12.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:40:12.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:40:12.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:40:12.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:40:12.256 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:40:12.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:40:12.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:40:12.256 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:40:12.256 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:40:12.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:40:12.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:40:12.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:40:12.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:40:12.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:40:12.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:40:12.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:40:12.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:40:12.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:40:12.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:40:12.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:40:12.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:40:12.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:39:57
2026-05-30T01:40:12.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73407, datetime.datetime(2026, 5, 30, 1, 39, 57), datetime.datetime(2026, 5, 30, 1, 39, 57), 'salt', 10.79, 52.69, None, 14.68, 347.37, 9.27, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:40:12.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:40:12.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:40:12.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:39:57, diff=15.639177s, valid=True
2026-05-30T01:40:12.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:40:12.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:40:12.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:40:12, diff=0.642099s, valid=True
2026-05-30T01:40:12.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:40:12.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:40:12.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:39:51, diff=21.648968s, valid=True
2026-05-30T01:40:12.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:40:12.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:40:12.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:40:12.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:40:12.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:40:12.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:40:12.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:40:12, diff=0.652039s, valid=True
2026-05-30T01:40:12.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:40:12.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:40:12.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:40:12.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030654.652739s, valid=True
2026-05-30T01:40:12.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:40:12.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:40:12.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:40:12.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:40:12.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:40:12.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:40:12.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:40:12.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:40:12.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:40:12.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:40:12.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:40:12.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:40:12.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:40:12.971 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:40:13.179 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:40:13.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:40:13.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:40:13.620 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:40:13.620 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:40:13.906 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:40:13.906 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:40:43.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:40:43.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:40:43.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:40:44.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:40:44.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:40:44.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:40:44.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-05-30T01:40:44.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:40:44.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-05-30T01:40:44.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:40:44.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:40:44.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:40:44.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-05-30T01:40:46.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-05-30T01:40:46.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:40:46.805 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:40:46.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:40:46.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:40:46.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:40:46.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:40:46.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:40:46.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:40:46.824 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:40:46.824 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:40:46.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:40:46.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:40:46.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:40:46.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:40:46.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:40:47.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:40:47.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:40:47.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:40:47.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:40:47.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:40:47.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:40:47.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:40:47.132 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:40:27
2026-05-30T01:40:47.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73408, datetime.datetime(2026, 5, 30, 1, 40, 27), datetime.datetime(2026, 5, 30, 1, 40, 27), 'salt', 10.82, 52.43, None, 15.67, 334.79, 9.34, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:40:47.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:40:47.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:40:47.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:40:27, diff=20.138995s, valid=True
2026-05-30T01:40:47.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:40:47.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:40:47.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:40:12, diff=35.141845s, valid=True
2026-05-30T01:40:47.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:40:47.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:40:47.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:40:22, diff=25.148611s, valid=True
2026-05-30T01:40:47.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:40:47.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:40:47.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:40:47.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:40:47.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:40:47.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:40:47.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:40:12, diff=35.151666s, valid=True
2026-05-30T01:40:47.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:40:47.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:40:47.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:40:47.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030689.152324s, valid=True
2026-05-30T01:40:47.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:40:47.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:40:47.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:40:47.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:40:47.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:40:47.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:40:47.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:40:47.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:40:47.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:40:47.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:40:47.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:40:47.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:40:47.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:40:47.469 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:40:47.691 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:40:48.029 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:40:48.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:40:48.124 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:40:48.124 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:40:48.313 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:40:48.313 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:41:18.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:41:18.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:41:18.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:41:18.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:41:18.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:41:18.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:41:18.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-05-30T01:41:18.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:41:18.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-05-30T01:41:18.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:41:18.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:41:18.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:41:18.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-05-30T01:41:21.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-05-30T01:41:21.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:41:21.145 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:41:21.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:41:21.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:41:21.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:41:21.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:41:21.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:41:21.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:41:21.158 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:41:21.158 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:41:21.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:41:21.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:41:21.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:41:21.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:41:21.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:41:21.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T01:41:21.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:41:21.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T01:41:21.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:41:21.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:41:21.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:41:21.411 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:41:21.470 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:40:57
2026-05-30T01:41:21.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73409, datetime.datetime(2026, 5, 30, 1, 40, 57), datetime.datetime(2026, 5, 30, 1, 40, 57), 'salt', 10.82, 52.49, None, 15.0, 336.69, 9.32, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:41:21.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:41:21.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:41:21.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:40:57, diff=24.476492s, valid=True
2026-05-30T01:41:21.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:41:21.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T01:41:21.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:41:12, diff=9.479299s, valid=True
2026-05-30T01:41:21.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:41:21.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:41:21.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:40:54, diff=27.486007s, valid=True
2026-05-30T01:41:21.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:41:21.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:41:21.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:41:21.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:41:21.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:41:21.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T01:41:21.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:41:12, diff=9.489008s, valid=True
2026-05-30T01:41:21.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:41:21.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:41:21.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:41:21.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030723.489674s, valid=True
2026-05-30T01:41:21.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:41:21.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:41:21.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:41:21.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:41:21.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:41:21.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:41:21.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:41:21.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:41:21.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:41:21.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:41:21.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:41:21.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:41:21.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:41:21.807 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:41:22.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:41:22.345 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:41:22.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:41:22.441 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:41:22.441 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:41:22.630 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:41:22.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:41:52.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:41:52.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:41:52.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:41:52.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:41:52.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:41:52.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:41:52.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-05-30T01:41:52.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:41:52.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-05-30T01:41:52.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:41:52.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:41:52.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:41:52.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-05-30T01:41:55.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-05-30T01:41:55.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:41:55.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:41:55.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:41:55.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:41:55.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:41:55.327 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:41:55.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:41:55.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:41:55.328 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:41:55.328 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:41:55.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:41:55.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:41:55.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:41:55.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:41:55.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:41:55.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T01:41:55.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:41:55.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T01:41:55.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:41:55.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:41:55.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:41:55.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:41:55.657 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:41:28
2026-05-30T01:41:55.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73410, datetime.datetime(2026, 5, 30, 1, 41, 28), datetime.datetime(2026, 5, 30, 1, 41, 27), 'salt', 10.85, 52.82, None, 14.29, 354.53, 9.23, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:41:55.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:41:55.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:41:55.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:41:27, diff=28.663553s, valid=True
2026-05-30T01:41:55.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:41:55.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T01:41:55.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:41:12, diff=43.666448s, valid=True
2026-05-30T01:41:55.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:41:55.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:41:55.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:41:25, diff=30.673304s, valid=True
2026-05-30T01:41:55.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:41:55.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:41:55.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:41:55.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:41:55.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:41:55.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T01:41:55.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:41:12, diff=43.676366s, valid=True
2026-05-30T01:41:55.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:41:55.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:41:55.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:41:55.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030757.677044s, valid=True
2026-05-30T01:41:55.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:41:55.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:41:55.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:41:55.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:41:55.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:41:55.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:41:55.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:41:55.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:41:55.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:41:55.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:41:55.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:41:55.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:41:55.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:41:55.997 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:41:56.203 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:41:56.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:41:56.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:41:56.707 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:41:56.707 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:41:56.896 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:41:56.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:42:26.912 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:42:26.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:42:26.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:42:27.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:42:27.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:42:27.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:42:27.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T01:42:27.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:42:27.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-05-30T01:42:27.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:42:27.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:42:27.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:42:27.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-05-30T01:42:30.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-05-30T01:42:30.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:42:30.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:42:30.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:42:30.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:42:30.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:42:30.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:42:30.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:42:30.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:42:30.055 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:42:30.055 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:42:30.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:42:30.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:42:30.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:42:30.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:42:30.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:42:30.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T01:42:30.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:42:30.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T01:42:30.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:42:30.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:42:30.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:42:30.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:42:30.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:42:28
2026-05-30T01:42:30.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73412, datetime.datetime(2026, 5, 30, 1, 42, 28), datetime.datetime(2026, 5, 30, 1, 42, 28), 'salt', 10.85, 51.73, None, 13.52, 316.9, 9.53, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:42:30.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:42:30.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:42:30.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:42:28, diff=2.386086s, valid=True
2026-05-30T01:42:30.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:42:30.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T01:42:30.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:42:12, diff=18.388892s, valid=True
2026-05-30T01:42:30.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:42:30.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:42:30.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:42:28, diff=2.395489s, valid=True
2026-05-30T01:42:30.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:42:30.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:42:30.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:42:30.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:42:30.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:42:30.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T01:42:30.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:42:12, diff=18.398572s, valid=True
2026-05-30T01:42:30.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:42:30.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:42:30.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:42:30.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030792.399278s, valid=True
2026-05-30T01:42:30.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:42:30.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:42:30.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:42:30.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:42:30.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:42:30.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:42:30.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:42:30.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:42:30.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:42:30.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:42:30.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:42:30.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:42:30.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:42:30.728 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:42:30.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:42:31.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:42:31.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:42:31.410 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:42:31.410 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:42:31.598 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:42:31.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:43:01.621 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:43:01.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:43:01.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:43:02.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:43:02.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:43:02.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:43:02.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-05-30T01:43:02.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:43:02.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-05-30T01:43:02.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:43:02.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:43:02.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:43:02.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-05-30T01:43:04.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-05-30T01:43:04.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:43:04.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:43:04.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:43:04.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:43:04.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:43:04.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:43:04.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:43:04.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:43:04.758 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:43:04.758 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:43:04.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:43:04.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:43:04.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:43:04.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:43:04.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:43:05.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T01:43:05.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:43:05.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T01:43:05.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:43:05.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:43:05.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:43:05.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:43:05.125 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:42:58
2026-05-30T01:43:05.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73413, datetime.datetime(2026, 5, 30, 1, 42, 58), datetime.datetime(2026, 5, 30, 1, 42, 58), 'salt', 10.95, 51.6, None, 16.27, 347.3, 9.57, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:43:05.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:43:05.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:43:05.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:42:58, diff=7.133255s, valid=True
2026-05-30T01:43:05.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:43:05.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T01:43:05.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:43:12, diff=-6.863074s, valid=True
2026-05-30T01:43:05.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:43:05.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:43:05.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:42:49, diff=16.145593s, valid=True
2026-05-30T01:43:05.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:43:05.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:43:05.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:43:05.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:43:05.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:43:05.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T01:43:05.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:43:12, diff=-6.850726s, valid=True
2026-05-30T01:43:05.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:43:05.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:43:05.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:43:05.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030827.150306s, valid=True
2026-05-30T01:43:05.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:43:05.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:43:05.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:43:05.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:43:05.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:43:05.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:43:05.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:43:05.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:43:05.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:43:05.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:43:05.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:43:05.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:43:05.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:43:05.541 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:43:05.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:43:06.227 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:43:06.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:43:06.326 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:43:06.326 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:43:06.600 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:43:06.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:43:36.620 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:43:36.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:43:36.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:43:36.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:43:36.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:43:36.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:43:36.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-05-30T01:43:36.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:43:36.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-05-30T01:43:36.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:43:36.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:43:36.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:43:36.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-05-30T01:43:39.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-05-30T01:43:39.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:43:39.359 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:43:39.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:43:39.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:43:39.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:43:39.379 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:43:39.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:43:39.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:43:39.379 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:43:39.379 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:43:39.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:43:39.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:43:39.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:43:39.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:43:39.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:43:39.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T01:43:39.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:43:39.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T01:43:39.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:43:39.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:43:39.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:43:39.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:43:39.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:43:28
2026-05-30T01:43:39.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73414, datetime.datetime(2026, 5, 30, 1, 43, 28), datetime.datetime(2026, 5, 30, 1, 43, 28), 'salt', 10.92, 51.93, None, 15.77, 335.85, 9.48, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:43:39.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:43:39.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:43:39.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:43:28, diff=11.72182s, valid=True
2026-05-30T01:43:39.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:43:39.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T01:43:39.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:43:12, diff=27.724693s, valid=True
2026-05-30T01:43:39.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:43:39.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:43:39.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:43:20, diff=19.731458s, valid=True
2026-05-30T01:43:39.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:43:39.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:43:39.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:43:39.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:43:39.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:43:39.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T01:43:39.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:43:12, diff=27.734565s, valid=True
2026-05-30T01:43:39.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:43:39.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:43:39.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:43:39.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030861.735234s, valid=True
2026-05-30T01:43:39.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:43:39.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:43:39.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:43:39.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:43:39.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:43:39.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:43:39.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:43:39.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:43:39.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:43:39.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:43:39.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:43:39.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:43:40.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:43:40.066 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:43:40.279 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:43:40.624 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:43:40.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:43:40.724 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:43:40.724 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:43:40.873 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:43:40.874 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:44:10.903 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:44:10.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:44:10.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:44:11.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:44:11.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:44:11.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:44:11.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-05-30T01:44:11.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:44:11.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-05-30T01:44:11.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:44:11.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:44:11.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:44:11.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-05-30T01:44:17.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-05-30T01:44:17.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:44:17.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:44:17.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:44:17.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:44:17.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:44:17.506 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:44:17.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:44:17.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:44:17.507 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:44:17.507 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:44:17.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:44:17.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:44:17.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:44:17.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:44:17.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:44:17.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T01:44:17.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:44:17.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T01:44:17.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:44:17.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:44:17.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:44:17.763 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:44:17.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:43:59
2026-05-30T01:44:17.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73415, datetime.datetime(2026, 5, 30, 1, 43, 59), datetime.datetime(2026, 5, 30, 1, 43, 58), 'salt', 10.82, 52.16, None, 16.66, 338.57, 9.41, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:44:17.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:44:17.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:44:17.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:43:58, diff=19.834274s, valid=True
2026-05-30T01:44:17.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:44:17.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T01:44:17.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:44:12, diff=5.837086s, valid=True
2026-05-30T01:44:17.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:44:17.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:44:17.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:43:52, diff=25.843767s, valid=True
2026-05-30T01:44:17.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:44:17.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:44:17.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:44:17.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:44:17.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:44:17.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T01:44:17.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:44:12, diff=5.846788s, valid=True
2026-05-30T01:44:17.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:44:17.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:44:17.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:44:17.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030899.847447s, valid=True
2026-05-30T01:44:17.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:44:17.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:44:17.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:44:17.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:44:17.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:44:17.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:44:17.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:44:17.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:44:17.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:44:17.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:44:18.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:44:18.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:44:18.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:44:18.240 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:44:18.444 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:44:18.785 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:44:18.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:44:18.883 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:44:18.883 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:44:19.155 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:44:19.156 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:44:49.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:44:49.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:44:49.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:44:49.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:44:49.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:44:49.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:44:49.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-05-30T01:44:49.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:44:49.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-05-30T01:44:49.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:44:49.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:44:49.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:44:49.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T01:44:52.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-05-30T01:44:52.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:44:52.733 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:44:52.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:44:52.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:44:52.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:44:52.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:44:52.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:44:52.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:44:52.758 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:44:52.759 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:44:52.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:44:52.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:44:52.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:44:52.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:44:52.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:44:52.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T01:44:52.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:44:53.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T01:44:53.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:44:53.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:44:53.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:44:53.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:44:53.075 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:44:29
2026-05-30T01:44:53.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73416, datetime.datetime(2026, 5, 30, 1, 44, 29), datetime.datetime(2026, 5, 30, 1, 44, 28), 'salt', 10.85, 52.92, None, 13.52, 342.98, 9.21, 832.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:44:53.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:44:53.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:44:53.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:44:28, diff=25.081606s, valid=True
2026-05-30T01:44:53.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:44:53.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T01:44:53.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:44:12, diff=41.084433s, valid=True
2026-05-30T01:44:53.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:44:53.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:44:53.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:44:23, diff=30.090946s, valid=True
2026-05-30T01:44:53.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:44:53.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:44:53.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:44:53.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:44:53.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:44:53.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T01:44:53.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:44:12, diff=41.093951s, valid=True
2026-05-30T01:44:53.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:44:53.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:44:53.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:44:53.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030935.094616s, valid=True
2026-05-30T01:44:53.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:44:53.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:44:53.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:44:53.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:44:53.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:44:53.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:44:53.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:44:53.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:44:53.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:44:53.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:44:53.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:44:53.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:44:53.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:44:53.410 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:44:53.614 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:44:53.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:44:54.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:44:54.048 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:44:54.048 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:44:54.238 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:44:54.238 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:45:24.265 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:45:24.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:45:24.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:45:24.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:45:24.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:45:24.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:45:24.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T01:45:24.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:45:24.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-05-30T01:45:24.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:45:24.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:45:24.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:45:24.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-05-30T01:45:28.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-05-30T01:45:28.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:45:28.645 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:45:28.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:45:28.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:45:28.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:45:28.665 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:45:28.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:45:28.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:45:28.666 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:45:28.666 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:45:28.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:45:28.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:45:28.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:45:28.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:45:28.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:45:28.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T01:45:28.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:45:28.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T01:45:28.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:45:28.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:45:28.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:45:28.919 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:45:28.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:44:59
2026-05-30T01:45:28.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73417, datetime.datetime(2026, 5, 30, 1, 44, 59), datetime.datetime(2026, 5, 30, 1, 44, 59), 'salt', 10.89, 52.36, None, 14.75, 345.96, 9.37, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:45:28.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:45:28.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:45:28.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:44:59, diff=29.986816s, valid=True
2026-05-30T01:45:28.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:45:28.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T01:45:28.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:45:12, diff=16.989706s, valid=True
2026-05-30T01:45:28.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:45:28.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:45:28.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:44:55, diff=33.9965s, valid=True
2026-05-30T01:45:28.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:45:28.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:45:28.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:45:28.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:45:28.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:45:28.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T01:45:28.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:45:12, diff=16.999553s, valid=True
2026-05-30T01:45:28.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:45:28.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:45:28.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:45:29.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1030971.000226s, valid=True
2026-05-30T01:45:29.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:45:29.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:45:29.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:45:29.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:45:29.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:45:29.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:45:29.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:45:29.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:45:29.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:45:29.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:45:29.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:45:29.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:45:29.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:45:29.388 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:45:29.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:45:29.942 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:45:30.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:45: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-05-30T01:45:30.057 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:45:30.260 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:45:30.260 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:46:00.290 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:46:00.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:46:00.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:46:00.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:46:00.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:46:00.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:46:00.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-05-30T01:46:00.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:46:00.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-05-30T01:46:01.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:46:01.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:46:01.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:46:01.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-05-30T01:46:03.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-05-30T01:46:03.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:46:03.258 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:46:03.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:46:03.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:46:03.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:46:03.279 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:46:03.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:46:03.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:46:03.280 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:46:03.280 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:46:03.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:46:03.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:46:03.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:46:03.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:46:03.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:46:03.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T01:46:03.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:46:03.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T01:46:03.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:46:03.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:46:03.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:46:03.558 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:46:03.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:45:59
2026-05-30T01:46:03.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73419, datetime.datetime(2026, 5, 30, 1, 45, 59), datetime.datetime(2026, 5, 30, 1, 45, 59), 'salt', 10.75, 52.29, None, 14.12, 350.13, 9.37, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:46:03.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:46:03.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:46:03.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:45:59, diff=4.62434s, valid=True
2026-05-30T01:46:03.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:46:03.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T01:46:03.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:46:12, diff=-8.372782s, valid=True
2026-05-30T01:46:03.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:46:03.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:46:03.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:45:58, diff=5.634024s, valid=True
2026-05-30T01:46:03.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:46:03.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:46:03.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:46:03.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:46:03.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:46:03.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T01:46:03.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:46:12, diff=-8.362898s, valid=True
2026-05-30T01:46:03.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:46:03.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:46:03.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:46:03.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031005.637791s, valid=True
2026-05-30T01:46:03.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:46:03.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:46:03.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:46:03.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:46:03.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:46:03.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:46:03.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:46:03.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:46:03.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:46:03.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:46:03.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:46:03.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:46:03.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:46:03.961 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:46:04.168 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:46:04.509 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:46:04.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:46:04.608 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:46:04.608 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:46:04.860 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:46:04.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:46:34.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:46:34.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:46:34.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:46:35.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:46:35.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:46:35.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:46:35.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-05-30T01:46:35.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:46:35.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-05-30T01:46:35.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:46:35.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:46:35.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:46:35.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-05-30T01:46:37.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-05-30T01:46:37.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:46:37.727 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:46:37.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:46:37.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:46:37.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:46:37.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:46:37.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:46:37.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:46:37.749 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:46:37.749 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:46:37.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:46:37.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:46:37.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:46:37.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:46:37.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:46:37.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T01:46:37.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:46:38.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T01:46:38.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:46:38.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:46:38.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:46:38.012 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:46:38.072 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:46:30
2026-05-30T01:46:38.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73420, datetime.datetime(2026, 5, 30, 1, 46, 30), datetime.datetime(2026, 5, 30, 1, 46, 29), 'salt', 10.79, 52.79, None, 13.16, 352.25, 9.24, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:46:38.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:46:38.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:46:38.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:46:29, diff=9.078492s, valid=True
2026-05-30T01:46:38.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:46:38.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T01:46:38.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:46:12, diff=26.081368s, valid=True
2026-05-30T01:46:38.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:46:38.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:46:38.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:46:30, diff=8.088124s, valid=True
2026-05-30T01:46:38.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:46:38.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:46:38.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:46:38.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:46:38.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:46:38.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T01:46:38.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:46:12, diff=26.091173s, valid=True
2026-05-30T01:46:38.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:46:38.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:46:38.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:46:38.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031040.091852s, valid=True
2026-05-30T01:46:38.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:46:38.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:46:38.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:46:38.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:46:38.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:46:38.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:46:38.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:46:38.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:46:38.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:46:38.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:46:38.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:46:38.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:46:38.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:46:38.475 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:46:38.680 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:46:39.016 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:46:39.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:46:39.115 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:46:39.115 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:46:39.723 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:46:39.724 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:47:09.751 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:47:09.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:47:09.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:47:10.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:47:10.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:47:10.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:47:10.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-05-30T01:47:10.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:47:10.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-05-30T01:47:10.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:47:10.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:47:10.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:47:10.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-05-30T01:47:13.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-05-30T01:47:13.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:47:13.511 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:47:13.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:47:13.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:47:13.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:47:13.533 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:47:13.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:47:13.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:47:13.533 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:47:13.533 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:47:13.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:47:13.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:47:13.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:47:13.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:47:13.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:47:13.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T01:47:13.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:47:13.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T01:47:13.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:47:13.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:47:13.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:47:13.816 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:47:13.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:47:00
2026-05-30T01:47:13.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73421, datetime.datetime(2026, 5, 30, 1, 47), datetime.datetime(2026, 5, 30, 1, 47), 'salt', 10.82, 53.29, None, 12.63, 316.52, 9.11, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:47:13.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:47:13.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:47:13.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:47:00, diff=13.889459s, valid=True
2026-05-30T01:47:13.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:47:13.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T01:47:13.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:47:12, diff=1.892407s, valid=True
2026-05-30T01:47:13.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:47:13.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:47:13.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:46:51, diff=22.899366s, valid=True
2026-05-30T01:47:13.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:47:13.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:47:13.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:47:13.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:47:13.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:47:13.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T01:47:13.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:47:12, diff=1.902523s, valid=True
2026-05-30T01:47:13.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:47:13.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:47:13.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:47:13.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031075.903232s, valid=True
2026-05-30T01:47:13.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:47:13.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:47:13.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:47:13.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:47:13.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:47:13.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:47:13.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:47:13.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:47:13.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:47:14.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:47:14.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:47:14.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:47:14.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:47:14.228 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:47:14.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:47:14.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:47:14.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:47:14.877 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:47:14.877 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:47:15.042 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:47:15.042 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:47:45.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:47:45.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:47:45.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:47:45.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:47:45.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:47:45.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:47:45.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-05-30T01:47:45.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:47:45.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-05-30T01:47:45.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:47:45.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:47:45.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:47:45.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-05-30T01:47:48.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-05-30T01:47:48.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:47:48.070 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:47:48.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:47:48.078 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:47:48.090 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:47:48.090 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:47:48.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:47:48.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:47:48.090 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:47:48.091 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:47:48.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:47:48.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:47:48.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:47:48.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:47:48.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:47:48.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T01:47:48.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:47:48.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T01:47:48.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:47:48.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:47:48.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:47:48.441 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:47:48.505 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:47:30
2026-05-30T01:47:48.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73422, datetime.datetime(2026, 5, 30, 1, 47, 30), datetime.datetime(2026, 5, 30, 1, 47, 30), 'salt', 10.62, 53.39, None, 13.34, 332.34, 9.07, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:47:48.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:47:48.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:47:48.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:47:30, diff=18.512038s, valid=True
2026-05-30T01:47:48.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:47:48.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T01:47:48.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:47:12, diff=36.5149s, valid=True
2026-05-30T01:47:48.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:47:48.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:47:48.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:47:22, diff=26.521693s, valid=True
2026-05-30T01:47:48.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:47:48.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:47:48.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:47:48.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:47:48.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:47:48.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T01:47:48.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:47:12, diff=36.52476s, valid=True
2026-05-30T01:47:48.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:47:48.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:47:48.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:47:48.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031110.525405s, valid=True
2026-05-30T01:47:48.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:47:48.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:47:48.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:47:48.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:47:48.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:47:48.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:47:48.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:47:48.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:47:48.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:47:48.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:47:48.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:47:48.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:47:48.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:47:48.841 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:47:49.048 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:47:49.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:47:49.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:47:49.482 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:47:49.482 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:47:49.734 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:47:49.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:48:19.765 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:48:19.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:48:19.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:48:20.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:48:20.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:48:20.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:48:20.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T01:48:20.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:48:20.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-05-30T01:48:20.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:48:20.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:48:20.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:48:20.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T01:48:22.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-05-30T01:48:22.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:48:22.664 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:48:22.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:48:22.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:48:22.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:48:22.685 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:48:22.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:48:22.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:48:22.685 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:48:22.685 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:48:22.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:48:22.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:48:22.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:48:22.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:48:22.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:48:22.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T01:48:22.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:48:22.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T01:48:22.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:48:22.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:48:22.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:48:22.957 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:48:23.018 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:48:00
2026-05-30T01:48:23.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73423, datetime.datetime(2026, 5, 30, 1, 48), datetime.datetime(2026, 5, 30, 1, 48), 'salt', 10.65, 53.22, None, 16.3, 333.51, 9.12, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:48:23.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:48:23.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:48:23.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:48:00, diff=23.025077s, valid=True
2026-05-30T01:48:23.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:48:23.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T01:48:23.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:48:12, diff=11.027987s, valid=True
2026-05-30T01:48:23.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:48:23.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:48:23.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:47:53, diff=30.034713s, valid=True
2026-05-30T01:48:23.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:48:23.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:48:23.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:48:23.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:48:23.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:48:23.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T01:48:23.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:48:12, diff=11.037776s, valid=True
2026-05-30T01:48:23.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:48:23.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:48:23.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:48:23.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031145.038432s, valid=True
2026-05-30T01:48:23.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:48:23.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:48:23.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:48:23.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:48:23.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:48:23.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:48:23.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:48:23.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:48:23.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:48:23.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:48:23.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:48:23.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:48:23.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:48:23.352 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:48:23.556 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:48:23.892 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:48:23.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:48:23.990 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:48:23.990 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:48:24.262 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:48:24.263 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:48:54.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:48:54.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:48:54.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:48:54.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:48:54.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:48:54.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:48:54.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-05-30T01:48:54.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:48:54.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T01:48:54.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:48:54.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:48:54.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:48:54.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-05-30T01:48:57.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-05-30T01:48:57.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:48:57.964 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:48:57.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:48:57.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:48:57.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:48:57.985 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:48:57.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:48:57.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:48:57.986 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:48:57.986 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:48:57.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:48:58.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:48:58.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:48:58.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:48:58.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:48:58.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T01:48:58.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:48:58.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T01:48:58.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:48:58.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:48:58.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:48:58.245 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:48:58.306 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:48:31
2026-05-30T01:48:58.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73424, datetime.datetime(2026, 5, 30, 1, 48, 31), datetime.datetime(2026, 5, 30, 1, 48, 30), 'salt', 10.59, 53.95, None, 16.41, 334.08, 8.93, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:48:58.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:48:58.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:48:58.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:48:30, diff=28.312851s, valid=True
2026-05-30T01:48:58.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:48:58.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T01:48:58.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:48:12, diff=46.315728s, valid=True
2026-05-30T01:48:58.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:48:58.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:48:58.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:48:25, diff=33.322462s, valid=True
2026-05-30T01:48:58.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:48:58.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:48:58.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:48:58.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:48:58.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:48:58.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T01:48:58.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:48:12, diff=46.325515s, valid=True
2026-05-30T01:48:58.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:48:58.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:48:58.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:48:58.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031180.326213s, valid=True
2026-05-30T01:48:58.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:48:58.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:48:58.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:48:58.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:48:58.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:48:58.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:48:58.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:48:58.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:48:58.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:48:58.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:48:58.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:48:58.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:48:58.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:48:58.640 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:48:58.845 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:48:59.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:48:59.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:48:59.280 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:48:59.280 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:48:59.540 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:48:59.540 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:49:29.570 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:49:29.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:49:29.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:49:30.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:49:30.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:49:30.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:49: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-05-30T01:49:30.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:49:30.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-05-30T01:49:30.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:49:30.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:49:30.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:49:30.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-05-30T01:49:32.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-05-30T01:49:32.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:49:32.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:49:32.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:49:32.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:49:32.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:49:32.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:49:32.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:49:32.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:49:32.642 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:49:32.642 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:49:32.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:49:32.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:49:32.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:49:32.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:49:32.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:49:32.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T01:49:32.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:49:32.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T01:49:32.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:49:32.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:49:32.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:49:32.906 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:49:32.967 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:49:31
2026-05-30T01:49:32.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73426, datetime.datetime(2026, 5, 30, 1, 49, 31), datetime.datetime(2026, 5, 30, 1, 49, 31), 'salt', 10.39, 55.01, None, 12.67, 339.19, 8.64, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:49:32.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:49:32.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:49:32.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:31, diff=1.974086s, valid=True
2026-05-30T01:49:32.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:49:32.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T01:49:32.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:12, diff=20.977007s, valid=True
2026-05-30T01:49:32.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:49:32.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:49:32.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:28, diff=4.983861s, valid=True
2026-05-30T01:49:32.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:49:32.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:49:32.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:49:32.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:49:32.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:49:32.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T01:49:32.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:12, diff=20.986923s, valid=True
2026-05-30T01:49:32.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:49:32.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:49:32.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:49:32.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031214.987594s, valid=True
2026-05-30T01:49:32.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:49:32.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:49:32.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:49:32.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:49:32.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:49:33.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:49:33.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:49:33.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:49:33.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:49:33.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:49:33.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:49:33.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:49:33.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:49:33.303 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:49:33.507 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:49:33.900 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:49:33.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:49: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-05-30T01:49:33.999 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:49:34.257 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:49:34.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:50:04.288 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:50:04.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:50:04.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:50:04.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:50:04.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:50:04.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:50:04.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-05-30T01:50:04.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:50:04.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-05-30T01:50:05.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:50:05.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:50:05.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:50:05.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-05-30T01:50:07.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-05-30T01:50:07.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:50:07.645 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:50:07.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:50:07.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:50:07.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:50:07.667 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:50:07.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:50:07.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:50:07.668 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:50:07.668 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:50:07.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:50:07.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:50:07.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:50:07.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:50:07.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:50:07.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T01:50:07.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:50:07.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T01:50:07.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:50:07.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:50:07.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:50:07.933 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:50:07.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:50:01
2026-05-30T01:50:07.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73427, datetime.datetime(2026, 5, 30, 1, 50, 1), datetime.datetime(2026, 5, 30, 1, 50, 1), 'salt', 10.39, 54.75, None, 15.91, 339.87, 8.71, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:50:07.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:50:07.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:50:07.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:50:01, diff=6.998644s, valid=True
2026-05-30T01:50:07.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:50:07.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T01:50:08.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:12, diff=56.001471s, valid=True
2026-05-30T01:50:08.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:50:08.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:50:08.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:59, diff=9.008308s, valid=True
2026-05-30T01:50:08.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:50:08.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:50:08.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:50:08.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:50:08.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:50:08.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T01:50:08.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:12, diff=56.011359s, valid=True
2026-05-30T01:50:08.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:50:08.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:50:08.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:50:08.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031250.012032s, valid=True
2026-05-30T01:50:08.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:50:08.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:50:08.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:50:08.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:50:08.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:50:08.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:50:08.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:50:08.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:50:08.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:50:08.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:50:08.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:50:08.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:50:08.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:50:08.330 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:50:08.537 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:50:08.873 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:50:08.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:50:08.969 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:50:08.969 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:50:09.231 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:50:09.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:50:39.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:50:39.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:50:39.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:50:39.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:50:39.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:50:39.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:50:39.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-05-30T01:50:39.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:50:39.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-05-30T01:50:39.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:50:39.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:50:39.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:50:39.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-05-30T01:50:42.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T01:50:42.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:50:42.914 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:50:42.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:50:42.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:50:42.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:50:42.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:50:42.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:50:42.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:50:42.936 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:50:42.936 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:50:42.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:50:43.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:50:43.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:50:43.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:50:43.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:50:43.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T01:50:43.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:50:43.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T01:50:43.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:50:43.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:50:43.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:50:43.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:50:43.273 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:50:32
2026-05-30T01:50:43.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73428, datetime.datetime(2026, 5, 30, 1, 50, 32), datetime.datetime(2026, 5, 30, 1, 50, 31), 'salt', 10.32, 54.68, None, 12.25, 316.65, 8.72, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:50:43.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:50:43.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:50:43.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:50:31, diff=12.279333s, valid=True
2026-05-30T01:50:43.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:50:43.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T01:50:43.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:12, diff=91.282168s, valid=True
2026-05-30T01:50:43.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:50:43.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:50:43.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:50:31, diff=12.288878s, valid=True
2026-05-30T01:50:43.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:50:43.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:50:43.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:50:43.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:50:43.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:50:43.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T01:50:43.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:12, diff=91.291907s, valid=True
2026-05-30T01:50:43.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:50:43.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:50:43.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:50:43.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031285.292565s, valid=True
2026-05-30T01:50:43.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:50:43.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:50:43.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:50:43.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:50:43.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:50:43.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:50:43.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:50:43.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:50:43.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:50:43.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:50:43.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:50:43.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:50:43.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:50:43.608 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:50:43.902 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:50:44.251 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:50:44.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:50:44.352 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:50:44.352 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:50:44.542 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:50:44.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:51:14.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:51:14.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:51:14.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:51:14.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:51:14.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:51:14.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:51:14.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-05-30T01:51:14.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:51:14.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-05-30T01:51:14.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:51:14.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:51:14.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:51:14.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-05-30T01:51: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-05-30T01:51:18.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:51:18.262 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:51:18.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:51:18.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:51:18.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:51:18.285 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:51:18.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:51:18.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:51:18.285 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:51:18.285 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:51:18.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:51:18.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:51:18.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:51:18.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:51:18.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:51:18.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T01:51:18.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:51:18.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T01:51:18.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:51:18.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:51:18.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:51:18.547 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:51:18.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:51:02
2026-05-30T01:51:18.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73429, datetime.datetime(2026, 5, 30, 1, 51, 2), datetime.datetime(2026, 5, 30, 1, 51, 1), 'salt', 10.39, 54.91, None, 16.51, 331.84, 8.67, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:51:18.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:51:18.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:51:18.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:51:01, diff=17.616639s, valid=True
2026-05-30T01:51:18.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:51:18.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T01:51:18.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:12, diff=126.619505s, valid=True
2026-05-30T01:51:18.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:51:18.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:51:18.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:50:53, diff=25.629354s, valid=True
2026-05-30T01:51:18.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:51:18.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:51:18.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:51:18.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:51:18.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:51:18.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T01:51:18.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:12, diff=126.632744s, valid=True
2026-05-30T01:51:18.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:51:18.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:51:18.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:51:18.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031320.633408s, valid=True
2026-05-30T01:51:18.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:51:18.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:51:18.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:51:18.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:51:18.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:51:18.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:51:18.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:51:18.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:51:18.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:51:18.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:51:18.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:51:18.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:51:18.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:51:18.967 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:51:19.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:51:19.580 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:51:19.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:51:19.688 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:51:19.688 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:51:19.889 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:51:19.889 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:51:49.900 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:51:49.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:51:49.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:51:50.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:51:50.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:51:50.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:51:50.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T01:51:50.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:51:50.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-05-30T01:51:50.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:51:50.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:51:50.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:51:50.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-05-30T01:51:53.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-05-30T01:51:53.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:51:53.123 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:51:53.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:51:53.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:51:53.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:51:53.145 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:51:53.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:51:53.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:51:53.145 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:51:53.146 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:51:53.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:51:53.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:51:53.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:51:53.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:51:53.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:51:53.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T01:51:53.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:51:53.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T01:51:53.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:51:53.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:51:53.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:51:53.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:51:53.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:51:32
2026-05-30T01:51:53.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73430, datetime.datetime(2026, 5, 30, 1, 51, 32), datetime.datetime(2026, 5, 30, 1, 51, 31), 'salt', 10.32, 54.52, None, 14.29, 346.39, 8.76, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:51:53.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:51:53.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:51:53.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:51:31, diff=22.473616s, valid=True
2026-05-30T01:51:53.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:51:53.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T01:51:53.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:12, diff=161.476493s, valid=True
2026-05-30T01:51:53.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:51:53.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:51:53.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:51:23, diff=30.484535s, valid=True
2026-05-30T01:51:53.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:51:53.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:51:53.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:51:53.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:51:53.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:51:53.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T01:51:53.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:12, diff=161.487633s, valid=True
2026-05-30T01:51:53.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:51:53.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:51:53.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:51:53.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031355.488295s, valid=True
2026-05-30T01:51:53.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:51:53.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:51:53.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:51:53.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:51:53.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:51:53.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:51:53.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:51:53.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:51:53.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:51:53.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:51:53.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:51:53.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:51:53.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:51:53.884 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:51:54.109 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:51:54.476 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:51:54.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:51:54.578 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:51:54.578 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:51:54.764 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:51:54.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:52:24.793 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:52:24.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:52:24.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:52:25.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:52:25.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:52:25.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:52:25.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-05-30T01:52:25.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:52:25.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-05-30T01:52:25.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:52:25.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:52:25.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:52:25.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T01:52:33.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-05-30T01:52:33.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:52:33.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:52:33.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:52:33.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:52:33.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:52:33.183 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:52:33.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:52:33.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:52:33.183 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:52:33.183 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:52:33.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:52:33.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:52:33.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:52:33.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:52:33.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:52:33.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T01:52:33.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:52:33.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T01:52:33.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:52:33.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:52:33.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:52:33.452 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:52:33.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:52:32
2026-05-30T01:52:33.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73432, datetime.datetime(2026, 5, 30, 1, 52, 32), datetime.datetime(2026, 5, 30, 1, 52, 32), 'salt', 10.26, 55.11, None, 14.36, 327.87, 8.61, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:52:33.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:52:33.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:52:33.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:52:32, diff=1.524965s, valid=True
2026-05-30T01:52:33.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:52:33.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T01:52:33.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:12, diff=201.527874s, valid=True
2026-05-30T01:52:33.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:52:33.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:52:33.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:52:26, diff=7.53471s, valid=True
2026-05-30T01:52:33.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:52:33.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:52:33.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:52:33.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:52:33.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:52:33.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T01:52:33.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:12, diff=201.537779s, valid=True
2026-05-30T01:52:33.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:52:33.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:52:33.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:52:33.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031395.538436s, valid=True
2026-05-30T01:52:33.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:52:33.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:52:33.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:52:33.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:52:33.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:52:33.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:52:33.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:52:33.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:52:33.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:52:33.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:52:33.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:52:33.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:52:33.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:52:33.866 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:52:34.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:52:34.442 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:52:34.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:52:34.555 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:52:34.555 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:52:34.742 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:52:34.742 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:53:04.761 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:53:04.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:53:04.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:53:05.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:53:05.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:53:05.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:53:05.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-05-30T01:53:05.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:53:05.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-05-30T01:53:05.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:53:05.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:53:05.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:53:05.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-05-30T01:53:08.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-05-30T01:53:08.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:53:08.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:53:08.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:53:08.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:53:08.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:53:08.522 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:53:08.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:53:08.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:53:08.522 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:53:08.522 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:53:08.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:53:08.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:53:08.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:53:08.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:53:08.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:53:08.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:53:08.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:53:08.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:53:08.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:53:08.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:53:08.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:53:08.799 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:53:08.865 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:53:03
2026-05-30T01:53:08.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73433, datetime.datetime(2026, 5, 30, 1, 53, 3), datetime.datetime(2026, 5, 30, 1, 53, 2), 'salt', 10.16, 55.15, None, 14.75, 331.98, 8.59, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:53:08.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:53:08.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:53:08.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:53:02, diff=6.872019s, valid=True
2026-05-30T01:53:08.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:53:08.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:53:08.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:12, diff=236.874866s, valid=True
2026-05-30T01:53:08.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:53:08.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:53:08.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:52:58, diff=10.881613s, valid=True
2026-05-30T01:53:08.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:53:08.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:53:08.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:53:08.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:53:08.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:53:08.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:53:08.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:49:12, diff=236.884641s, valid=True
2026-05-30T01:53:08.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:53:08.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:53:08.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:53:08.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031430.885294s, valid=True
2026-05-30T01:53:08.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:53:08.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:53:08.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:53:08.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:53:08.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:53:08.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:53:08.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:53:08.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:53:08.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:53:09.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:53:09.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:53:09.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:53:09.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:53:09.278 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:53:09.494 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:53:09.857 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:53:09.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:53:09.971 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:53:09.971 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:53:10.223 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:53:10.223 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:53:40.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:53:40.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:53:40.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:53:40.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:53:40.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:53:40.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:53:40.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-05-30T01:53:40.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:53:40.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T01:53:40.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:53:40.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:53:40.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:53:40.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-05-30T01:54:34.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-05-30T01:54:34.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:54:34.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:54:34.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:54:34.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:54:34.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:54:34.289 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:54:34.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:54:34.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:54:34.289 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:54:34.289 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:54:34.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:54:34.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:54:34.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:54:34.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:54:34.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:54:34.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:54:34.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:54:34.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:54:34.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:54:34.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:54:34.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:54:34.552 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:54:34.614 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:54:33
2026-05-30T01:54:34.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73436, datetime.datetime(2026, 5, 30, 1, 54, 33), datetime.datetime(2026, 5, 30, 1, 54, 33), 'salt', 10.19, 55.61, None, 15.03, 335.06, 8.48, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:54:34.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:54:34.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:54:34.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:54:33, diff=1.621224s, valid=True
2026-05-30T01:54:34.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:54:34.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:54:34.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:55:12, diff=-37.375859s, valid=True
2026-05-30T01:54:34.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:54:34.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:54:34.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:54:33, diff=1.630962s, valid=True
2026-05-30T01:54:34.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:54:34.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:54:34.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:54:34.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:54:34.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:54:34.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:54:34.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:55:12, diff=-37.365864s, valid=True
2026-05-30T01:54:34.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:54:34.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:54:34.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:54:34.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031516.634918s, valid=True
2026-05-30T01:54:34.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:54:34.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:54:34.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:54:34.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:54:34.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:54:34.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:54:34.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:54:34.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:54:34.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:54:34.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:54:34.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:54:34.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:54:34.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:54:35.035 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:54:35.249 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:54:35.590 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:54:35.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:54:35.689 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:54:35.690 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:54:35.949 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:54:35.949 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:55:05.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:55:05.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:55:05.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:55:07.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:55:07.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:55:07.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:55:07.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-05-30T01:55:07.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:55:07.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-05-30T01:55:07.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:55:07.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:55:07.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:55:07.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-05-30T01:55:19.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-05-30T01:55:19.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:55:19.781 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:55:19.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:55:19.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:55:19.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:55:19.802 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:55:19.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:55:19.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:55:19.802 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:55:19.802 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:55:19.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:55:19.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:55:19.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:55:19.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:55:19.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:55:20.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:55:20.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:55:20.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:55:20.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:55:20.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:55:20.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:55:20.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:55:20.121 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:55:04
2026-05-30T01:55:20.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73437, datetime.datetime(2026, 5, 30, 1, 55, 4), datetime.datetime(2026, 5, 30, 1, 55, 3), 'salt', 10.09, 55.64, None, 11.61, 335.71, 8.46, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:55:20.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:55:20.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:55:20.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:55:03, diff=17.12803s, valid=True
2026-05-30T01:55:20.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:55:20.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:55:20.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:55:12, diff=8.131155s, valid=True
2026-05-30T01:55:20.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:55:20.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:55:20.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:54:55, diff=25.137997s, valid=True
2026-05-30T01:55:20.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:55:20.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:55:20.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:55:20.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:55:20.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:55:20.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:55:20.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:55:12, diff=8.141121s, valid=True
2026-05-30T01:55:20.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:55:20.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:55:20.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:55:20.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031562.141815s, valid=True
2026-05-30T01:55:20.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:55:20.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:55:20.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:55:20.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:55:20.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:55:20.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:55:20.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:55:20.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:55:20.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:55:20.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:55:20.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:55:20.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:55:20.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:55:20.459 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:55:20.675 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:55:21.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:55:21.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:55:21.124 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:55:21.124 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:55:21.307 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:55:21.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:55:51.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:55:51.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:55:51.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:55:51.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:55:51.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:55:51.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:55:51.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-05-30T01:55:51.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:55:51.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T01:55:51.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:55:51.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:55:51.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:55: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-05-30T01:55:54.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-05-30T01:55:54.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:55:54.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:55:54.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:55:54.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:55:54.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:55:54.193 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:55:54.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:55:54.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:55:54.193 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:55:54.193 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:55:54.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:55:54.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:55:54.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:55:54.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:55:54.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:55:54.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:55:54.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:55:54.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:55:54.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:55:54.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:55:54.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:55:54.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:55:54.522 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:55:34
2026-05-30T01:55:54.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73438, datetime.datetime(2026, 5, 30, 1, 55, 34), datetime.datetime(2026, 5, 30, 1, 55, 33), 'salt', 10.12, 55.38, None, 15.0, 322.83, 8.53, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:55:54.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:55:54.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:55:54.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:55:33, diff=21.528793s, valid=True
2026-05-30T01:55:54.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:55:54.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:55:54.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:56:12, diff=-17.468403s, valid=True
2026-05-30T01:55:54.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:55:54.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:55:54.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:55:25, diff=29.538203s, valid=True
2026-05-30T01:55:54.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:55:54.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:55:54.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:55:54.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:55:54.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:55:54.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:55:54.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:56:12, diff=-17.458786s, valid=True
2026-05-30T01:55:54.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:55:54.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:55:54.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:55:54.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031596.541876s, valid=True
2026-05-30T01:55:54.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:55:54.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:55:54.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:55:54.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:55:54.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:55:54.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:55:54.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:55:54.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:55:54.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:55:54.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:55:54.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:55:54.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:55:54.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:55:54.858 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:55:55.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:55:55.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:55:55.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:55:55.572 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:55:55.572 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:55:55.780 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:55:55.780 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:56:25.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:56:25.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:56:25.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:56:26.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:56:26.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:56:26.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:56:26.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-05-30T01:56:26.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:56:26.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-05-30T01:56:26.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:56:26.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:56:26.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:56:26.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-05-30T01:56:28.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-05-30T01:56:28.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:56:28.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:56:28.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:56:28.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:56:28.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:56:28.742 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:56:28.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:56:28.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:56:28.742 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:56:28.742 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:56:28.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:56:28.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:56:28.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:56:28.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:56:28.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:56:28.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:56:28.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:56:28.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:56:28.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:56:28.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:56:28.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:56:28.998 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:56:29.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:56:04
2026-05-30T01:56:29.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73439, datetime.datetime(2026, 5, 30, 1, 56, 4), datetime.datetime(2026, 5, 30, 1, 56, 4), 'salt', 10.19, 55.68, None, 15.39, 338.2, 8.46, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:56:29.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:56:29.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:56:29.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:56:04, diff=25.065162s, valid=True
2026-05-30T01:56:29.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:56:29.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:56:29.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:56:12, diff=17.067977s, valid=True
2026-05-30T01:56:29.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:56:29.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:56:29.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:55:57, diff=32.074573s, valid=True
2026-05-30T01:56:29.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:56:29.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:56:29.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:56:29.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:56:29.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:56:29.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:56:29.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:56:12, diff=17.077596s, valid=True
2026-05-30T01:56:29.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:56:29.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:56:29.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:56:29.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031631.078258s, valid=True
2026-05-30T01:56:29.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:56:29.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:56:29.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:56:29.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:56:29.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:56:29.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:56:29.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:56:29.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:56:29.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:56:29.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:56:29.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:56:29.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:56:29.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:56:29.398 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:56:29.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:56:29.978 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:56:30.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:56:30.089 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:56:30.089 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:56:30.276 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:56:30.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:57:00.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:57:00.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:57:00.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:57:00.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:57:00.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:57:00.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:57:00.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-05-30T01:57:00.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:57:00.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-05-30T01:57:00.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:57:00.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:57:00.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:57:00.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T01:57:41.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-05-30T01:57:41.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:57:41.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:57:41.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:57:41.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:57:41.609 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:57:41.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:57:41.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:57:41.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:57:41.609 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:57:41.609 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:57:41.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:57:41.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:57:41.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:57:41.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:57:41.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:57:41.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:57:41.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:57:41.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T01:57:41.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:57:41.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:57:41.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:57:41.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:57:41.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:57:35
2026-05-30T01:57:41.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73442, datetime.datetime(2026, 5, 30, 1, 57, 35), datetime.datetime(2026, 5, 30, 1, 57, 34), 'salt', 10.22, 54.55, None, 14.01, 326.53, 8.74, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:57:41.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:57:41.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:57:41.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:57:34, diff=7.930026s, valid=True
2026-05-30T01:57:41.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:57:41.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:57:41.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:58:12, diff=-30.067088s, valid=True
2026-05-30T01:57:41.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:57:41.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:57:41.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:57:31, diff=10.939684s, valid=True
2026-05-30T01:57:41.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:57:41.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:57:41.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:57:41.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:57:41.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:57:41.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T01:57:41.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:58:12, diff=-30.057298s, valid=True
2026-05-30T01:57:41.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:57:41.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:57:41.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:57:41.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031703.94337s, valid=True
2026-05-30T01:57:41.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:57:41.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:57:41.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:57:41.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:57:41.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:57:42.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:57:42.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:57:42.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:57:42.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:57:42.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:57:42.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:57:42.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:57:42.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:57:42.264 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:57:42.476 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:57:42.892 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:57:42.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:57:42.993 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:57:42.994 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:57:43.132 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:57:43.132 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:58:13.143 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:58:13.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:58:13.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:58:13.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:58:13.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:58:13.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:58:13.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-05-30T01:58:13.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:58:13.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-05-30T01:58:13.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:58:13.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:58:13.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:58:13.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-05-30T01:58:16.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-05-30T01:58:16.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:58:16.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:58:16.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:58:16.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:58:16.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:58:16.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:58:16.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:58:16.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:58:16.055 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:58:16.055 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:58:16.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:58:16.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T01:58:16.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:58:16.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T01:58:16.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:58:16.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:58:16.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:58:16.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:58:16.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:58:16.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:58:16.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:58:16.350 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:58:16.413 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:58:05
2026-05-30T01:58:16.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73443, datetime.datetime(2026, 5, 30, 1, 58, 5), datetime.datetime(2026, 5, 30, 1, 58, 5), 'salt', 10.35, 54.71, None, 16.02, 341.23, 8.71, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:58:16.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:58:16.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T01:58:16.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:58:05, diff=11.419229s, valid=True
2026-05-30T01:58:16.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:58:16.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:58:16.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:58:12, diff=4.4221s, valid=True
2026-05-30T01:58:16.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:58:16.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T01:58:16.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:58:02, diff=14.428989s, valid=True
2026-05-30T01:58:16.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:58:16.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:58:16.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:58:16.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:58:16.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:58:16.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:58:16.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:58:12, diff=4.43205s, valid=True
2026-05-30T01:58:16.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:58:16.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:58:16.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:58:16.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031738.432715s, valid=True
2026-05-30T01:58:16.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:58:16.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:58:16.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:58:16.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:58:16.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:58:16.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:58:16.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:58:16.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:58:16.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:58:16.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:58:16.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:58:16.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:58:16.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:58:16.749 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:58:16.993 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:58:17.339 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:58:17.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:58:17.442 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:58:17.442 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:58:17.628 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:58:17.628 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:58:47.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:58:47.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:58:47.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:58:47.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:58:47.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:58:48.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:58:48.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-05-30T01:58:48.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:58:48.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-05-30T01:58:48.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:58:48.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:58:48.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:58:48.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-05-30T01:58:50.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-05-30T01:58:50.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:58:50.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:58:50.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:58:50.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:58:50.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:58:50.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:58:50.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:58:50.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:58:50.779 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:58:50.779 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:58:50.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:58:50.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:58:50.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:58:50.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:58:50.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:58:50.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:58:50.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:58:51.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:58:51.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:58:51.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:58:51.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:58:51.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:58:51.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:58:35
2026-05-30T01:58:51.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73444, datetime.datetime(2026, 5, 30, 1, 58, 35), datetime.datetime(2026, 5, 30, 1, 58, 35), 'salt', 10.32, 55.08, None, 15.84, 345.38, 8.62, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:58:51.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:58:51.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:58:51.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:58:35, diff=16.102516s, valid=True
2026-05-30T01:58:51.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:58:51.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:58:51.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:59:12, diff=-20.894611s, valid=True
2026-05-30T01:58:51.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:58:51.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:58:51.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:58:34, diff=17.112054s, valid=True
2026-05-30T01:58:51.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:58:51.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:58:51.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:58:51.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:58:51.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:58:51.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:58:51.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:59:12, diff=-20.884894s, valid=True
2026-05-30T01:58:51.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:58:51.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:58:51.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:58:51.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031773.115772s, valid=True
2026-05-30T01:58:51.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:58:51.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:58:51.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:58:51.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:58:51.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:58:51.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:58:51.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:58:51.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:58:51.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:58:51.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:58:51.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:58:51.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:58:51.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:58:51.508 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:58:51.723 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:58:52.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:58:52.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:58:52.170 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:58:52.170 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:58:52.356 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:58:52.356 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:59:22.386 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:59:22.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:59:22.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:59:22.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:59:22.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:59:22.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:59:22.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-05-30T01:59:22.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:59:22.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T01:59:22.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:59:22.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:59:22.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:59:22.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-05-30T01:59: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-05-30T01:59:25.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T01:59:25.560 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T01:59:25.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T01:59:25.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T01:59:25.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T01:59:25.581 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T01:59:25.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T01:59:25.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T01:59:25.582 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T01:59:25.582 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T01:59:25.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T01:59:25.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T01:59:25.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T01:59:25.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T01:59:25.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:59:25.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:59:25.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T01:59:25.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T01:59:25.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T01:59:25.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T01:59:25.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T01:59:25.839 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T01:59:25.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:59:05
2026-05-30T01:59:25.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73445, datetime.datetime(2026, 5, 30, 1, 59, 5), datetime.datetime(2026, 5, 30, 1, 59, 5), 'salt', 10.32, 54.88, None, 14.72, 313.11, 8.67, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T01:59:25.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T01:59:25.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T01:59:25.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:59:05, diff=20.904315s, valid=True
2026-05-30T01:59:25.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T01:59:25.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:59:25.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:59:12, diff=13.90719s, valid=True
2026-05-30T01:59:25.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T01:59:25.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T01:59:25.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:58:57, diff=28.913938s, valid=True
2026-05-30T01:59:25.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T01:59:25.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:59:25.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T01:59:25.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T01:59:25.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T01:59:25.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T01:59:25.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:59:12, diff=13.917038s, valid=True
2026-05-30T01:59:25.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T01:59:25.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T01:59:25.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T01:59:25.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031807.917721s, valid=True
2026-05-30T01:59:25.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T01:59:25.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T01:59:25.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T01:59:25.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T01:59:25.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T01:59:25.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T01:59:25.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T01:59:25.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T01:59:26.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T01:59:26.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T01:59:26.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T01:59:26.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T01:59:26.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T01:59:26.246 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T01:59:26.469 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:59:26.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T01:59:26.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T01:59:26.921 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T01:59:26.921 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T01:59:27.109 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T01:59:27.109 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T01:59:57.139 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T01:59:57.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T01:59:57.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T01:59:57.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T01:59:57.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T01:59:57.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T01:59:57.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-05-30T01:59:57.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T01:59:57.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-05-30T01:59:57.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T01:59:57.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T01:59:57.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T01:59:57.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-05-30T02:00:00.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-05-30T02:00:00.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:00:00.059 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:00:00.059 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:00:00.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:00:00.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:00:00.080 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:00:00.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:00:00.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:00:00.080 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:00:00.080 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:00:00.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:00:00.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:00:00.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:00:00.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:00:00.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:00:00.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:00:00.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:00:00.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:00:00.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:00:00.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:00:00.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:00:00.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:00:00.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 01:59:36
2026-05-30T02:00:00.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73446, datetime.datetime(2026, 5, 30, 1, 59, 36), datetime.datetime(2026, 5, 30, 1, 59, 35), 'salt', 10.22, 55.05, None, 16.2, 333.43, 8.62, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:00:00.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:00:00.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:00:00.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:59:35, diff=25.412045s, valid=True
2026-05-30T02:00:00.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:00:00.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:00:00.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:00:12, diff=-11.585145s, valid=True
2026-05-30T02:00:00.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:00:00.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:00:00.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:59:27, diff=33.42156s, valid=True
2026-05-30T02:00:00.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:00:00.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:00:00.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:00:00.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:00:00.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:00:00.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:00:00.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:00:12, diff=-11.575434s, valid=True
2026-05-30T02:00:00.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:00:00.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:00:00.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:00:00.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031842.425247s, valid=True
2026-05-30T02:00:00.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:00:00.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:00:00.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:00:00.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:00:00.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:00:00.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:00:00.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:00:00.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:00:00.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:00:00.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:00:00.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:00:00.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:00:00.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:00:00.811 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:00:01.045 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:00:01.391 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:00:01.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:00:01.492 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:00:01.492 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:00:01.752 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:00:01.752 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:00:31.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:00:31.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:00:31.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:00:32.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:00:32.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:00:32.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:00:32.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-05-30T02:00:32.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:00:32.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-05-30T02:00:32.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:00:32.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:00:32.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:00:32.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-05-30T02:00:34.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-05-30T02:00:34.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:00:34.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:00:34.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:00:34.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:00:34.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:00:34.985 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:00:34.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:00:34.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:00:34.986 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:00:34.986 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:00:34.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:00:35.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:00:35.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:00:35.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:00:35.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:00:35.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:00:35.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:00:35.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:00:35.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:00:35.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:00:35.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:00:35.244 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:00:35.304 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:00:06
2026-05-30T02:00:35.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73447, datetime.datetime(2026, 5, 30, 2, 0, 6), datetime.datetime(2026, 5, 30, 2, 0, 5), 'salt', 10.22, 54.81, None, 16.06, 335.59, 8.68, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:00:35.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:00:35.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:00:35.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:00:05, diff=30.310046s, valid=True
2026-05-30T02:00:35.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:00:35.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:00:35.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:00:12, diff=23.312864s, valid=True
2026-05-30T02:00:35.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:00:35.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:00:35.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 01:59:58, diff=37.319603s, valid=True
2026-05-30T02:00:35.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:00:35.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:00:35.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:00:35.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:00:35.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:00:35.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:00:35.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:00:12, diff=23.322584s, valid=True
2026-05-30T02:00:35.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:00:35.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:00:35.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:00:35.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031877.323246s, valid=True
2026-05-30T02:00:35.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:00:35.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:00:35.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:00:35.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:00:35.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:00:35.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:00:35.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:00:35.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:00:35.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:00:35.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:00:35.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:00:35.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:00:35.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:00:35.640 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:00:35.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:00:36.197 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:00:36.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:00: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-05-30T02:00: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-05-30T02:00:36.479 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:00:36.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:01:06.485 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:01:06.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:01:06.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:01:07.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:01:07.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:01:07.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:01:07.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-05-30T02:01:07.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:01:07.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-05-30T02:01:07.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:01:07.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:01:07.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:01:07.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-05-30T02:01:10.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-05-30T02:01:10.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:01:10.016 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:01:10.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:01:10.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:01:10.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:01:10.047 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:01:10.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:01:10.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:01:10.048 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:01:10.048 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:01:10.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:01:10.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:01:10.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:01:10.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:01:10.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:01:10.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:01:10.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:01:10.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:01:10.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:01:10.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:01:10.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:01:10.305 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:01:10.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:01:06
2026-05-30T02:01:10.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73449, datetime.datetime(2026, 5, 30, 2, 1, 6), datetime.datetime(2026, 5, 30, 2, 1, 6), 'salt', 10.16, 55.24, None, 15.91, 345.17, 8.57, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:01:10.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:01:10.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:01:10.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:01:06, diff=4.376845s, valid=True
2026-05-30T02:01:10.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:01:10.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:01:10.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:01:12, diff=-1.620332s, valid=True
2026-05-30T02:01:10.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:01:10.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:01:10.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:01:01, diff=9.38633s, valid=True
2026-05-30T02:01:10.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:01:10.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:01:10.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:01:10.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:01:10.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:01:10.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:01:10.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:01:12, diff=-1.610669s, valid=True
2026-05-30T02:01:10.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:01:10.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:01:10.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:01:10.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031912.390012s, valid=True
2026-05-30T02:01:10.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:01:10.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:01:10.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:01:10.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:01:10.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:01:10.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:01:10.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:01:10.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:01:10.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:01:10.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:01:10.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:01:10.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:01:10.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:01:10.776 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:01:10.993 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:01:11.341 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:01:11.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:01:11.444 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:01:11.444 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:01:11.654 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:01:11.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:01:41.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:01:41.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:01:41.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:01:42.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:01:42.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:01:42.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:01:42.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-05-30T02:01:42.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:01:42.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-05-30T02:01:42.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:01:42.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:01:42.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:01:42.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-05-30T02:01:44.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-05-30T02:01:44.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:01:44.757 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:01:44.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:01:44.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:01:44.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:01:44.783 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:01:44.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:01:44.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:01:44.783 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:01:44.783 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:01:44.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:01:44.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:01:44.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:01:44.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:01:44.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:01:44.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:01:44.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:01:45.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:01:45.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:01:45.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:01:45.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:01:45.031 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:01:45.091 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:01:36
2026-05-30T02:01:45.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73450, datetime.datetime(2026, 5, 30, 2, 1, 36), datetime.datetime(2026, 5, 30, 2, 1, 36), 'salt', 10.06, 55.01, None, 14.64, 303.22, 8.62, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:01:45.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:01:45.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:01:45.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:01:36, diff=9.097511s, valid=True
2026-05-30T02:01:45.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:01:45.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:01:45.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:02:12, diff=-26.899666s, valid=True
2026-05-30T02:01:45.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:01:45.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:01:45.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:01:32, diff=13.107052s, valid=True
2026-05-30T02:01:45.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:01:45.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:01:45.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:01:45.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:01:45.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:01:45.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:01:45.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:02:12, diff=-26.889958s, valid=True
2026-05-30T02:01:45.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:01:45.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:01:45.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:01:45.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031947.110708s, valid=True
2026-05-30T02:01:45.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:01:45.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:01:45.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:01:45.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:01:45.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:01:45.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:01:45.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:01:45.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:01:45.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:01:45.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:01:45.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:01:45.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:01:45.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:01:45.437 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:01:45.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:01:46.009 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:01:46.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:01:46.114 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:01:46.114 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:01:46.292 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:01:46.292 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:02:16.321 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:02:16.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:02:16.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:02:16.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:02:16.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:02:16.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:02:16.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-05-30T02:02:16.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:02: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-05-30T02:02:16.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:02:16.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:02:16.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:02:16.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-05-30T02:02:19.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-05-30T02:02:19.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:02:19.740 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:02:19.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:02:19.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:02:19.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:02:19.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:02:19.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:02:19.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:02:19.761 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:02:19.761 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:02:19.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:02:19.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:02:19.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:02:19.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:02:19.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:02:19.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:02:19.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:02:20.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:02:20.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:02:20.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:02:20.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:02:20.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:02:20.091 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:02:07
2026-05-30T02:02:20.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73451, datetime.datetime(2026, 5, 30, 2, 2, 7), datetime.datetime(2026, 5, 30, 2, 2, 6), 'salt', 10.22, 54.85, None, 15.91, 350.19, 8.67, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:02:20.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:02:20.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:02:20.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:02:06, diff=14.098328s, valid=True
2026-05-30T02:02:20.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:02:20.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:02:20.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:02:12, diff=8.101275s, valid=True
2026-05-30T02:02:20.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:02:20.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:02:20.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:02:04, diff=16.107973s, valid=True
2026-05-30T02:02:20.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:02:20.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:02:20.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:02:20.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:02:20.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:02:20.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:02:20.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:02:12, diff=8.111029s, valid=True
2026-05-30T02:02:20.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:02:20.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:02:20.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:02:20.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1031982.111791s, valid=True
2026-05-30T02:02:20.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:02:20.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:02:20.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:02:20.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:02:20.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:02:20.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:02:20.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:02:20.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:02:20.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:02:20.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:02:20.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:02:20.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:02:20.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:02:20.430 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:02:20.645 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:02:20.994 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:02:21.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:02:21.095 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:02: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-05-30T02:02:21.271 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:02:21.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:02:51.301 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:02:51.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:02:51.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:02:51.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:02:51.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:02:51.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:02:51.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-05-30T02:02:51.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:02:51.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T02:02:51.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:02:51.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:02:51.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:02:51.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-05-30T02:03:40.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-05-30T02:03:40.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:03:40.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:03:40.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:03:40.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:03:40.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:03:40.687 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:03:40.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:03:40.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:03:40.687 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:03:40.687 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:03:40.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:03:40.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:03:40.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:03:40.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:03:40.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:03:40.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:03:40.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:03:40.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:03:40.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:03:40.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:03:40.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:03:40.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:03:41.016 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:03:37
2026-05-30T02:03:41.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73454, datetime.datetime(2026, 5, 30, 2, 3, 37), datetime.datetime(2026, 5, 30, 2, 3, 37), 'salt', 10.42, 54.38, None, 16.55, 340.85, 8.8, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:03:41.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:03:41.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:03:41.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:03:37, diff=4.022833s, valid=True
2026-05-30T02:03:41.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:03:41.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:03:41.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:04:12, diff=-30.974398s, valid=True
2026-05-30T02:03:41.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:03:41.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:03:41.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:03:29, diff=12.032102s, valid=True
2026-05-30T02:03:41.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:03:41.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:03:41.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:03:41.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:03:41.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:03:41.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:03:41.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:04:12, diff=-30.964886s, valid=True
2026-05-30T02:03:41.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:03:41.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:03:41.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:03:41.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032063.035777s, valid=True
2026-05-30T02:03:41.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:03:41.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:03:41.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:03:41.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:03:41.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:03:41.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:03:41.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:03:41.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:03:41.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:03:41.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:03:41.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:03:41.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:03:41.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:03:41.353 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:03:41.565 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:03:41.972 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:03:42.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:03: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-05-30T02:03: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-05-30T02:03:42.247 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:03:42.247 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:04:12.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:04:12.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:04:12.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:04:12.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:04:12.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:04:12.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:04:12.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-05-30T02:04:12.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:04:12.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-05-30T02:04:12.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:04:12.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:04:12.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:04:12.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-05-30T02:04:16.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-05-30T02:04:16.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:04:16.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:04:16.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:04:16.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:04:16.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:04:16.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:04:16.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:04:16.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:04:16.766 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:04:16.766 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:04:16.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:04:16.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:04:16.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:04:16.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:04:16.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:04:16.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:04:16.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:04:17.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:04:17.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:04:17.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:04:17.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:04:17.026 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:04:17.087 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:04:07
2026-05-30T02:04:17.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73455, datetime.datetime(2026, 5, 30, 2, 4, 7), datetime.datetime(2026, 5, 30, 2, 4, 7), 'salt', 10.42, 54.18, None, 17.36, 337.21, 8.85, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:04:17.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:04:17.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:04:17.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:04:07, diff=10.093534s, valid=True
2026-05-30T02:04:17.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:04:17.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:04:17.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:04:12, diff=5.096442s, valid=True
2026-05-30T02:04:17.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:04:17.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:04:17.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:03:59, diff=18.103244s, valid=True
2026-05-30T02:04:17.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:04:17.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:04:17.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:04:17.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:04:17.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:04:17.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:04:17.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:04:12, diff=5.106282s, valid=True
2026-05-30T02:04:17.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:04:17.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:04:17.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:04:17.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032099.106949s, valid=True
2026-05-30T02:04:17.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:04:17.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:04:17.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:04:17.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:04:17.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:04:17.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:04:17.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:04:17.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:04:17.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:04:17.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:04:17.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:04:17.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:04:17.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:04:17.424 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:04:17.653 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:04:18.002 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:04:18.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:04:18.103 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:04:18.103 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:04:18.281 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:04:18.281 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:04:48.312 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:04:48.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:04:48.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:04:48.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:04:48.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:04:48.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:04:48.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-05-30T02:04:48.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:04:48.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-05-30T02:04:48.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:04:48.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:04:48.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:04:48.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-05-30T02:05:30.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-05-30T02:05:30.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:05:30.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:05:30.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:05:30.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:05:30.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:05:30.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:05:30.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:05:30.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:05:30.916 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:05:30.916 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:05:30.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:05:31.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:05:31.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:05:31.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:05:31.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:05:31.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:05:31.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:05:31.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:05:31.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:05:31.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:05:31.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:05:31.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:05:31.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:05:08
2026-05-30T02:05:31.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73457, datetime.datetime(2026, 5, 30, 2, 5, 8), datetime.datetime(2026, 5, 30, 2, 5, 8), 'salt', 10.32, 54.28, None, 16.48, 339.14, 8.82, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:05:31.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:05:31.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:05:31.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:05:08, diff=23.257615s, valid=True
2026-05-30T02:05:31.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:05:31.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:05:31.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:05:12, diff=19.260561s, valid=True
2026-05-30T02:05:31.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:05:31.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:05:31.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:05:02, diff=29.267345s, valid=True
2026-05-30T02:05:31.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:05:31.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:05:31.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:05:31.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:05:31.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:05:31.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:05:31.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:05:12, diff=19.270493s, valid=True
2026-05-30T02:05:31.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:05:31.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:05:31.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:05:31.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032173.271291s, valid=True
2026-05-30T02:05:31.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:05:31.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:05:31.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:05:31.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:05:31.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:05:31.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:05:31.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:05:31.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:05:31.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:05:31.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:05:31.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:05:31.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:05:31.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:05:31.622 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:05:31.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:05:32.364 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:05:32.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:05:32.475 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:05:32.475 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:05:32.707 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:05:32.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:06:02.737 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:06:02.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:06:02.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:06:02.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:06:02.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:06:03.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:06:03.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-05-30T02:06:03.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:06:03.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-05-30T02:06:03.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:06:03.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:06:03.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:06:03.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-05-30T02:06:36.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-05-30T02:06:36.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:06:36.812 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:06:36.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:06:36.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:06:36.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:06:36.833 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:06:36.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:06:36.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:06:36.833 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:06:36.833 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:06:36.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:06:36.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:06:36.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:06:37.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:06:37.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:06:37.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:06:37.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:06:37.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:06:37.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:06:37.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:06:37.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:06:37.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:06:37.160 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:06:08
2026-05-30T02:06:37.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73459, datetime.datetime(2026, 5, 30, 2, 6, 8), datetime.datetime(2026, 5, 30, 2, 6, 8), 'salt', 10.52, 54.42, None, 17.75, 349.14, 8.8, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:06:37.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:06:37.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:06:37.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:06:08, diff=29.166488s, valid=True
2026-05-30T02:06:37.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:06:37.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:06:37.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:06:12, diff=25.169356s, valid=True
2026-05-30T02:06:37.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:06:37.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:06:37.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:06:05, diff=32.176121s, valid=True
2026-05-30T02:06:37.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:06:37.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:06:37.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:06:37.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:06:37.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:06:37.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:06:37.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:06:12, diff=25.179193s, valid=True
2026-05-30T02:06:37.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:06:37.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:06:37.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:06:37.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032239.17988s, valid=True
2026-05-30T02:06:37.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:06:37.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:06:37.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:06:37.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:06:37.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:06:37.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:06:37.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:06:37.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:06:37.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:06:37.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:06:37.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:06:37.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:06:37.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:06:37.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:06:37.716 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:06:38.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:06:38.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:06:38.165 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:06:38.166 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:06:38.413 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:06:38.413 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:07:08.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:07:08.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:07:08.444 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:07:08.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:07:08.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:07:08.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:07:08.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-05-30T02:07:08.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:07:08.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-05-30T02:07:08.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:07:08.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:07:08.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:07:08.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-05-30T02:07:11.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-05-30T02:07:11.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:07:11.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:07:11.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:07:11.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:07:11.972 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:07:11.972 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:07:11.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:07:11.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:07:11.972 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:07:11.973 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:07:11.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:07:12.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:07:12.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:07:12.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:07:12.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:07:12.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:07:12.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:07:12.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:07:12.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:07:12.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:07:12.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:07:12.224 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:07:12.282 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:07:09
2026-05-30T02:07:12.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73461, datetime.datetime(2026, 5, 30, 2, 7, 9), datetime.datetime(2026, 5, 30, 2, 7, 8), 'salt', 10.42, 54.75, None, 17.86, 353.53, 8.71, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:07:12.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:07:12.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:07:12.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:07:08, diff=4.288936s, valid=True
2026-05-30T02:07:12.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:07:12.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:07:12.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:07:12, diff=0.291811s, valid=True
2026-05-30T02:07:12.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:07:12.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:07:12.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:07:08, diff=4.298665s, valid=True
2026-05-30T02:07:12.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:07:12.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:07:12.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:07:12.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:07:12.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:07:12.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:07:12.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:07:12, diff=0.301696s, valid=True
2026-05-30T02:07:12.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:07:12.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:07:12.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:07:12.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032274.302362s, valid=True
2026-05-30T02:07:12.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:07:12.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:07:12.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:07:12.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:07:12.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:07:12.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:07:12.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:07:12.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:07:12.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:07:12.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:07:12.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:07:12.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:07:12.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:07:12.689 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:07:12.901 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:07:13.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:07:13.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:07:13.348 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:07:13.348 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:07:13.606 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:07:13.607 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:07:43.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:07:43.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:07:43.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:07:44.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:07:44.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:07:44.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:07:44.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-05-30T02:07:44.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:07:44.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-05-30T02:07:44.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:07:44.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:07:44.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:07:44.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-05-30T02:07:46.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-05-30T02:07:46.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:07:46.821 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:07:46.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:07:46.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:07:46.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:07:46.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:07:46.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:07:46.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:07:46.842 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:07:46.842 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:07:46.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:07:46.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:07:46.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:07:47.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:07:47.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:07:47.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:07:47.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:07:47.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:07:47.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:07:47.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:07:47.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:07:47.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:07:47.163 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:07:39
2026-05-30T02:07:47.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73462, datetime.datetime(2026, 5, 30, 2, 7, 39), datetime.datetime(2026, 5, 30, 2, 7, 39), 'salt', 10.32, 54.55, None, 12.32, 336.08, 8.75, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:07:47.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:07:47.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:07:47.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:07:39, diff=8.169665s, valid=True
2026-05-30T02:07:47.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:07:47.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:07:47.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:08:12, diff=-24.827502s, valid=True
2026-05-30T02:07:47.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:07:47.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:07:47.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:07:32, diff=15.179205s, valid=True
2026-05-30T02:07:47.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:07:47.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:07:47.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:07:47.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:07:47.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:07:47.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:07:47.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:08:12, diff=-24.817744s, valid=True
2026-05-30T02:07:47.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:07:47.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:07:47.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:07:47.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032309.182921s, valid=True
2026-05-30T02:07:47.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:07:47.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:07:47.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:07:47.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:07:47.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:07:47.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:07:47.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:07:47.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:07:47.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:07:47.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:07:47.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:07:47.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:07:47.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:07:47.502 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:07:47.722 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:07:48.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:07:48.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:07:48.179 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:07:48.179 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:07:48.362 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:07:48.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:08:18.376 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:08:18.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:08:18.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:08:18.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:08:18.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:08:18.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:08:18.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-05-30T02:08:18.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:08:18.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-05-30T02:08:18.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:08:18.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:08:18.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:08:18.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-05-30T02:08:21.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-05-30T02:08:21.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:08:21.093 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:08:21.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:08:21.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:08:21.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:08:21.114 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:08:21.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:08:21.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:08:21.115 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:08:21.115 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:08:21.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:08:21.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:08:21.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:08:21.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:08:21.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:08:21.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:08:21.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:08:21.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:08:21.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:08:21.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:08:21.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:08:21.376 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:08:21.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:08:09
2026-05-30T02:08:21.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73463, datetime.datetime(2026, 5, 30, 2, 8, 9), datetime.datetime(2026, 5, 30, 2, 8, 9), 'salt', 10.49, 54.35, None, 18.03, 340.5, 8.82, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:08:21.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:08:21.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:08:21.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:08:09, diff=12.444668s, valid=True
2026-05-30T02:08:21.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:08:21.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:08:21.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:08:12, diff=9.447964s, valid=True
2026-05-30T02:08:21.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:08:21.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:08:21.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:08:02, diff=19.455926s, valid=True
2026-05-30T02:08:21.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:08:21.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:08:21.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:08:21.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:08:21.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:08:21.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:08:21.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:08:12, diff=9.459444s, valid=True
2026-05-30T02:08:21.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:08:21.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:08:21.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:08:21.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032343.460333s, valid=True
2026-05-30T02:08:21.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:08:21.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:08:21.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:08:21.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:08:21.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:08:21.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:08:21.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:08:21.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:08:21.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:08:21.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:08:21.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:08:21.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:08:21.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:08:21.854 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:08:22.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:08:22.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:08:22.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:08:22.525 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:08:22.525 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:08:22.738 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:08:22.738 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:08:52.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:08:52.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:08:52.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:08:53.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:08:53.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:08:53.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:08: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-05-30T02:08:53.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:08:53.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-05-30T02:08:53.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:08:53.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:08:53.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:08: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-05-30T02:10:00.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-05-30T02:10:00.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:10:00.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:10:00.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:10:00.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:10:00.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:10:00.659 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:10:00.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:10:00.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:10:00.659 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:10:00.659 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:10:00.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:10:00.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:10:00.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:10:00.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:10:00.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:10:00.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:10:00.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:10:00.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:10:00.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:10:00.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:10:00.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:10:00.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:10:00.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:09:40
2026-05-30T02:10:00.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73466, datetime.datetime(2026, 5, 30, 2, 9, 40), datetime.datetime(2026, 5, 30, 2, 9, 39), 'salt', 10.45, 54.15, None, 17.04, 344.53, 8.86, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:10:00.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:10:00.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:10:00.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:09:39, diff=21.992383s, valid=True
2026-05-30T02:10:00.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:10:00.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:10:00.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:10:12, diff=-11.004827s, valid=True
2026-05-30T02:10:00.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:10:00.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:10:01.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:09:35, diff=26.001942s, valid=True
2026-05-30T02:10:01.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:10:01.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:10:01.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:10:01.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:10:01.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:10:01.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:10:01.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:10:12, diff=-10.99505s, valid=True
2026-05-30T02:10:01.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:10:01.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:10:01.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:10:01.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032443.005602s, valid=True
2026-05-30T02:10:01.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:10:01.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:10:01.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:10:01.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:10:01.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:10:01.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:10:01.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:10:01.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:10:01.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:10:01.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:10:01.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:10:01.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:10:01.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:10:01.322 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:10:01.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:10:01.922 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:10:02.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:10:02.021 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:10:02.021 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:10:02.206 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:10:02.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:10:32.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:10:32.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:10:32.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:10:32.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:10:32.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:10:32.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:10:32.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-05-30T02:10:32.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:10:32.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-05-30T02:10:32.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:10:32.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:10:32.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:10:32.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-05-30T02:10:35.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-05-30T02:10:35.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:10:35.353 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:10:35.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:10:35.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:10:35.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:10:35.373 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:10:35.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:10:35.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:10:35.373 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:10:35.373 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:10:35.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:10:35.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:10:35.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:10:35.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:10:35.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:10:35.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:10:35.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:10:35.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:10:35.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:10:35.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:10:35.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:10:35.625 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:10:35.685 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:10:10
2026-05-30T02:10:35.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73467, datetime.datetime(2026, 5, 30, 2, 10, 10), datetime.datetime(2026, 5, 30, 2, 10, 10), 'salt', 10.49, 54.12, None, 15.03, 333.64, 8.88, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:10:35.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:10:35.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:10:35.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:10:10, diff=25.691632s, valid=True
2026-05-30T02:10:35.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:10:35.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:10:35.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:10:12, diff=23.694461s, valid=True
2026-05-30T02:10:35.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:10:35.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:10:35.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:10:07, diff=28.701109s, valid=True
2026-05-30T02:10:35.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:10:35.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:10:35.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:10:35.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:10:35.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:10:35.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:10:35.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:10:12, diff=23.704115s, valid=True
2026-05-30T02:10:35.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:10:35.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:10:35.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:10:35.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032477.704774s, valid=True
2026-05-30T02:10:35.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:10:35.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:10:35.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:10:35.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:10:35.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:10:35.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:10:35.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:10:35.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:10:35.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:10:35.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:10:35.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:10:35.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:10:36.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:10:36.087 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:10:36.326 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:10:36.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:10:36.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:10:36.772 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:10:36.772 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:10:37.028 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:10:37.028 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:11:07.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:11:07.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:11:07.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:11:07.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:11:07.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:11:07.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:11:07.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-05-30T02:11:07.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:11:07.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-05-30T02:11:07.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:11:07.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:11:07.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:11:07.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T02:11:41.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-05-30T02:11:41.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:11:41.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:11:41.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:11:41.514 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:11:41.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:11:41.526 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:11:41.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:11:41.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:11:41.526 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:11:41.526 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:11:41.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:11:41.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:11:41.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:11:41.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:11:41.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:11:41.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:11:41.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:11:41.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:11:41.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:11:41.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:11:41.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:11:41.783 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:11:41.843 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:11:41
2026-05-30T02:11:41.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73470, datetime.datetime(2026, 5, 30, 2, 11, 41), datetime.datetime(2026, 5, 30, 2, 11, 40), 'salt', 10.59, 53.35, None, 19.58, 337.84, 9.08, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:11:41.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:11:41.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:11:41.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:11:40, diff=1.84951s, valid=True
2026-05-30T02:11:41.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:11:41.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:11:41.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:12:12, diff=-30.147664s, valid=True
2026-05-30T02:11:41.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:11:41.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:11:41.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:11:34, diff=7.859015s, valid=True
2026-05-30T02:11:41.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:11:41.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:11:41.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:11:41.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:11:41.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:11:41.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:11:41.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:12:12, diff=-30.137963s, valid=True
2026-05-30T02:11:41.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:11:41.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:11:41.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:11:41.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032543.862702s, valid=True
2026-05-30T02:11:41.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:11:41.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:11:41.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:11:41.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:11:41.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:11:41.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:11:41.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:11:41.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:11:41.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:11:41.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:11:42.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:11:42.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:11:42.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:11:42.183 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:11:42.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:11:42.744 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:11:42.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:11:42.846 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:11:42.846 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:11:43.132 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:11:43.132 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:12:13.133 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:12:13.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:12:13.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:12:13.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:12:13.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:12:13.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:12:13.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T02:12:13.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:12:13.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-05-30T02:12:13.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:12:13.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:12:13.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:12:13.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-05-30T02:12:45.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-05-30T02:12:45.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:12:45.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:12:45.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:12:45.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:12:45.455 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:12:45.455 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:12:45.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:12:45.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:12:45.456 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:12:45.456 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:12:45.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:12:45.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:12:45.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:12:45.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:12:45.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:12:45.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:12:45.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:12:45.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:12:45.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:12:45.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:12:45.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:12:45.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:12:45.861 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:12:41
2026-05-30T02:12:45.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73472, datetime.datetime(2026, 5, 30, 2, 12, 41), datetime.datetime(2026, 5, 30, 2, 12, 41), 'salt', 10.69, 53.52, None, 18.03, 344.89, 9.05, 832.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:12:45.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:12:45.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:12:45.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:12:41, diff=4.867278s, valid=True
2026-05-30T02:12:45.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:12:45.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:12:45.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:13:12, diff=-26.12991s, valid=True
2026-05-30T02:12:45.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:12:45.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:12:45.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:12:34, diff=11.876697s, valid=True
2026-05-30T02:12:45.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:12:45.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:12:45.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:12:45.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:12:45.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:12:45.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:12:45.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:13:12, diff=-26.120313s, valid=True
2026-05-30T02:12:45.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:12:45.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:12:45.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:12:45.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032607.880361s, valid=True
2026-05-30T02:12:45.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:12:45.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:12:45.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:12:45.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:12:45.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:12:45.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:12:45.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:12:45.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:12:45.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:12:46.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:12:46.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:12:46.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:12:46.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:12:46.199 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:12:46.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:12:46.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:12:46.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:12:46.872 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:12:46.872 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:12:47.063 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:12:47.063 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:13:17.093 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:13:17.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:13:17.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:13:17.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:13:17.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:13:17.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:13:17.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-05-30T02:13:17.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:13:17.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-05-30T02:13:17.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:13:17.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:13:17.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:13:17.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T02:13:20.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-05-30T02:13:20.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:13:20.042 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:13:20.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:13:20.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:13:20.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:13:20.064 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:13:20.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:13:20.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:13:20.064 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:13:20.064 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:13:20.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:13:20.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:13:20.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:13:20.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:13:20.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:13:20.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:13:20.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:13:20.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:13:20.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:13:20.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:13:20.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:13:20.351 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:13:20.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:13:11
2026-05-30T02:13:20.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73473, datetime.datetime(2026, 5, 30, 2, 13, 11), datetime.datetime(2026, 5, 30, 2, 13, 11), 'salt', 10.79, 53.25, None, 13.59, 5.85, 9.12, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:13:20.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:13:20.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:13:20.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:13:11, diff=9.424887s, valid=True
2026-05-30T02:13:20.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:13:20.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:13:20.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:13:12, diff=8.428061s, valid=True
2026-05-30T02:13:20.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:13:20.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:13:20.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:13:05, diff=15.435591s, valid=True
2026-05-30T02:13:20.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:13:20.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:13:20.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:13:20.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:13:20.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:13:20.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:13:20.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:13:12, diff=8.438996s, valid=True
2026-05-30T02:13:20.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:13:20.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:13:20.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:13:20.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032642.439751s, valid=True
2026-05-30T02:13:20.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:13:20.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:13:20.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:13:20.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:13:20.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:13:20.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:13:20.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:13:20.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:13:20.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:13:20.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:13:20.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:13:20.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:13:20.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:13:20.759 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:13:20.988 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:13:21.332 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:13:21.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:13:21.486 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:13:21.486 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:13:21.696 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:13:21.696 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:13:51.719 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:13:51.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:13:51.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:13:51.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:13:51.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:13:52.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:13:52.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T02:13:52.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:13:52.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-05-30T02:13:52.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:13:52.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:13:52.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:13:52.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-05-30T02:13:55.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-05-30T02:13:55.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:13:55.094 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:13:55.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:13:55.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:13:55.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:13:55.120 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:13:55.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:13:55.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:13:55.121 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:13:55.121 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:13:55.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:13:55.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:13:55.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:13:55.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:13:55.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:13:55.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:13:55.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:13:55.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:13:55.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:13:55.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:13:55.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:13:55.452 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:13:55.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:13:42
2026-05-30T02:13:55.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73474, datetime.datetime(2026, 5, 30, 2, 13, 42), datetime.datetime(2026, 5, 30, 2, 13, 41), 'salt', 10.79, 52.99, None, 16.51, 340.22, 9.19, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:13:55.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:13:55.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:13:55.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:13:41, diff=14.528337s, valid=True
2026-05-30T02:13:55.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:13:55.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:13:55.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:14:12, diff=-16.468131s, valid=True
2026-05-30T02:13:55.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:13:55.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:13:55.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:13:36, diff=19.548983s, valid=True
2026-05-30T02:13:55.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:13:55.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:13:55.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:13:55.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:13:55.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:13:55.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:13:55.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:14:12, diff=-16.447168s, valid=True
2026-05-30T02:13:55.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:13:55.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:13:55.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:13:55.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032677.553687s, valid=True
2026-05-30T02:13:55.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:13:55.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:13:55.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:13:55.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:13:55.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:13:55.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:13:55.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:13:55.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:13:55.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:13:55.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:13:55.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:13:55.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:13:55.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:13:55.873 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:13:56.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:13:56.432 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:13:56.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:13:56.531 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:13:56.531 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:13:56.792 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:13:56.792 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:14:26.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:14:26.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:14:26.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:14:27.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:14:27.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:14:27.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:14:27.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-05-30T02:14:27.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:14:27.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T02:14:27.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:14:27.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:14:27.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:14:27.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-05-30T02:15:17.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-05-30T02:15:17.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:15:17.547 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:15:17.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:15:17.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:15:17.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:15:17.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:15:17.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:15:17.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:15:17.572 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:15:17.572 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:15:17.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:15:17.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:15:17.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:15:17.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:15:17.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:15:17.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:15:17.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:15:17.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:15:17.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:15:17.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:15:17.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:15:17.904 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:15:17.965 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:15:12
2026-05-30T02:15:17.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73477, datetime.datetime(2026, 5, 30, 2, 15, 12), datetime.datetime(2026, 5, 30, 2, 15, 12), 'salt', 10.85, 52.86, None, 14.68, 332.84, 9.23, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:15:17.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:15:17.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:15:17.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:15:12, diff=5.97258s, valid=True
2026-05-30T02:15:17.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:15:17.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:15:17.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:15:12, diff=5.975987s, valid=True
2026-05-30T02:15:17.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:15:17.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:15:17.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:15:11, diff=6.984097s, valid=True
2026-05-30T02:15:17.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:15:17.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:15:17.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:15:17.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:15:17.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:15:17.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:15:17.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:15:12, diff=5.987779s, valid=True
2026-05-30T02:15:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:15:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:15:17.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:15:17.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032759.988591s, valid=True
2026-05-30T02:15:17.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:15:17.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:15:17.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:15:17.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:15:17.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:15:18.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:15:18.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:15:18.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:15:18.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:15:18.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:15:18.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:15:18.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:15:18.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:15:18.313 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:15:18.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:15:18.938 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:15:19.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:15:19.042 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:15:19.042 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:15:19.241 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:15:19.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:15:49.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:15:49.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:15:49.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:15:49.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:15:49.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:15:49.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:15:49.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-05-30T02:15:49.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:15:49.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-05-30T02:15:49.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:15:49.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:15:49.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:15:49.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-05-30T02:15:52.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-05-30T02:15:52.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:15:52.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:15:52.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:15:52.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:15:52.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:15:52.254 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:15:52.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:15:52.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:15:52.255 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:15:52.255 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:15:52.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:15:52.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:15:52.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:15:52.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:15:52.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:15:52.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:15:52.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:15:52.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:15:52.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:15:52.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:15:52.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:15:52.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:15:52.646 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:15:43
2026-05-30T02:15:52.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73478, datetime.datetime(2026, 5, 30, 2, 15, 43), datetime.datetime(2026, 5, 30, 2, 15, 42), 'salt', 10.85, 52.86, None, 18.98, 345.1, 9.23, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:15:52.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:15:52.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:15:52.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:15:42, diff=10.654405s, valid=True
2026-05-30T02:15:52.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:15:52.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:15:52.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:16:12, diff=-19.342108s, valid=True
2026-05-30T02:15:52.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:15:52.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:15:52.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:15:42, diff=10.666027s, valid=True
2026-05-30T02:15:52.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:15:52.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:15:52.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:15:52.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:15:52.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:15:52.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:15:52.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:16:12, diff=-19.330264s, valid=True
2026-05-30T02:15:52.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:15:52.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:15:52.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:15:52.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032794.67054s, valid=True
2026-05-30T02:15:52.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:15:52.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:15:52.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:15:52.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:15:52.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:15:52.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:15:52.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:15:52.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:15:52.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:15:52.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:15:52.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:15:52.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:15:52.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:15:52.991 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:15:53.203 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:15:53.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:15:53.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:15:53.649 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:15:53.649 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:15:53.876 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:15:53.876 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:16:23.879 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:16:23.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:16:23.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:16:24.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:16:24.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:16:24.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:16:24.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-05-30T02:16:24.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:16:24.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-05-30T02:16:24.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:16:24.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:16:24.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:16:24.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-05-30T02:16:28.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-05-30T02:16:28.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:16:28.587 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:16:28.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:16:28.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:16:28.609 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:16:28.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:16:28.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:16:28.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:16:28.611 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:16:28.611 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:16:28.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:16:28.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:16:28.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:16:28.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:16:28.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:16:28.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:16:28.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:16:28.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:16:28.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:16:28.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:16:28.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:16:28.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:16:29.000 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:16:13
2026-05-30T02:16:29.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73479, datetime.datetime(2026, 5, 30, 2, 16, 13), datetime.datetime(2026, 5, 30, 2, 16, 13), 'salt', 10.82, 52.76, None, 16.16, 349.23, 9.26, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:16:29.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:16:29.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:16:29.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:16:13, diff=16.007448s, valid=True
2026-05-30T02:16:29.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:16:29.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:16:29.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:16:12, diff=17.010951s, valid=True
2026-05-30T02:16:29.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:16:29.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:16:29.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:16:06, diff=23.019321s, valid=True
2026-05-30T02:16:29.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:16:29.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:16:29.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:16:29.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:16:29.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:16:29.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:16:29.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:16:12, diff=17.023068s, valid=True
2026-05-30T02:16:29.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:16:29.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:16:29.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:16:29.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032831.023889s, valid=True
2026-05-30T02:16:29.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:16:29.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:16:29.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:16:29.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:16:29.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:16:29.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:16:29.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:16:29.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:16:29.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:16:29.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:16:29.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:16:29.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:16:29.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:16:29.421 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:16:29.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:16:30.007 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:16:30.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:16:30.116 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:16:30.116 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:16:30.375 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:16:30.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:17:00.400 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:17:00.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:17:00.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:17:00.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:17:00.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:17:00.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:17:00.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-05-30T02:17:00.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:17:00.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-05-30T02:17:00.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:17:00.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:17:00.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:17:00.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-05-30T02:17:04.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-05-30T02:17:04.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:17:04.604 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:17:04.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:17:04.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:17:04.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:17:04.628 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:17:04.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:17:04.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:17:04.629 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:17:04.629 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:17:04.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:17:04.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:17:04.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:17:04.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:17:04.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:17:04.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:17:04.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:17:04.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:17:04.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:17:04.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:17:04.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:17:04.964 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:17:05.026 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:16:43
2026-05-30T02:17:05.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73480, datetime.datetime(2026, 5, 30, 2, 16, 43), datetime.datetime(2026, 5, 30, 2, 16, 43), 'salt', 10.85, 52.79, None, 15.91, 355.31, 9.25, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:17:05.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:17:05.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:17:05.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:16:43, diff=22.032406s, valid=True
2026-05-30T02:17:05.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:17:05.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:17:05.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:17:12, diff=-6.964731s, valid=True
2026-05-30T02:17:05.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:17:05.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:17:05.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:16:36, diff=29.041993s, valid=True
2026-05-30T02:17:05.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:17:05.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:17:05.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:17:05.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:17:05.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:17:05.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:17:05.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:17:12, diff=-6.954937s, valid=True
2026-05-30T02:17:05.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:17:05.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:17:05.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:17:05.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032867.045737s, valid=True
2026-05-30T02:17:05.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:17:05.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:17:05.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:17:05.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:17:05.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:17:05.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:17:05.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:17:05.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:17:05.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:17:05.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:17:05.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:17:05.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:17:05.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:17:05.363 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:17:05.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:17:05.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:17:06.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:17:06.019 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:17:06.020 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:17:09.057 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:17:09.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:17:39.087 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:17:39.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:17:39.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:17:39.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:17:39.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:17:39.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:17:39.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-05-30T02:17:39.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:17:39.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-05-30T02:17:39.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:17:39.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:17:39.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:17:39.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-05-30T02:17:41.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-05-30T02:17:41.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:17:41.911 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:17:41.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:17:41.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:17:41.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:17:41.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:17:41.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:17:41.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:17:41.935 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:17:41.936 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:17:41.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:17:42.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:17:42.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:17:42.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:17:42.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:17:42.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:17:42.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:17:42.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:17:42.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:17:42.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:17:42.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:17:42.257 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:17:42.317 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:17:14
2026-05-30T02:17:42.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73481, datetime.datetime(2026, 5, 30, 2, 17, 14), datetime.datetime(2026, 5, 30, 2, 17, 13), 'salt', 10.89, 52.86, None, 15.49, 349.72, 9.24, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:17:42.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:17:42.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:17:42.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:17:13, diff=29.32463s, valid=True
2026-05-30T02:17:42.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:17:42.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:17:42.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:17:12, diff=30.328113s, valid=True
2026-05-30T02:17:42.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:17:42.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:17:42.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:17:06, diff=36.336309s, valid=True
2026-05-30T02:17:42.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:17:42.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:17:42.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:17:42.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:17:42.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:17:42.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:17:42.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:17:12, diff=30.340065s, valid=True
2026-05-30T02:17:42.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:17:42.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:17:42.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:17:42.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032904.340891s, valid=True
2026-05-30T02:17:42.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:17:42.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:17:42.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:17:42.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:17:42.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:17:42.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:17:42.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:17:42.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:17:42.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:17:42.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:17:42.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:17:42.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:17:42.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:17:42.726 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:17:42.937 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:17:43.280 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:17:43.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:17:43.382 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:17:43.382 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:17:43.665 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:17:43.665 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:18:13.696 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:18:13.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:18:13.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:18:13.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:18:13.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:18:14.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:18:14.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T02:18:14.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:18:14.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-05-30T02:18:14.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:18:14.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:18:14.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:18:14.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-05-30T02:18:21.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-05-30T02:18:21.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:18:21.363 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:18:21.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:18:21.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:18:21.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:18:21.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:18:21.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:18:21.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:18:21.389 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:18:21.389 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:18:21.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:18:21.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:18:21.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:18:21.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:18:21.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:18:21.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:18:21.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:18:21.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:18:21.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:18:21.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:18:21.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:18:21.707 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:18:21.768 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:18:15
2026-05-30T02:18:21.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73483, datetime.datetime(2026, 5, 30, 2, 18, 15), datetime.datetime(2026, 5, 30, 2, 18, 14), 'salt', 10.85, 52.76, None, 17.57, 335.9, 9.25, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:18:21.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:18:21.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:18:21.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:18:14, diff=7.77621s, valid=True
2026-05-30T02:18:21.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:18:21.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:18:21.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:18:12, diff=9.779733s, valid=True
2026-05-30T02:18:21.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:18:21.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:18:21.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:18:09, diff=12.787979s, valid=True
2026-05-30T02:18:21.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:18:21.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:18:21.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:18:21.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:18:21.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:18:21.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:18:21.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:18:12, diff=9.791712s, valid=True
2026-05-30T02:18:21.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:18:21.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:18:21.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:18:21.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032943.792535s, valid=True
2026-05-30T02:18:21.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:18:21.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:18:21.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:18:21.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:18:21.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:18:21.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:18:21.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:18:21.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:18:21.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:18:21.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:18:21.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:18:22.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:18:22.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:18:22.112 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:18:22.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:18:22.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:18:22.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:18:22.767 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:18:22.767 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:18:23.023 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:18:23.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:18:53.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:18:53.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:18:53.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:18:53.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:18:53.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:18:53.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:18:53.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-05-30T02:18:53.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:18:53.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-05-30T02:18:53.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:18:53.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:18:53.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:18:53.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-05-30T02:18:57.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-05-30T02:18:57.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:18:57.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:18:57.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:18:57.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:18:57.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:18:57.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:18:57.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:18:57.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:18:57.481 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:18:57.481 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:18:57.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:18:57.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:18:57.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:18:57.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:18:57.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:18:57.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:18:57.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:18:57.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:18:57.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:18:57.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:18:57.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:18:57.802 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:18:57.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:18:46
2026-05-30T02:18:57.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73484, datetime.datetime(2026, 5, 30, 2, 18, 46), datetime.datetime(2026, 5, 30, 2, 18, 45), 'salt', 10.92, 52.86, None, 19.83, 337.4, 9.24, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:18:57.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:18:57.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:18:57.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:18:45, diff=12.872047s, valid=True
2026-05-30T02:18:57.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:18:57.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:18:57.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:19:12, diff=-14.124447s, valid=True
2026-05-30T02:18:57.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:18:57.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:18:57.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:18:40, diff=17.883709s, valid=True
2026-05-30T02:18:57.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:18:57.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:18:57.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:18:57.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:18:57.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:18:57.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:18:57.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:19:12, diff=-14.112494s, valid=True
2026-05-30T02:18:57.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:18:57.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:18:57.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:18:57.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1032979.888347s, valid=True
2026-05-30T02:18:57.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:18:57.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:18:57.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:18:57.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:18:57.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:18:57.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:18:57.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:18:57.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:18:57.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:18:58.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:18:58.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:18:58.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:18:58.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:18:58.277 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:18:58.490 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:18:58.834 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:18:58.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:18:58.935 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:18:58.935 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:18:59.208 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:18:59.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:19:29.238 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:19:29.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:19:29.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:19:29.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:19:29.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:19:29.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:19:29.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T02:19:29.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:19:29.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-05-30T02:19:29.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:19:29.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:19:29.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:19:29.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-05-30T02:19:51.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-05-30T02:19:51.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:19:51.667 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:19:51.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:19:51.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:19:51.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:19:51.689 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:19:51.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:19:51.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:19:51.690 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:19:51.690 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:19:51.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:19:51.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:19:51.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:19:51.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:19:51.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:19:51.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:19:51.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:19:51.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:19:51.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:19:51.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:19:51.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:19:51.965 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:19:52.028 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:19:46
2026-05-30T02:19:52.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73486, datetime.datetime(2026, 5, 30, 2, 19, 46), datetime.datetime(2026, 5, 30, 2, 19, 46), 'salt', 10.89, 52.86, None, 19.62, 331.44, 9.24, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:19:52.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:19:52.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:19:52.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:19:46, diff=6.036199s, valid=True
2026-05-30T02:19:52.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:19:52.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:19:52.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:20:12, diff=-19.960502s, valid=True
2026-05-30T02:19:52.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:19:52.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:19:52.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:19:43, diff=9.047321s, valid=True
2026-05-30T02:19:52.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:19:52.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:19:52.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:19:52.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:19:52.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:19:52.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:19:52.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:20:12, diff=-19.949126s, valid=True
2026-05-30T02:19:52.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:19:52.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:19:52.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:19:52.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033034.051653s, valid=True
2026-05-30T02:19:52.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:19:52.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:19:52.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:19:52.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:19:52.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:19:52.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:19:52.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:19:52.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:19:52.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:19:52.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:19:52.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:19:52.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:19:52.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:19:52.372 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:19:52.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:19:52.942 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:19:53.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:19:53.044 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:19:53.044 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:19:53.336 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:19:53.337 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:20:23.364 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:20:23.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:20:23.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:20:23.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:20:23.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:20:23.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:20:23.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T02:20:23.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:20:23.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-05-30T02:20:23.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:20:23.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:20:23.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:20:23.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-05-30T02:20:26.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-05-30T02:20:26.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:20:26.382 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:20:26.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:20:26.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:20:26.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:20:26.404 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:20:26.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:20:26.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:20:26.405 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:20:26.405 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:20:26.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:20:26.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:20:26.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:20:26.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:20:26.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:20:26.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:20:26.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:20:26.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:20:26.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:20:26.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:20:26.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:20:26.731 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:20:26.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:20:16
2026-05-30T02:20:26.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73487, datetime.datetime(2026, 5, 30, 2, 20, 16), datetime.datetime(2026, 5, 30, 2, 20, 16), 'salt', 10.82, 53.05, None, 13.23, 351.93, 9.18, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:20:26.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:20:26.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:20:26.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:20:16, diff=10.812883s, valid=True
2026-05-30T02:20:26.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:20:26.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:20:26.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:20:12, diff=14.816318s, valid=True
2026-05-30T02:20:26.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:20:26.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:20:26.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:20:14, diff=12.824384s, valid=True
2026-05-30T02:20:26.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:20:26.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:20:26.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:20:26.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:20:26.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:20:26.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:20:26.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:20:12, diff=14.828081s, valid=True
2026-05-30T02:20:26.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:20:26.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:20:26.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:20:26.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033068.8289s, valid=True
2026-05-30T02:20:26.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:20:26.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:20:26.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:20:26.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:20:26.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:20:26.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:20:26.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:20:26.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:20:26.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:20:26.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:20:27.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:20:27.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:20:27.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:20:27.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:20:27.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:20:27.721 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:20:27.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:20:27.822 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:20:27.822 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:20:28.013 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:20:28.013 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:20:58.016 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:20:58.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:20:58.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:20:58.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:20:58.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:20:58.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:20:58.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-05-30T02:20:58.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:20:58.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-05-30T02:20:58.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:20:58.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:20:58.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:20:58.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-05-30T02:21:00.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-05-30T02:21:00.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:21:00.972 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:21:00.972 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:21:00.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:21:00.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:21:00.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:21:00.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:21:00.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:21:00.997 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:21:00.997 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:21:01.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:21:01.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:21:01.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:21:01.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:21:01.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:21:01.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:21:01.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:21:01.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:21:01.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:21:01.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:21:01.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:21:01.339 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:21:01.402 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:20:47
2026-05-30T02:21:01.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73488, datetime.datetime(2026, 5, 30, 2, 20, 47), datetime.datetime(2026, 5, 30, 2, 20, 46), 'salt', 10.85, 53.02, None, 14.64, 14.33, 9.18, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:21:01.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:21:01.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:21:01.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:20:46, diff=15.408981s, valid=True
2026-05-30T02:21:01.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:21:01.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:21:01.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:21:12, diff=-10.588142s, valid=True
2026-05-30T02:21:01.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:21:01.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:21:01.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:20:46, diff=15.418614s, valid=True
2026-05-30T02:21:01.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:21:01.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:21:01.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:21:01.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:21:01.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:21:01.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:21:01.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:21:12, diff=-10.578287s, valid=True
2026-05-30T02:21:01.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:21:01.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:21:01.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:21:01.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033103.422373s, valid=True
2026-05-30T02:21:01.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:21:01.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:21:01.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:21:01.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:21:01.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:21:01.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:21:01.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:21:01.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:21:01.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:21:01.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:21:01.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:21:01.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:21:01.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:21:01.741 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:21:01.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:21:02.361 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:21:02.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:21:02.461 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:21:02.461 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:21:02.653 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:21:02.653 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:21:32.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:21:32.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:21:32.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:21:32.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:21:33.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:21:33.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:21:33.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-05-30T02:21:33.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:21:33.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-05-30T02:21:33.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:21:33.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:21:33.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:21:33.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-05-30T02:21:35.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-05-30T02:21:35.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:21:35.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:21:35.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:21:35.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:21:35.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:21:35.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:21:35.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:21:35.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:21:35.705 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:21:35.705 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:21:35.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:21:35.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:21:35.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:21:35.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:21:35.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:21:35.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:21:35.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:21:36.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:21:36.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:21:36.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:21:36.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:21:36.023 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:21:36.089 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:21:17
2026-05-30T02:21:36.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73489, datetime.datetime(2026, 5, 30, 2, 21, 17), datetime.datetime(2026, 5, 30, 2, 21, 16), 'salt', 10.89, 52.92, None, 20.11, 349.63, 9.22, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:21:36.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:21:36.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:21:36.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:21:16, diff=20.096372s, valid=True
2026-05-30T02:21:36.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:21:36.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:21:36.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:21:12, diff=24.099829s, valid=True
2026-05-30T02:21:36.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:21:36.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:21:36.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:21:08, diff=28.108094s, valid=True
2026-05-30T02:21:36.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:21:36.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:21:36.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:21:36.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:21:36.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:21:36.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:21:36.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:21:12, diff=24.111844s, valid=True
2026-05-30T02:21:36.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:21:36.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:21:36.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:21:36.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033138.112686s, valid=True
2026-05-30T02:21:36.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:21:36.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:21:36.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:21:36.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:21:36.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:21:36.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:21:36.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:21:36.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:21:36.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:21:36.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:21:36.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:21:36.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:21:36.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:21:36.435 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:21:36.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:21:36.998 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:21:37.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:21:37.099 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:21:37.099 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:21:38.564 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:21:38.564 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:22:08.568 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:22:08.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:22:08.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:22:08.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:22:08.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:22:09.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:22:09.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-05-30T02:22:09.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:22:09.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-05-30T02:22:09.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:22:09.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:22:09.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:22:09.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-05-30T02:22:41.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-05-30T02:22:41.339 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:22:41.339 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:22:41.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:22:41.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:22:41.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:22:41.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:22:41.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:22:41.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:22:41.361 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:22:41.361 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:22:41.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:22:41.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:22:41.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:22:41.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:22:41.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:22:41.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:22:41.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:22:41.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:22:41.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:22:41.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:22:41.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:22:41.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:22:41.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:22:17
2026-05-30T02:22:41.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73491, datetime.datetime(2026, 5, 30, 2, 22, 17), datetime.datetime(2026, 5, 30, 2, 22, 17), 'salt', 10.82, 53.05, None, 15.1, 351.91, 9.18, 832.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:22:41.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:22:41.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:22:41.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:22:17, diff=24.702894s, valid=True
2026-05-30T02:22:41.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:22:41.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:22:41.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:22:12, diff=29.706203s, valid=True
2026-05-30T02:22:41.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:22:41.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:22:41.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:22:10, diff=31.713864s, valid=True
2026-05-30T02:22:41.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:22:41.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:22:41.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:22:41.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:22:41.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:22:41.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:22:41.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:22:12, diff=29.717386s, valid=True
2026-05-30T02:22:41.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:22:41.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:22:41.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:22:41.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033203.718156s, valid=True
2026-05-30T02:22:41.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:22:41.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:22:41.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:22:41.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:22:41.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:22:41.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:22:41.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:22:41.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:22:41.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:22:41.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:22:41.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:22:41.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:22:41.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:22:42.037 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:22:42.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:22:42.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:22:42.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:22:42.765 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:22:42.765 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:22:43.044 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:22:43.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:23:13.065 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:23:13.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:23:13.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:23:13.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:23:13.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:23:13.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:23:13.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T02:23:13.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:23:13.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-05-30T02:23:13.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:23:13.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:23:13.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:23:13.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T02:23:15.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-05-30T02:23:15.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:23:15.938 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:23:15.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:23:15.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:23:15.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:23:15.960 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:23:15.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:23:15.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:23:15.961 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:23:15.962 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:23:15.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:23:16.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:23:16.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:23:16.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:23:16.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:23:16.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:23:16.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:23:16.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:23:16.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:23:16.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:23:16.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:23:16.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:23:16.348 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:22:48
2026-05-30T02:23:16.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73492, datetime.datetime(2026, 5, 30, 2, 22, 48), datetime.datetime(2026, 5, 30, 2, 22, 47), 'salt', 10.85, 52.89, None, 17.43, 350.99, 9.22, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:23:16.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:23:16.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:23:16.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:22:47, diff=29.356394s, valid=True
2026-05-30T02:23:16.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:23:16.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:23:16.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:23:12, diff=4.359897s, valid=True
2026-05-30T02:23:16.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:23:16.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:23:16.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:22:41, diff=35.368192s, valid=True
2026-05-30T02:23:16.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:23:16.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:23:16.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:23:16.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:23:16.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:23:16.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:23:16.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:23:12, diff=4.371986s, valid=True
2026-05-30T02:23:16.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:23:16.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:23:16.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:23:16.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033238.372813s, valid=True
2026-05-30T02:23:16.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:23:16.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:23:16.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:23:16.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:23:16.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:23:16.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:23:16.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:23:16.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:23:16.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:23:16.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:23:16.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:23:16.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:23:16.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:23:16.694 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:23:16.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:23:17.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:23:17.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:23:17.353 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:23:17.353 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:23:17.558 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:23:17.558 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:23:47.589 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:23:47.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:23:47.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:23:47.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:23:47.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:23:48.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:23:48.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T02:23:48.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:23:48.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-05-30T02:23:48.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:23:48.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:23:48.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:23:48.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-05-30T02:24:08.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-05-30T02:24:08.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:24:08.219 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:24:08.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:24:08.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:24:08.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:24:08.240 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:24:08.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:24:08.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:24:08.242 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:24:08.242 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:24:08.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:24:08.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:24:08.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:24:08.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:24:08.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:24:08.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:24:08.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:24:08.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:24:08.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:24:08.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:24:08.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:24:08.561 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:24:08.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:23:48
2026-05-30T02:24:08.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73494, datetime.datetime(2026, 5, 30, 2, 23, 48), datetime.datetime(2026, 5, 30, 2, 23, 48), 'salt', 10.92, 52.76, None, 17.47, 341.22, 9.26, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:24:08.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:24:08.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:24:08.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:23:48, diff=20.634105s, valid=True
2026-05-30T02:24:08.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:24:08.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:24:08.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:24:12, diff=-3.362427s, valid=True
2026-05-30T02:24:08.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:24:08.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:24:08.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:23:44, diff=24.645923s, valid=True
2026-05-30T02:24:08.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:24:08.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:24:08.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:24:08.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:24:08.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:24:08.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:24:08.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:24:12, diff=-3.350396s, valid=True
2026-05-30T02:24:08.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:24:08.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:24:08.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:24:08.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033290.650418s, valid=True
2026-05-30T02:24:08.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:24:08.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:24:08.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:24:08.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:24:08.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:24:08.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:24:08.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:24:08.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:24:08.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:24:08.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:24:08.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:24:08.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:24:08.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:24:09.048 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:24:09.263 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:24:09.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:24:09.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:24:09.709 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:24:09.709 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:24:09.907 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:24:09.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:24:39.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:24:39.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:24:39.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:24:40.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:24:40.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:24:40.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:24:40.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-05-30T02:24:40.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:24:40.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T02:24:40.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:24:40.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:24:40.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:24:40.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-05-30T02:24:42.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-05-30T02:24:42.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:24:42.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:24:42.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:24:42.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:24:42.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:24:42.864 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:24:42.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:24:42.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:24:42.865 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:24:42.865 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:24:42.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:24:42.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:24:42.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:24:43.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:24:43.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:24:43.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:24:43.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:24:43.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:24:43.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:24:43.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:24:43.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:24:43.183 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:24:43.245 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:24:18
2026-05-30T02:24:43.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73495, datetime.datetime(2026, 5, 30, 2, 24, 18), datetime.datetime(2026, 5, 30, 2, 24, 18), 'salt', 10.95, 52.59, None, 16.02, 350.83, 9.31, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:24:43.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:24:43.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:24:43.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:24:18, diff=25.253064s, valid=True
2026-05-30T02:24:43.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:24:43.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:24:43.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:24:12, diff=31.25659s, valid=True
2026-05-30T02:24:43.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:24:43.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:24:43.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:24:15, diff=28.264799s, valid=True
2026-05-30T02:24:43.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:24:43.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:24:43.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:24:43.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:24:43.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:24:43.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:24:43.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:24:12, diff=31.268644s, valid=True
2026-05-30T02:24:43.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:24:43.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:24:43.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:24:43.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033325.269481s, valid=True
2026-05-30T02:24:43.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:24:43.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:24:43.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:24:43.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:24:43.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:24:43.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:24:43.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:24:43.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:24:43.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:24:43.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:24:43.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:24:43.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:24:43.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:24:43.591 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:24:43.803 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:24:44.147 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:24:44.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:24:44.246 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:24:44.247 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:24:44.452 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:24:44.453 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:25:14.483 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:25:14.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:25:14.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:25:14.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:25:14.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:25:14.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:25:14.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-05-30T02:25:14.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:25:14.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-05-30T02:25:15.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:25:15.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:25:15.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:25:15.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-05-30T02:25:17.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-05-30T02:25:17.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:25:17.725 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:25:17.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:25:17.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:25:17.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:25:17.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:25:17.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:25:17.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:25:17.749 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:25:17.750 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:25:17.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:25:17.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:25:17.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:25:17.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:25:17.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:25:18.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:25:18.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:25:18.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:25:18.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:25:18.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:25:18.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:25:18.089 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:25:18.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:24:49
2026-05-30T02:25:18.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73496, datetime.datetime(2026, 5, 30, 2, 24, 49), datetime.datetime(2026, 5, 30, 2, 24, 48), 'salt', 10.89, 52.66, None, 19.23, 340.78, 9.29, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:25:18.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:25:18.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:25:18.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:24:48, diff=30.160687s, valid=True
2026-05-30T02:25:18.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:25:18.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:25:18.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:25:12, diff=6.163658s, valid=True
2026-05-30T02:25:18.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:25:18.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:25:18.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:24:47, diff=31.170525s, valid=True
2026-05-30T02:25:18.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:25:18.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:25:18.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:25:18.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:25:18.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:25:18.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:25:18.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:25:12, diff=6.173634s, valid=True
2026-05-30T02:25:18.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:25:18.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:25:18.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:25:18.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033360.174294s, valid=True
2026-05-30T02:25:18.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:25:18.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:25:18.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:25:18.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:25:18.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:25:18.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:25:18.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:25:18.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:25:18.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:25:18.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:25:18.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:25:18.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:25:18.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:25:18.569 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:25:18.822 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:25:19.172 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:25:19.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:25:19.275 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:25:19.275 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:25:19.473 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:25:19.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:25:49.482 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:25:49.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:25:49.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:25:49.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:25:49.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:25:49.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:25:49.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-05-30T02:25:50.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:25:50.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-05-30T02:25:50.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:25:50.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:25:50.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:25:50.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-05-30T02:26:33.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T02:26:33.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:26:33.851 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:26:33.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:26:33.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:26:33.874 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:26:33.875 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:26:33.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:26:33.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:26:33.876 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:26:33.876 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:26:33.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:26:34.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:26:34.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:26:34.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:26:34.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:26:34.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:26:34.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:26:34.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:26:34.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:26:34.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:26:34.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:26:34.216 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:26:34.282 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:26:19
2026-05-30T02:26:34.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73499, datetime.datetime(2026, 5, 30, 2, 26, 19), datetime.datetime(2026, 5, 30, 2, 26, 19), 'salt', 10.82, 52.79, None, 18.91, 342.4, 9.25, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:26:34.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:26:34.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:26:34.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:26:19, diff=15.289725s, valid=True
2026-05-30T02:26:34.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:26:34.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:26:34.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:26:12, diff=22.293221s, valid=True
2026-05-30T02:26:34.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:26:34.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:26:34.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:26:12, diff=22.30127s, valid=True
2026-05-30T02:26:34.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:26:34.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:26:34.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:26:34.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:26:34.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:26:34.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:26:34.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:26:12, diff=22.305027s, valid=True
2026-05-30T02:26:34.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:26:34.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:26:34.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:26:34.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033436.305856s, valid=True
2026-05-30T02:26:34.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:26:34.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:26:34.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:26:34.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:26:34.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:26:34.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:26:34.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:26:34.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:26:34.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:26:34.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:26:34.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:26:34.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:26:34.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:26:34.628 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:26:34.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:26:35.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:26:35.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:26:35.279 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:26:35.279 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:26:35.539 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:26:35.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:27:05.569 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:27:05.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:27:05.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:27:06.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:27:06.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:27:06.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:27:06.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-05-30T02:27:06.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:27:06.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T02:27:06.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:27:06.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:27:06.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:27:06.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-05-30T02:27:08.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-05-30T02:27:08.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:27:08.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:27:08.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:27:08.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:27:08.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:27:08.883 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:27:08.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:27:08.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:27:08.884 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:27:08.885 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:27:08.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:27:09.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:27:09.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:27:09.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:27:09.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:27:09.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:27:09.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:27:09.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:27:09.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:27:09.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:27:09.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:27:09.204 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:27:09.266 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:26:50
2026-05-30T02:27:09.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73500, datetime.datetime(2026, 5, 30, 2, 26, 50), datetime.datetime(2026, 5, 30, 2, 26, 49), 'salt', 10.82, 52.99, None, 18.6, 0.9, 9.19, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:27:09.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:27:09.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:27:09.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:26:49, diff=20.274047s, valid=True
2026-05-30T02:27:09.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:27:09.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:27:09.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:27:12, diff=-2.722544s, valid=True
2026-05-30T02:27:09.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:27:09.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:27:09.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:26:42, diff=27.285644s, valid=True
2026-05-30T02:27:09.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:27:09.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:27:09.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:27:09.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:27:09.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:27:09.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:27:09.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:27:12, diff=-2.710702s, valid=True
2026-05-30T02:27:09.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:27:09.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:27:09.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:27:09.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033471.290085s, valid=True
2026-05-30T02:27:09.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:27:09.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:27:09.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:27:09.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:27:09.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:27:09.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:27:09.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:27:09.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:27:09.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:27:09.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:27:09.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:27:09.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:27:09.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:27:09.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:27:09.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:27:10.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:27:10.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:27:10.365 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:27:10.365 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:27:10.631 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:27:10.632 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:27:40.662 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:27:40.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:27:40.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:27:41.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:27:41.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:27:41.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:27:41.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-05-30T02:27:41.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:27:41.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-05-30T02:27:41.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:27:41.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:27:41.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:27:41.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T02:27:43.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-05-30T02:27:43.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:27:43.984 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:27:43.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:27:43.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:27:44.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:27:44.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:27:44.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:27:44.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:27:44.009 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:27:44.009 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:27:44.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:27:44.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:27:44.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:27:44.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:27:44.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:27:44.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:27:44.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:27:44.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:27:44.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:27:44.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:27:44.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:27:44.310 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:27:44.372 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:27:20
2026-05-30T02:27:44.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73501, datetime.datetime(2026, 5, 30, 2, 27, 20), datetime.datetime(2026, 5, 30, 2, 27, 20), 'salt', 10.82, 52.92, None, 17.54, 344.56, 9.21, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:27:44.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:27:44.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:27:44.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:27:20, diff=24.378451s, valid=True
2026-05-30T02:27:44.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:27:44.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:27:44.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:27:12, diff=32.38153s, valid=True
2026-05-30T02:27:44.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:27:44.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:27:44.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:27:13, diff=31.388458s, valid=True
2026-05-30T02:27:44.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:27:44.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:27:44.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:27:44.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:27:44.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:27:44.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:27:44.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:27:12, diff=32.391604s, valid=True
2026-05-30T02:27:44.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:27:44.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:27:44.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:27:44.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033506.392277s, valid=True
2026-05-30T02:27:44.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:27:44.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:27:44.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:27:44.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:27:44.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:27:44.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:27:44.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:27:44.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:27:44.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:27:44.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:27:44.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:27:44.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:27:44.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:27:44.812 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:27:45.024 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:27:45.368 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:27:45.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:27:45.468 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:27:45.468 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:27:45.718 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:27:45.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:28:15.748 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:28:15.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:28:15.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:28:16.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:28:16.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:28:16.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:28:16.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-05-30T02:28:16.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:28:16.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-05-30T02:28:16.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:28:16.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:28:16.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:28:16.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-05-30T02:28:59.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-05-30T02:28:59.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:28:59.726 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:28:59.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:28:59.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:28:59.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:28:59.751 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:28:59.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:28:59.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:28:59.752 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:28:59.753 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:28:59.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:28:59.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:28:59.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:28:59.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:28:59.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:28:59.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:28:59.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:29:00.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:29:00.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:29:00.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:29:00.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:29:00.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:29:00.117 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:28:51
2026-05-30T02:29:00.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73504, datetime.datetime(2026, 5, 30, 2, 28, 51), datetime.datetime(2026, 5, 30, 2, 28, 50), 'salt', 10.89, 52.29, None, 16.97, 342.16, 9.39, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:29:00.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:29:00.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:29:00.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:28:50, diff=10.124664s, valid=True
2026-05-30T02:29:00.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:29:00.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:29:00.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:29:12, diff=-11.87199s, valid=True
2026-05-30T02:29:00.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:29:00.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:29:00.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:28:48, diff=12.134951s, valid=True
2026-05-30T02:29:00.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:29:00.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:29:00.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:29:00.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:29:00.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:29:00.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:29:00.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:29:12, diff=-11.861956s, valid=True
2026-05-30T02:29:00.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:29:00.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:29:00.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:29:00.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033582.138747s, valid=True
2026-05-30T02:29:00.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:29:00.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:29:00.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:29:00.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:29:00.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:29:00.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:29:00.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:29:00.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:29:00.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:29:00.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:29:00.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:29:00.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:29:00.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:29:00.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:29:00.738 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:29:01.082 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:29:01.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:29:01.183 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:29:01.183 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:29:01.380 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:29:01.380 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:29:31.410 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:29:31.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:29:31.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:29:31.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:29:31.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:29:32.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:29:32.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-05-30T02:29:32.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:29:32.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-05-30T02:29:32.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:29:32.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:29:32.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:29:32.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-05-30T02:30:21.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-05-30T02:30:21.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:30:21.175 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:30:21.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:30:21.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:30:21.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:30:21.199 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:30:21.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:30:21.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:30:21.200 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:30:21.201 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:30:21.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:30:21.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:30:21.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:30:21.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:30:21.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:30:21.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:30:21.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:30:21.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:30:21.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:30:21.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:30:21.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:30:21.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:30:21.584 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:29:51
2026-05-30T02:30:21.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73506, datetime.datetime(2026, 5, 30, 2, 29, 51), datetime.datetime(2026, 5, 30, 2, 29, 51), 'salt', 11.02, 52.06, None, 18.03, 348.9, 9.46, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:30:21.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:30:21.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:30:21.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:29:51, diff=30.592718s, valid=True
2026-05-30T02:30:21.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:30:21.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:30:21.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:30:12, diff=9.596246s, valid=True
2026-05-30T02:30:21.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:30:21.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:30:21.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:29:50, diff=31.60467s, valid=True
2026-05-30T02:30:21.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:30:21.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:30:21.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:30:21.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:30:21.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:30:21.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:30:21.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:30:12, diff=9.608415s, valid=True
2026-05-30T02:30:21.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:30:21.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:30:21.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:30:21.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033663.609239s, valid=True
2026-05-30T02:30:21.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:30:21.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:30:21.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:30:21.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:30:21.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:30:21.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:30:21.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:30:21.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:30:21.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:30:21.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:30:21.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:30:21.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:30:21.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:30:21.931 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:30:22.143 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:30:22.485 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:30:22.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:30:22.586 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:30:22.586 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:30:22.785 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:30:22.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:30:52.796 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:30:52.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:30:52.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:30:53.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:30:53.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:30:53.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:30:53.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-05-30T02:30:53.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:30:53.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-05-30T02:30:53.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:30:53.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:30:53.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:30:53.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-05-30T02:30:56.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-05-30T02:30:56.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:30:56.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:30:56.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:30:56.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:30:56.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:30:56.443 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:30:56.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:30:56.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:30:56.444 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:30:56.444 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:30:56.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:30:56.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:30:56.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:30:56.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:30:56.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:30:56.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:30:56.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:30:56.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:30:56.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:30:56.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:30:56.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:30:56.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:30:56.853 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:30:52
2026-05-30T02:30:56.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73508, datetime.datetime(2026, 5, 30, 2, 30, 52), datetime.datetime(2026, 5, 30, 2, 30, 51), 'salt', 11.02, 51.79, None, 17.36, 355.36, 9.53, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:30:56.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:30:56.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:30:56.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:30:51, diff=5.859597s, valid=True
2026-05-30T02:30:56.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:30:56.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:30:56.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:31:12, diff=-15.137483s, valid=True
2026-05-30T02:30:56.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:30:56.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:30:56.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:30:44, diff=12.869462s, valid=True
2026-05-30T02:30:56.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:30:56.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:30:56.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:30:56.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:30:56.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:30:56.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:30:56.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:31:12, diff=-15.127362s, valid=True
2026-05-30T02:30:56.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:30:56.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:30:56.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:30:56.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033698.873329s, valid=True
2026-05-30T02:30:56.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:30:56.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:30:56.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:30:56.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:30:56.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:30:56.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:30:56.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:30:56.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:30:56.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:30:57.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:30:57.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:30:57.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:30:57.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:30:57.189 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:30:57.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:30:57.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:30:57.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:30:57.846 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:30:57.846 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:30:58.043 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:30:58.043 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:31:28.060 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:31:28.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:31:28.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:31:28.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:31:28.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:31:28.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:31:28.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-05-30T02:31:28.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:31:28.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-05-30T02:31:28.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:31:28.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:31:28.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:31:28.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-05-30T02:32:08.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-05-30T02:32:08.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:32:08.205 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:32:08.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:32:08.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:32:08.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:32:08.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:32:08.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:32:08.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:32:08.230 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:32:08.231 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:32:08.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:32:08.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:32:08.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:32:08.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:32:08.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:32:08.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:32:08.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:32:08.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:32:08.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:32:08.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:32:08.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:32:08.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:32:08.600 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:31:52
2026-05-30T02:32:08.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73510, datetime.datetime(2026, 5, 30, 2, 31, 52), datetime.datetime(2026, 5, 30, 2, 31, 52), 'salt', 11.02, 51.73, None, 18.74, 347.07, 9.55, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:32:08.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:32:08.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:32:08.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:31:52, diff=16.607289s, valid=True
2026-05-30T02:32:08.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:32:08.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:32:08.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:32:12, diff=-3.389568s, valid=True
2026-05-30T02:32:08.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:32:08.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:32:08.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:31:46, diff=22.617936s, valid=True
2026-05-30T02:32:08.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:32:08.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:32:08.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:32:08.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:32:08.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:32:08.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:32:08.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:32:12, diff=-3.378673s, valid=True
2026-05-30T02:32:08.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:32:08.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:32:08.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:32:08.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033770.622104s, valid=True
2026-05-30T02:32:08.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:32:08.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:32:08.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:32:08.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:32:08.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:32:08.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:32:08.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:32:08.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:32:08.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:32:08.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:32:08.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:32:08.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:32:08.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:32:08.942 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:32:09.162 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:32:09.511 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:32:09.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:32:09.666 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:32:09.666 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:32:09.865 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:32:09.865 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:32:39.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:32:39.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:32:39.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:32:40.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:32:40.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:32:40.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:32:40.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-05-30T02:32:40.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:32:40.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-05-30T02:32:40.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:32:40.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:32:40.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:32:40.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-05-30T02:32:42.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-05-30T02:32:42.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:32:42.827 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:32:42.827 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:32:42.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:32:42.848 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:32:42.848 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:32:42.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:32:42.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:32:42.849 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:32:42.849 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:32:42.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:32:42.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:32:42.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:32:43.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:32:43.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:32:43.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:32:43.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:32:43.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:32:43.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:32:43.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:32:43.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:32:43.136 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:32:43.197 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:32:22
2026-05-30T02:32:43.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73511, datetime.datetime(2026, 5, 30, 2, 32, 22), datetime.datetime(2026, 5, 30, 2, 32, 22), 'salt', 10.95, 51.66, None, 19.73, 330.71, 9.55, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:32:43.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:32:43.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:32:43.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:32:22, diff=21.204604s, valid=True
2026-05-30T02:32:43.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:32:43.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:32:43.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:32:12, diff=31.207853s, valid=True
2026-05-30T02:32:43.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:32:43.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:32:43.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:32:17, diff=26.215506s, valid=True
2026-05-30T02:32:43.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:32:43.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:32:43.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:32:43.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:32:43.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:32:43.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:32:43.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:32:12, diff=31.219013s, valid=True
2026-05-30T02:32:43.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:32:43.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:32:43.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:32:43.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033805.219785s, valid=True
2026-05-30T02:32:43.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:32:43.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:32:43.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:32:43.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:32:43.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:32:43.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:32:43.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:32:43.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:32:43.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:32:43.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:32:43.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:32:43.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:32:43.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:32:43.539 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:32:43.752 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:32:44.097 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:32:44.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:32:44.198 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:32:44.198 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:32:44.396 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:32:44.396 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:33:14.413 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:33:14.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:33:14.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:33:14.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:33:14.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:33:15.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:33:15.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-05-30T02:33:15.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:33:15.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-05-30T02:33:15.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:33:15.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:33:15.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:33:15.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-05-30T02:33:17.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-05-30T02:33:17.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:33:17.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:33:17.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:33:17.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:33:17.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:33:17.529 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:33:17.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:33:17.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:33:17.529 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:33:17.529 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:33:17.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:33:17.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:33:17.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:33:17.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:33:17.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:33:17.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:33:17.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:33:17.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:33:17.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:33:17.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:33:17.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:33:17.796 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:33:17.855 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:32:53
2026-05-30T02:33:17.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73512, datetime.datetime(2026, 5, 30, 2, 32, 53), datetime.datetime(2026, 5, 30, 2, 32, 52), 'salt', 11.02, 51.43, None, 20.25, 339.98, 9.63, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:33:17.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:33:17.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:33:17.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:32:52, diff=25.86205s, valid=True
2026-05-30T02:33:17.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:33:17.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:33:17.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:33:12, diff=5.865238s, valid=True
2026-05-30T02:33:17.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:33:17.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:33:17.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:32:49, diff=28.872697s, valid=True
2026-05-30T02:33:17.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:33:17.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:33:17.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:33:17.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:33:17.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:33:17.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:33:17.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:33:12, diff=5.876083s, valid=True
2026-05-30T02:33:17.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:33:17.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:33:17.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:33:17.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033839.876822s, valid=True
2026-05-30T02:33:17.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:33:17.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:33:17.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:33:17.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:33:17.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:33:17.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:33:17.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:33:17.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:33:17.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:33:18.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:33:18.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:33:18.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:33:18.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:33:18.197 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:33:18.409 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:33:18.822 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:33:18.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:33:18.922 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:33:18.923 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:33:19.231 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:33:19.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:33:49.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:33:49.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:33:49.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:33:49.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:33:49.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:33:49.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:33: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-05-30T02:33:49.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:33:49.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-05-30T02:33:49.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:33:49.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:33:49.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:33: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-05-30T02:33:52.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-05-30T02:33:52.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:33:52.358 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:33:52.358 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:33:52.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:33:52.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:33:52.381 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:33:52.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:33:52.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:33:52.382 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:33:52.383 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:33:52.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:33:52.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:33:52.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:33:52.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:33:52.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:33:52.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:33:52.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:33:52.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:33:52.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:33:52.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:33:52.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:33:52.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:33:52.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:33:23
2026-05-30T02:33:52.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73513, datetime.datetime(2026, 5, 30, 2, 33, 23), datetime.datetime(2026, 5, 30, 2, 33, 23), 'salt', 11.08, 51.5, None, 18.84, 328.81, 9.61, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:33:52.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:33:52.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:33:52.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:33:23, diff=29.770147s, valid=True
2026-05-30T02:33:52.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:33:52.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:33:52.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:33:12, diff=40.773639s, valid=True
2026-05-30T02:33:52.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:33:52.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:33:52.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:33:20, diff=32.781779s, valid=True
2026-05-30T02:33:52.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:33:52.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:33:52.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:33:52.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:33:52.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:33:52.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:33:52.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:33:12, diff=40.785518s, valid=True
2026-05-30T02:33:52.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:33:52.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:33:52.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:33:52.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033874.786357s, valid=True
2026-05-30T02:33:52.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:33:52.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:33:52.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:33:52.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:33:52.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:33:52.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:33:52.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:33:52.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:33:52.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:33:52.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:33:52.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:33:53.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:33:53.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:33:53.106 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:33:53.320 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:33:53.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:33:53.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:33:53.766 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:33:53.766 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:33:54.005 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:33:54.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:34:24.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:34:24.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:34:24.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:34:24.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:34:24.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:34:24.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:34:24.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-05-30T02:34:24.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:34:24.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-05-30T02:34:24.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:34:24.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:34:24.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:34:24.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-05-30T02:34:44.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-05-30T02:34:44.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:34:44.311 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:34:44.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:34:44.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:34:44.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:34:44.335 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:34:44.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:34:44.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:34:44.336 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:34:44.336 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:34:44.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:34:44.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:34:44.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:34:44.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:34:44.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:34:44.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:34:44.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:34:44.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:34:44.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:34:44.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:34:44.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:34:44.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:34:44.713 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:34:24
2026-05-30T02:34:44.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73515, datetime.datetime(2026, 5, 30, 2, 34, 24), datetime.datetime(2026, 5, 30, 2, 34, 23), 'salt', 11.08, 51.3, None, 16.97, 2.14, 9.66, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:34:44.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:34:44.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:34:44.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:34:23, diff=21.721313s, valid=True
2026-05-30T02:34:44.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:34:44.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:34:44.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:34:12, diff=32.72473s, valid=True
2026-05-30T02:34:44.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:34:44.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:34:44.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:34:23, diff=21.732837s, valid=True
2026-05-30T02:34:44.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:34:44.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:34:44.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:34:44.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:34:44.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:34:44.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:34:44.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:34:12, diff=32.736594s, valid=True
2026-05-30T02:34:44.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:34:44.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:34:44.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:34:44.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033926.737441s, valid=True
2026-05-30T02:34:44.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:34:44.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:34:44.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:34:44.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:34:44.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:34:44.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:34:44.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:34:44.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:34:44.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:34:44.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:34:44.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:34:44.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:34:45.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:34:45.127 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:34:45.340 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:34:45.690 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:34:45.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:34:45.791 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:34:45.791 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:34:45.987 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:34:45.987 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:35:15.994 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:35:15.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:35:15.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:35:16.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:35:16.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:35:16.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:35:16.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-05-30T02:35:16.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:35:16.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-05-30T02:35:16.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:35:16.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:35:16.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:35:16.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-05-30T02:35:19.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-05-30T02:35:19.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:35:19.406 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:35:19.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:35:19.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:35:19.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:35:19.429 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:35:19.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:35:19.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:35:19.430 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:35:19.430 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:35:19.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:35:19.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:35:19.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:35:19.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:35:19.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:35:19.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:35:19.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:35:19.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:35:19.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:35:19.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:35:19.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:35:19.746 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:35:19.808 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:34:54
2026-05-30T02:35:19.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73516, datetime.datetime(2026, 5, 30, 2, 34, 54), datetime.datetime(2026, 5, 30, 2, 34, 53), 'salt', 11.08, 51.33, None, 18.67, 335.52, 9.65, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:35:19.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:35:19.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:35:19.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:34:53, diff=26.815588s, valid=True
2026-05-30T02:35:19.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:35:19.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:35:19.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:35:12, diff=7.819115s, valid=True
2026-05-30T02:35:19.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:35:19.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:35:19.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:34:46, diff=33.827452s, valid=True
2026-05-30T02:35:19.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:35:19.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:35:19.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:35:19.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:35:19.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:35:19.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:35:19.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:35:12, diff=7.830613s, valid=True
2026-05-30T02:35:19.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:35:19.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:35:19.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:35:19.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033961.831322s, valid=True
2026-05-30T02:35:19.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:35:19.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:35:19.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:35:19.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:35:19.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:35:19.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:35:19.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:35:19.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:35:19.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:35:19.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:35:20.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:35:20.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:35:20.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:35:20.168 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:35:20.381 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:35:20.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:35:20.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:35:20.825 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:35:20.825 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:35:21.095 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:35:21.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:35:51.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:35:51.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:35:51.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:35:51.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:35:51.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:35:51.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:35: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-05-30T02:35:51.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:35:51.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-05-30T02:35:51.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:35:51.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:35:51.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:35:51.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-05-30T02:35:56.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-05-30T02:35:56.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:35:56.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:35:56.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:35:56.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:35:56.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:35:56.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:35:56.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:35:56.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:35:56.989 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:35:56.989 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:35:56.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:35:57.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:35:57.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:35:57.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:35:57.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:35:57.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:35:57.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:35:57.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:35:57.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:35:57.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:35:57.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:35:57.315 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:35:57.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:35:54
2026-05-30T02:35:57.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73518, datetime.datetime(2026, 5, 30, 2, 35, 54), datetime.datetime(2026, 5, 30, 2, 35, 54), 'salt', 11.02, 51.2, None, 18.0, 346.95, 9.69, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:35:57.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:35:57.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:35:57.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:35:54, diff=3.38739s, valid=True
2026-05-30T02:35:57.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:35:57.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:35:57.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:36:12, diff=-14.609144s, valid=True
2026-05-30T02:35:57.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:35:57.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:35:57.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:35:47, diff=10.399047s, valid=True
2026-05-30T02:35:57.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:35:57.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:35:57.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:35:57.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:35:57.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:35:57.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:35:57.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:36:12, diff=-14.597214s, valid=True
2026-05-30T02:35:57.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:35:57.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:35:57.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:35:57.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1033999.403716s, valid=True
2026-05-30T02:35:57.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:35:57.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:35:57.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:35:57.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:35:57.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:35:57.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:35:57.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:35:57.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:35:57.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:35:57.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:35:57.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:35:57.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:35:57.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:35:57.800 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:35:58.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:35:58.359 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:35:58.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:35:58.461 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:35:58.461 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:35:58.725 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:35:58.725 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:36:28.755 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:36:28.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:36:28.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:36:29.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:36:29.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:36:29.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:36:29.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-05-30T02:36:29.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:36:29.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-05-30T02:36:29.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:36:29.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:36:29.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:36:29.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-05-30T02:36:31.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-05-30T02:36:31.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:36:31.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:36:31.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:36:31.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:36:31.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:36:31.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:36:31.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:36:31.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:36:31.765 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:36:31.765 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:36:31.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:36:31.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:36:31.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:36:31.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:36:31.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:36:31.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:36:31.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:36:32.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:36:32.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:36:32.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:36:32.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:36:32.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:36:32.109 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:36:25
2026-05-30T02:36:32.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73519, datetime.datetime(2026, 5, 30, 2, 36, 25), datetime.datetime(2026, 5, 30, 2, 36, 24), 'salt', 11.05, 51.3, None, 17.75, 331.06, 9.66, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:36:32.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:36:32.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:36:32.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:36:24, diff=8.116074s, valid=True
2026-05-30T02:36:32.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:36:32.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:36:32.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:36:12, diff=20.119337s, valid=True
2026-05-30T02:36:32.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:36:32.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:36:32.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:36:18, diff=14.127206s, valid=True
2026-05-30T02:36:32.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:36:32.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:36:32.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:36:32.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:36:32.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:36:32.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:36:32.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:36:12, diff=20.130743s, valid=True
2026-05-30T02:36:32.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:36:32.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:36:32.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:36:32.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034034.131498s, valid=True
2026-05-30T02:36:32.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:36:32.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:36:32.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:36:32.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:36:32.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:36:32.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:36:32.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:36:32.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:36:32.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:36:32.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:36:32.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:36:32.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:36:32.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:36:32.454 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:36:32.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:36:33.006 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:36:33.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:36:33.109 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:36:33.109 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:36:33.311 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:36:33.311 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:37:03.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:37:03.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:37:03.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:37:03.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:37:03.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:37:04.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:37:04.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-05-30T02:37:04.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:37:04.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-05-30T02:37:04.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:37:04.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:37:04.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:37:04.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-05-30T02:37:07.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-05-30T02:37:07.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:37:07.144 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:37:07.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:37:07.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:37:07.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:37:07.164 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:37:07.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:37:07.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:37:07.164 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:37:07.164 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:37:07.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:37:07.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:37:07.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:37:07.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:37:07.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:37:07.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:37:07.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:37:07.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:37:07.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:37:07.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:37:07.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:37:07.431 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:37:07.506 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:36:55
2026-05-30T02:37:07.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73520, datetime.datetime(2026, 5, 30, 2, 36, 55), datetime.datetime(2026, 5, 30, 2, 36, 54), 'salt', 11.02, 51.23, None, 20.08, 337.56, 9.68, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:37:07.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:37:07.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:37:07.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:36:54, diff=13.51305s, valid=True
2026-05-30T02:37:07.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:37:07.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:37:07.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:37:12, diff=-4.483762s, valid=True
2026-05-30T02:37:07.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:37:07.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:37:07.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:36:49, diff=18.523726s, valid=True
2026-05-30T02:37:07.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:37:07.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:37:07.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:37:07.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:37:07.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:37:07.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:37:07.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:37:12, diff=-4.4729s, valid=True
2026-05-30T02:37:07.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:37:07.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:37:07.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:37:07.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034069.527851s, valid=True
2026-05-30T02:37:07.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:37:07.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:37:07.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:37:07.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:37:07.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:37:07.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:37:07.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:37:07.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:37:07.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:37:07.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:37:07.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:37:07.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:37:07.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:37:07.913 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:37:08.121 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:37:08.458 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:37:08.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:37:08.558 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:37:08.558 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:37:08.755 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:37:08.755 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:37:38.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:37:38.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:37:38.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:37:39.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:37:39.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:37:39.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:37:39.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-05-30T02:37:39.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:37:39.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-05-30T02:37:39.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:37:39.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:37:39.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:37:39.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-05-30T02:37:42.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-05-30T02:37:42.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:37:42.248 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:37:42.248 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:37:42.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:37:42.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:37:42.272 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:37:42.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:37:42.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:37:42.273 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:37:42.273 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:37:42.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:37:42.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:37:42.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:37:42.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:37:42.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:37:42.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:37:42.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:37:42.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:37:42.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:37:42.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:37:42.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:37:42.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:37:42.699 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:37:25
2026-05-30T02:37:42.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73521, datetime.datetime(2026, 5, 30, 2, 37, 25), datetime.datetime(2026, 5, 30, 2, 37, 25), 'salt', 11.05, 51.5, None, 17.64, 325.36, 9.61, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:37:42.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:37:42.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:37:42.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:37:25, diff=17.707101s, valid=True
2026-05-30T02:37:42.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:37:42.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:37:42.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:37:12, diff=30.710728s, valid=True
2026-05-30T02:37:42.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:37:42.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:37:42.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:37:21, diff=21.719104s, valid=True
2026-05-30T02:37:42.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:37:42.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:37:42.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:37:42.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:37:42.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:37:42.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:37:42.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:37:12, diff=30.722973s, valid=True
2026-05-30T02:37:42.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:37:42.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:37:42.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:37:42.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034104.723821s, valid=True
2026-05-30T02:37:42.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:37:42.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:37:42.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:37:42.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:37:42.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:37:42.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:37:42.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:37:42.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:37:42.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:37:42.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:37:42.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:37:42.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:37:43.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:37:43.045 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:37:43.248 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:37:43.582 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:37:43.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:37:43.681 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:37:43.681 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:37:43.881 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:37:43.881 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:38:13.912 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:38:13.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:38:13.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:38:14.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:38:14.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:38:14.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:38:14.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T02:38:14.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:38:14.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-05-30T02:38:14.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:38:14.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:38:14.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:38:14.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-05-30T02:38:17.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-05-30T02:38:17.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:38:17.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:38:17.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:38:17.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:38:17.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:38:17.350 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:38:17.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:38:17.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:38:17.351 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:38:17.352 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:38:17.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:38:17.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:38:17.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:38:17.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:38:17.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:38:17.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:38:17.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:38:17.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:38:17.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:38:17.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:38:17.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:38:17.737 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:38:17.802 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:37:55
2026-05-30T02:38:17.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73522, datetime.datetime(2026, 5, 30, 2, 37, 55), datetime.datetime(2026, 5, 30, 2, 37, 55), 'salt', 11.02, 51.33, None, 18.77, 0.92, 9.65, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:38:17.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:38:17.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:38:17.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:37:55, diff=22.809405s, valid=True
2026-05-30T02:38:17.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:38:17.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:38:17.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:38:12, diff=5.812421s, valid=True
2026-05-30T02:38:17.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:38:17.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:38:17.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:37:53, diff=24.819456s, valid=True
2026-05-30T02:38:17.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:38:17.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:38:17.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:38:17.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:38:17.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:38:17.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:38:17.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:38:12, diff=5.822698s, valid=True
2026-05-30T02:38:17.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:38:17.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:38:17.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:38:17.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034139.823394s, valid=True
2026-05-30T02:38:17.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:38:17.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:38:17.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:38:17.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:38:17.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:38:17.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:38:17.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:38:17.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:38:17.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:38:17.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:38:18.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:38:18.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:38:18.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:38:18.139 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:38:18.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:38:18.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:38:18.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:38:18.776 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:38:18.776 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:38:19.025 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:38:19.026 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:38:49.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:38:49.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:38:49.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:38:49.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:38:49.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:38:49.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:38:49.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-05-30T02:38:49.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:38:49.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-05-30T02:38:49.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:38:49.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:38:49.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:38:49.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-05-30T02:40:11.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-05-30T02:40:11.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:40:11.803 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:40:11.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:40:11.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:40:11.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:40:11.825 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:40:11.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:40:11.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:40:11.826 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:40:11.826 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:40:11.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:40:11.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:40:11.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:40:12.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:40:12.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:40:12.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:40:12.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:40:12.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:40:12.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:40:12.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:40:12.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:40:12.164 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:40:12.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:39:56
2026-05-30T02:40:12.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73526, datetime.datetime(2026, 5, 30, 2, 39, 56), datetime.datetime(2026, 5, 30, 2, 39, 56), 'salt', 11.18, 50.37, None, 20.5, 345.54, 9.92, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:40:12.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:40:12.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:40:12.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:39:56, diff=16.232197s, valid=True
2026-05-30T02:40:12.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:40:12.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:40:12.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:40:12, diff=0.235669s, valid=True
2026-05-30T02:40:12.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:40:12.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:40:12.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:39:49, diff=23.243702s, valid=True
2026-05-30T02:40:12.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:40:12.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:40:12.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:40:12.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:40:12.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:40:12.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:40:12.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:40:12, diff=0.247258s, valid=True
2026-05-30T02:40:12.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:40:12.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:40:12.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:40:12.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034254.248041s, valid=True
2026-05-30T02:40:12.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:40:12.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:40:12.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:40:12.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:40:12.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:40:12.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:40:12.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:40:12.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:40:12.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:40:12.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:40:12.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:40:12.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:40:12.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:40:12.592 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:40:12.812 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:40:13.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:40:13.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:40:13.257 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:40:13.257 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:40:13.441 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:40:13.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:40:43.463 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:40:43.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:40:43.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:40:44.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:40:44.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:40:44.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:40:44.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-05-30T02:40:44.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:40:44.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-05-30T02:40:44.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:40:44.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:40:44.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:40:44.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-05-30T02:40:47.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-05-30T02:40:47.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:40:47.914 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:40:47.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:40:47.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:40:47.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:40:47.940 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:40:47.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:40:47.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:40:47.941 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:40:47.941 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:40:47.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:40:48.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:40:48.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:40:48.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:40:48.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:40:48.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:40:48.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:40:48.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:40:48.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:40:48.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:40:48.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:40:48.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:40:48.316 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:40:27
2026-05-30T02:40:48.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73527, datetime.datetime(2026, 5, 30, 2, 40, 27), datetime.datetime(2026, 5, 30, 2, 40, 26), 'salt', 11.22, 50.57, None, 21.42, 344.16, 9.88, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:40:48.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:40:48.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:40:48.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:40:26, diff=22.324166s, valid=True
2026-05-30T02:40:48.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:40:48.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:40:48.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:40:12, diff=36.327656s, valid=True
2026-05-30T02:40:48.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:40:48.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:40:48.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:40:19, diff=29.335864s, valid=True
2026-05-30T02:40:48.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:40:48.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:40:48.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:40:48.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:40:48.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:40:48.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:40:48.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:40:12, diff=36.339586s, valid=True
2026-05-30T02:40:48.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:40:48.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:40:48.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:40:48.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034290.340419s, valid=True
2026-05-30T02:40:48.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:40:48.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:40:48.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:40:48.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:40:48.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:40:48.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:40:48.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:40:48.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:40:48.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:40:48.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:40:48.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:40:48.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:40:48.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:40:48.660 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:40:48.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:40:49.205 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:40:49.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:40:49.307 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:40:49.307 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:40:49.490 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:40:49.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:41:19.520 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:41:19.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:41:19.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:41:19.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:41:19.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:41:20.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:41: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-05-30T02:41:20.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:41:20.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-05-30T02:41:20.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:41:20.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:41:20.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:41:20.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-05-30T02:42:08.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-05-30T02:42:08.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:42:08.191 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:42:08.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:42:08.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:42:08.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:42:08.215 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:42:08.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:42:08.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:42:08.216 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:42:08.216 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:42:08.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:42:08.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:42:08.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:42:08.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:42:08.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:42:08.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:42:08.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:42:08.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:42:08.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:42:08.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:42:08.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:42:08.546 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:42:08.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:41:57
2026-05-30T02:42:08.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73530, datetime.datetime(2026, 5, 30, 2, 41, 57), datetime.datetime(2026, 5, 30, 2, 41, 57), 'salt', 11.05, 50.7, None, 17.33, 353.48, 9.82, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:42:08.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:42:08.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:42:08.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:41:57, diff=11.619023s, valid=True
2026-05-30T02:42:08.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:42:08.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:42:08.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:42:12, diff=-3.377443s, valid=True
2026-05-30T02:42:08.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:42:08.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:42:08.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:41:53, diff=15.630938s, valid=True
2026-05-30T02:42:08.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:42:08.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:42:08.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:42:08.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:42:08.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:42:08.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:42:08.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:42:12, diff=-3.365309s, valid=True
2026-05-30T02:42:08.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:42:08.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:42:08.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:42:08.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034370.635502s, valid=True
2026-05-30T02:42:08.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:42:08.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:42:08.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:42:08.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:42:08.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:42:08.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:42:08.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:42:08.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:42:08.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:42:08.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:42:08.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:42:08.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:42:08.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:42:08.956 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:42:09.159 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:42:09.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:42:09.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:42:09.648 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:42:09.648 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:42:09.937 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:42:09.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:42:39.967 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:42:39.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:42:39.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:42:40.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:42:40.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:42:40.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:42:40.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-05-30T02:42:40.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:42:40.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-05-30T02:42:40.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:42:40.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:42:40.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:42:40.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-05-30T02:42:43.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-05-30T02:42:43.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:42:43.013 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:42:43.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:42:43.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:42:43.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:42:43.038 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:42:43.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:42:43.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:42:43.039 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:42:43.039 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:42:43.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:42:43.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:42:43.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:42:43.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:42:43.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:42:43.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:42:43.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:42:43.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:42:43.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:42:43.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:42:43.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:42:43.372 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:42:43.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:42:28
2026-05-30T02:42:43.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73531, datetime.datetime(2026, 5, 30, 2, 42, 28), datetime.datetime(2026, 5, 30, 2, 42, 27), 'salt', 11.05, 50.9, None, 14.22, 2.12, 9.77, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:42:43.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:42:43.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:42:43.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:42:27, diff=16.443658s, valid=True
2026-05-30T02:42:43.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:42:43.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:42:43.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:42:12, diff=31.447162s, valid=True
2026-05-30T02:42:43.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:42:43.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:42:43.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:42:25, diff=18.455492s, valid=True
2026-05-30T02:42:43.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:42:43.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:42:43.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:42:43.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:42:43.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:42:43.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:42:43.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:42:12, diff=31.459252s, valid=True
2026-05-30T02:42:43.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:42:43.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:42:43.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:42:43.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034405.46007s, valid=True
2026-05-30T02:42:43.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:42:43.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:42:43.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:42:43.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:42:43.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:42:43.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:42:43.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:42:43.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:42:43.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:42:43.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:42:43.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:42:43.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:42:43.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:42:43.781 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:42:43.984 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:42:44.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:42:44.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:42:44.420 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:42:44.420 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:42:44.683 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:42:44.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:43:14.688 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:43:14.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:43:14.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:43:14.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:43:15.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:43:15.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:43:15.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-05-30T02:43:15.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:43:15.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T02:43:15.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:43:15.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:43:15.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:43:15.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-05-30T02:43:18.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-05-30T02:43:18.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:43:18.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:43:18.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:43:18.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:43:18.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:43:18.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:43:18.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:43:18.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:43:18.594 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:43:18.594 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:43:18.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:43:18.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:43:18.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:43:18.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:43:18.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:43:18.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:43:18.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:43:18.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:43:18.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:43:18.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:43:18.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:43:18.925 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:43:18.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:42:58
2026-05-30T02:43:18.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73532, datetime.datetime(2026, 5, 30, 2, 42, 58), datetime.datetime(2026, 5, 30, 2, 42, 58), 'salt', 11.02, 50.77, None, 21.21, 341.72, 9.81, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:43:18.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:43:18.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:43:18.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:42:58, diff=20.993919s, valid=True
2026-05-30T02:43:18.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:43:18.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:43:18.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:43:12, diff=6.997326s, valid=True
2026-05-30T02:43:18.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:43:18.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:43:19.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:42:56, diff=23.005274s, valid=True
2026-05-30T02:43:19.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:43:19.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:43:19.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:43:19.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:43:19.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:43:19.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:43:19.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:43:12, diff=7.008947s, valid=True
2026-05-30T02:43:19.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:43:19.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:43:19.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:43:19.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034441.009748s, valid=True
2026-05-30T02:43:19.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:43:19.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:43:19.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:43:19.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:43:19.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:43:19.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:43:19.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:43:19.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:43:19.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:43:19.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:43:19.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:43:19.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:43:19.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:43:19.331 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:43:19.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:43:19.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:43:20.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:43:20.048 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:43:20.048 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:43:20.290 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:43:20.290 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:43:50.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:43:50.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:43:50.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:43:50.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:43:50.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:43:51.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:43:51.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-05-30T02:43:51.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:43:51.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-05-30T02:43:51.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:43:51.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:43:51.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:43:51.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T02:44:40.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-05-30T02:44:40.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:44:40.024 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:44:40.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:44:40.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:44:40.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:44:40.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:44:40.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:44:40.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:44:40.046 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:44:40.046 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:44:40.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:44:40.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:44:40.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:44:40.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:44:40.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:44:40.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:44:40.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:44:40.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:44:40.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:44:40.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:44:40.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:44:40.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:44:40.381 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:44:29
2026-05-30T02:44:40.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73535, datetime.datetime(2026, 5, 30, 2, 44, 29), datetime.datetime(2026, 5, 30, 2, 44, 28), 'salt', 11.08, 50.93, None, 14.79, 8.08, 9.76, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:44:40.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:44:40.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:44:40.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:44:28, diff=12.387754s, valid=True
2026-05-30T02:44:40.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:44:40.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:44:40.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:44:12, diff=28.390572s, valid=True
2026-05-30T02:44:40.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:44:40.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:44:40.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:44:21, diff=19.397248s, valid=True
2026-05-30T02:44:40.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:44:40.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:44:40.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:44:40.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:44:40.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:44:40.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:44:40.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:44:12, diff=28.400243s, valid=True
2026-05-30T02:44:40.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:44:40.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:44:40.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:44:40.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034522.400919s, valid=True
2026-05-30T02:44:40.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:44:40.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:44:40.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:44:40.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:44:40.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:44:40.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:44:40.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:44:40.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:44:40.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:44:40.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:44:40.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:44:40.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:44:40.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:44:40.725 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:44:40.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:44:41.264 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:44:41.363 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:44:41.363 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:44:41.363 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:44:41.563 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:44:41.563 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:45:11.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:45:11.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:45:11.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:45:11.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:45:11.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:45:12.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:45:12.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-05-30T02:45:12.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:45:12.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-05-30T02:45:12.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:45:12.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:45:12.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:45:12.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-05-30T02:45:14.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-05-30T02:45:14.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:45:14.559 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:45:14.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:45:14.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:45:14.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:45:14.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:45:14.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:45:14.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:45:14.584 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:45:14.585 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:45:14.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:45:14.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:45:14.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:45:14.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:45:14.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:45:14.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:45:14.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:45:14.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:45:14.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:45:14.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:45:14.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:45:14.902 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:45:14.966 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:44:59
2026-05-30T02:45:14.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73536, datetime.datetime(2026, 5, 30, 2, 44, 59), datetime.datetime(2026, 5, 30, 2, 44, 59), 'salt', 10.98, 50.77, None, 20.04, 340.49, 9.8, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:45:14.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:45:14.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:45:14.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:44:59, diff=15.974018s, valid=True
2026-05-30T02:45:14.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:45:14.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:45:14.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:45:12, diff=2.977446s, valid=True
2026-05-30T02:45:14.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:45:14.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:45:14.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:44:52, diff=22.985478s, valid=True
2026-05-30T02:45:14.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:45:14.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:45:14.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:45:14.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:45:14.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:45:14.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:45:14.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:45:12, diff=2.989117s, valid=True
2026-05-30T02:45:14.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:45:14.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:45:14.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:45:14.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034556.98991s, valid=True
2026-05-30T02:45:14.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:45:14.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:45:14.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:45:14.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:45:14.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:45:15.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:45:15.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:45:15.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:45:15.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:45:15.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:45:15.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:45:15.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:45:15.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:45:15.378 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:45:15.582 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:45:15.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:45:16.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:45:16.018 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:45:16.018 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:45:17.123 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:45:17.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:45:47.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:45:47.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:45:47.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:45:47.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:45:47.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:45:47.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:45:47.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-05-30T02:45:47.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:45:47.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-05-30T02:45:47.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:45:47.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:45:47.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:45:47.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-05-30T02:45:50.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-05-30T02:45:50.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:45:50.093 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:45:50.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:45:50.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:45:50.112 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:45:50.113 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:45:50.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:45:50.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:45:50.113 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:45:50.113 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:45:50.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:45:50.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:45:50.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:45:50.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:45:50.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:45:50.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:45:50.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:45:50.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:45:50.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:45:50.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:45:50.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:45:50.374 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:45:50.434 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:45:29
2026-05-30T02:45:50.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73537, datetime.datetime(2026, 5, 30, 2, 45, 29), datetime.datetime(2026, 5, 30, 2, 45, 29), 'salt', 11.08, 50.47, None, 17.61, 341.29, 9.89, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:45:50.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:45:50.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:45:50.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:45:29, diff=21.441869s, valid=True
2026-05-30T02:45:50.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:45:50.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:45:50.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:45:12, diff=38.445054s, valid=True
2026-05-30T02:45:50.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:45:50.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:45:50.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:45:23, diff=27.452546s, valid=True
2026-05-30T02:45:50.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:45:50.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:45:50.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:45:50.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:45:50.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:45:50.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:45:50.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:45:12, diff=38.455941s, valid=True
2026-05-30T02:45:50.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:45:50.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:45:50.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:45:50.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034592.456689s, valid=True
2026-05-30T02:45:50.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:45:50.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:45:50.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:45:50.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:45:50.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:45:50.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:45:50.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:45:50.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:45:50.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:45:50.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:45:50.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:45:50.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:45:50.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:45:50.775 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:45:50.980 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:45:51.314 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:45:51.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:45:51.412 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:45:51.412 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:45:51.608 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:45:51.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:46:21.639 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:46:21.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:46:21.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:46:21.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:46:21.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:46:22.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:46:22.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T02:46:22.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:46:22.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-05-30T02:46:22.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:46:22.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:46:22.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:46:22.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-05-30T02:46:24.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T02:46:24.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:46:24.619 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:46:24.619 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:46:24.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:46:24.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:46:24.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:46:24.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:46:24.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:46:24.640 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:46:24.640 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:46:24.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:46:24.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:46:24.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:46:24.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:46:24.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:46:24.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:46:24.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:46:24.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:46:24.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:46:24.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:46:24.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:46:24.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:46:24.972 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:46:00
2026-05-30T02:46:24.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73538, datetime.datetime(2026, 5, 30, 2, 46), datetime.datetime(2026, 5, 30, 2, 45, 59), 'salt', 11.05, 50.4, None, 21.21, 343.0, 9.91, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:46:24.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:46:24.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:46:24.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:45:59, diff=25.979796s, valid=True
2026-05-30T02:46:24.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:46:24.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:46:24.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:46:12, diff=12.983065s, valid=True
2026-05-30T02:46:24.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:46:24.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:46:24.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:45:55, diff=29.990895s, valid=True
2026-05-30T02:46:24.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:46:24.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:46:24.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:46:24.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:46:24.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:46:24.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:46:24.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:46:12, diff=12.994601s, valid=True
2026-05-30T02:46:24.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:46:24.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:46:24.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:46:24.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034626.995411s, valid=True
2026-05-30T02:46:24.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:46:24.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:46:24.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:46:24.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:46:24.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:46:25.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:46:25.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:46:25.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:46:25.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:46:25.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:46:25.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:46:25.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:46:25.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:46:25.383 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:46:25.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:46:25.927 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:46:26.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:46:26.026 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:46:26.026 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:46:26.208 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:46:26.209 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:46:56.237 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:46:56.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:46:56.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:46:56.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:46:56.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:46:56.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:46:56.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-05-30T02:46:56.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:46:56.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-05-30T02:46:56.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:46:56.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:46:56.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:46:56.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-05-30T02:46:59.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-05-30T02:46:59.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:46:59.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:46:59.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:46:59.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:46:59.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:46:59.264 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:46:59.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:46:59.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:46:59.265 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:46:59.265 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:46:59.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:46:59.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:46:59.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:46:59.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:46:59.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:46:59.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:46:59.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:46:59.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:46:59.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:46:59.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:46:59.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:46:59.584 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:46:59.645 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:46:30
2026-05-30T02:46:59.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73539, datetime.datetime(2026, 5, 30, 2, 46, 30), datetime.datetime(2026, 5, 30, 2, 46, 29), 'salt', 11.08, 50.37, None, 18.21, 348.47, 9.92, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:46:59.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:46:59.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:46:59.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:46:29, diff=30.653216s, valid=True
2026-05-30T02:46:59.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:46:59.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:46:59.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:46:12, diff=47.656716s, valid=True
2026-05-30T02:46:59.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:46:59.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:46:59.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:46:26, diff=33.664988s, valid=True
2026-05-30T02:46:59.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:46:59.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:46:59.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:46:59.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:46:59.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:46:59.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:46:59.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:46:12, diff=47.668668s, valid=True
2026-05-30T02:46:59.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:46:59.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:46:59.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:46:59.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034661.669475s, valid=True
2026-05-30T02:46:59.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:46:59.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:46:59.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:46:59.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:46:59.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:46:59.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:46:59.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:46:59.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:46:59.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:46:59.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:46:59.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:46:59.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:46:59.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:47:00.002 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:47:00.223 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:47:00.558 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:47:00.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:47:00.656 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:47:00.656 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:47:00.923 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:47:00.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:47:30.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:47:30.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:47:30.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:47:31.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:47:31.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:47:31.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:47:31.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T02:47:31.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:47:31.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-05-30T02:47:31.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:47:31.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:47:31.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:47:31.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-05-30T02:48:50.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-05-30T02:48:50.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:48:50.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:48:50.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:48:50.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:48:50.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:48:50.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:48:50.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:48:50.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:48:50.347 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:48:50.348 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:48:50.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:48:50.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:48:50.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:48:50.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:48:50.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:48:50.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T02:48:50.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:48:50.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T02:48:50.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:48:50.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:48:50.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:48:50.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:48:50.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:48:32
2026-05-30T02:48:50.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73543, datetime.datetime(2026, 5, 30, 2, 48, 32), datetime.datetime(2026, 5, 30, 2, 48, 31), 'salt', 11.15, 50.13, None, 15.35, 340.73, 9.99, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:48:50.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:48:50.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:48:50.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:48:31, diff=19.751695s, valid=True
2026-05-30T02:48:50.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:48:50.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T02:48:50.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:47:12, diff=98.755349s, valid=True
2026-05-30T02:48:50.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:48:50.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:48:50.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:48:23, diff=27.763807s, valid=True
2026-05-30T02:48:50.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:48:50.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:48:50.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:48:50.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:48:50.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:48:50.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T02:48:50.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:47:12, diff=98.767758s, valid=True
2026-05-30T02:48:50.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:48:50.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:48:50.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:48:50.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034772.768596s, valid=True
2026-05-30T02:48:50.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:48:50.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:48:50.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:48:50.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:48:50.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:48:50.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:48:50.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:48:50.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:48:50.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:48:50.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:48:51.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:48:51.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:48:51.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:48:51.161 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:48:51.370 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:48:51.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:48:51.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:48:51.809 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:48:51.809 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:48:52.074 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:48:52.074 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:49:22.093 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:49:22.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:49:22.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:49:22.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:49:22.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:49:23.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:49:23.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-05-30T02:49:23.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:49:23.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-05-30T02:49:23.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:49:23.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:49:23.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:49:23.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T02:49:26.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-05-30T02:49:26.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:49:26.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:49:26.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:49:26.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:49:26.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:49:26.112 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:49:26.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:49:26.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:49:26.113 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:49:26.113 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:49:26.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:49:26.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:49:26.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:49:26.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:49:26.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:49:26.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T02:49:26.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:49:26.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T02:49:26.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:49:26.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:49:26.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:49:26.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:49:26.449 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:49:02
2026-05-30T02:49:26.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73544, datetime.datetime(2026, 5, 30, 2, 49, 2), datetime.datetime(2026, 5, 30, 2, 49, 1), 'salt', 11.15, 50.13, None, 18.53, 339.67, 9.99, 832.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:49:26.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:49:26.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:49:26.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:49:01, diff=25.456419s, valid=True
2026-05-30T02:49:26.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:49:26.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T02:49:26.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:47:12, diff=134.459665s, valid=True
2026-05-30T02:49:26.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:49:26.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:49:26.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:48:53, diff=33.46722s, valid=True
2026-05-30T02:49:26.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:49:26.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:49:26.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:49:26.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:49:26.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:49:26.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T02:49:26.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:47:12, diff=134.470604s, valid=True
2026-05-30T02:49:26.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:49:26.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:49:26.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:49:26.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034808.471371s, valid=True
2026-05-30T02:49:26.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:49:26.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:49:26.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:49:26.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:49:26.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:49:26.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:49:26.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:49:26.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:49:26.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:49:26.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:49:26.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:49:26.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:49:26.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:49:26.814 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:49:27.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:49:27.355 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:49:27.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:49:27.453 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:49:27.453 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:49:27.647 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:49:27.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:49:57.648 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:49:57.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:49:57.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:49:58.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:49:58.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:49:58.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:49:58.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-05-30T02:49:58.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:49:58.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-05-30T02:49:58.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:49:58.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:49:58.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:49: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-05-30T02:50:24.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-05-30T02:50:24.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:50:24.608 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:50:24.609 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:50:24.619 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:50:24.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:50:24.643 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:50:24.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:50:24.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:50:24.644 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:50:24.644 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:50:24.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:50:24.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:50:24.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:50:24.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:50:24.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:50:24.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T02:50:24.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:50:24.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T02:50:24.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:50:24.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:50:24.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:50:24.963 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:50:25.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:50:02
2026-05-30T02:50:25.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73546, datetime.datetime(2026, 5, 30, 2, 50, 2), datetime.datetime(2026, 5, 30, 2, 50, 2), 'salt', 11.05, 50.1, None, 18.67, 0.97, 9.99, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:50:25.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:50:25.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:50:25.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:50:02, diff=23.035249s, valid=True
2026-05-30T02:50:25.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:50:25.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T02:50:25.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:47:12, diff=193.038733s, valid=True
2026-05-30T02:50:25.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:50:25.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:50:25.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:49:57, diff=28.046797s, valid=True
2026-05-30T02:50:25.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:50:25.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:50:25.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:50:25.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:50:25.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:50:25.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T02:50:25.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:47:12, diff=193.050521s, valid=True
2026-05-30T02:50:25.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:50:25.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:50:25.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:50:25.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034867.051348s, valid=True
2026-05-30T02:50:25.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:50:25.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:50:25.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:50:25.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:50:25.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:50:25.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:50:25.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:50:25.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:50:25.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:50:25.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:50:25.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:50:25.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:50:25.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:50:25.372 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:50:25.604 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:50:25.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:50:26.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:50:26.051 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:50:26.051 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:50:26.247 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:50:26.247 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:50:56.263 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:50:56.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:50:56.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:50:56.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:50:56.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:50:56.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:50:56.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-05-30T02:50:56.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:50:56.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-05-30T02:50:56.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:50:56.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:50:56.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:50:56.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-05-30T02:51:43.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-05-30T02:51:43.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:51:43.292 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:51:43.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:51:43.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:51:43.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:51:43.317 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:51:43.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:51:43.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:51:43.318 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:51:43.318 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:51:43.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:51:43.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:51:43.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:51:43.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:51:43.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:51:43.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:51:43.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:51:43.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:51:43.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:51:43.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:51:43.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:51:43.637 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:51:43.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:51:33
2026-05-30T02:51:43.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73549, datetime.datetime(2026, 5, 30, 2, 51, 33), datetime.datetime(2026, 5, 30, 2, 51, 33), 'salt', 11.15, 49.24, None, 21.74, 350.3, 10.24, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:51:43.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:51:43.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:51:43.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:51:33, diff=10.70779s, valid=True
2026-05-30T02:51:43.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:51:43.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:51:43.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:47:12, diff=271.711316s, valid=True
2026-05-30T02:51:43.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:51:43.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:51:43.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:51:31, diff=12.719241s, valid=True
2026-05-30T02:51:43.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:51:43.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:51:43.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:51:43.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:51:43.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:51:43.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:51:43.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:47:12, diff=271.722929s, valid=True
2026-05-30T02:51:43.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:51:43.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:51:43.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:51:43.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034945.723741s, valid=True
2026-05-30T02:51:43.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:51:43.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:51:43.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:51:43.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:51:43.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:51:43.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:51:43.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:51:43.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:51:43.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:51:43.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:51:43.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:51:43.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:51:44.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:51:44.047 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:51:44.259 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:51:44.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:51:44.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:51:44.759 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:51:44.759 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:51:44.955 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:51:44.955 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:52:14.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:52:14.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:52:14.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:52:15.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:52:15.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:52:15.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:52:15.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-05-30T02:52:15.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:52:15.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-05-30T02:52:15.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:52:15.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:52:15.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:52:15.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-05-30T02:52:19.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-05-30T02:52:19.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:52:19.998 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:52:19.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:52:20.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:52:20.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:52:20.020 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:52:20.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:52:20.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:52:20.020 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:52:20.020 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:52:20.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:52:20.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:52:20.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:52:20.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:52:20.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:52:20.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:52:20.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:52:20.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:52:20.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:52:20.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:52:20.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:52:20.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:52:20.356 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:52:03
2026-05-30T02:52:20.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73550, datetime.datetime(2026, 5, 30, 2, 52, 3), datetime.datetime(2026, 5, 30, 2, 52, 3), 'salt', 11.15, 49.04, None, 17.08, 345.09, 10.3, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:52:20.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:52:20.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:52:20.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:52:03, diff=17.363203s, valid=True
2026-05-30T02:52:20.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:52:20.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:52:20.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:47:12, diff=308.366377s, valid=True
2026-05-30T02:52:20.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:52:20.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:52:20.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:52:02, diff=18.373843s, valid=True
2026-05-30T02:52:20.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:52:20.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:52:20.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:52:20.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:52:20.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:52:20.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:52:20.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:47:12, diff=308.377342s, valid=True
2026-05-30T02:52:20.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:52:20.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:52:20.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:52:20.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1034982.378108s, valid=True
2026-05-30T02:52:20.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:52:20.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:52:20.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:52:20.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:52:20.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:52:20.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:52:20.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:52:20.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:52:20.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:52:20.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:52:20.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:52:20.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:52:20.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:52:20.698 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:52:20.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:52:21.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:52:21.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:52:21.355 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:52:21.355 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:52:21.549 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:52:21.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:52:51.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:52:51.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:52:51.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:52:51.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:52:51.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:52:52.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:52:52.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T02:52:52.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:52:52.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-05-30T02:52:52.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:52:52.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:52:52.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:52:52.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-05-30T02:52:55.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-05-30T02:52:55.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:52:55.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:52:55.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:52:55.632 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:52:55.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:52:55.645 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:52:55.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:52:55.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:52:55.646 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:52:55.646 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:52:55.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:52:55.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:52:55.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:52:55.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:52:55.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:52:55.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:52:55.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:52:55.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:52:55.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:52:55.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:52:55.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:52:55.959 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:52:56.020 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:52:34
2026-05-30T02:52:56.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73551, datetime.datetime(2026, 5, 30, 2, 52, 34), datetime.datetime(2026, 5, 30, 2, 52, 33), 'salt', 11.25, 48.84, None, 17.36, 0.99, 10.36, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:52:56.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:52:56.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:52:56.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:52:33, diff=23.028364s, valid=True
2026-05-30T02:52:56.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:52:56.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:52:56.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:53:12, diff=-15.967991s, valid=True
2026-05-30T02:52:56.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:52:56.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:52:56.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:52:26, diff=30.040322s, valid=True
2026-05-30T02:52:56.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:52:56.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:52:56.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:52:56.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:52:56.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:52:56.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:52:56.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:53:12, diff=-15.955987s, valid=True
2026-05-30T02:52:56.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:52:56.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:52:56.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:52:56.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035018.044819s, valid=True
2026-05-30T02:52:56.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:52:56.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:52:56.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:52:56.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:52:56.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:52:56.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:52:56.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:52:56.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:52:56.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:52:56.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:52:56.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:52:56.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:52:56.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:52:56.365 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:52:56.654 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:52:57.002 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:52:57.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:52:57.104 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:52:57.104 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:52:57.293 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:52:57.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:53:27.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:53:27.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:53:27.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:53:27.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:53:27.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:53:28.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:53:28.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-05-30T02:53:28.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:53:28.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-05-30T02:53:28.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:53:28.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:53:28.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:53:28.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-05-30T02:53:30.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-05-30T02:53:30.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:53:30.692 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:53:30.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:53:30.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:53:30.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:53:30.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:53:30.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:53:30.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:53:30.716 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:53:30.717 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:53:30.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:53:30.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:53:30.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:53:30.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:53:30.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:53:30.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:53:30.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:53:31.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:53:31.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:53:31.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:53:31.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:53:31.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:53:31.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:53:04
2026-05-30T02:53:31.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73552, datetime.datetime(2026, 5, 30, 2, 53, 4), datetime.datetime(2026, 5, 30, 2, 53, 4), 'salt', 11.28, 48.44, None, 20.43, 341.87, 10.47, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:53:31.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:53:31.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:53:31.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:53:04, diff=27.107477s, valid=True
2026-05-30T02:53:31.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:53:31.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:53:31.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:53:12, diff=19.111029s, valid=True
2026-05-30T02:53:31.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:53:31.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:53:31.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:52:56, diff=35.119173s, valid=True
2026-05-30T02:53:31.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:53:31.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:53:31.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:53:31.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:53:31.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:53:31.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:53:31.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:53:12, diff=19.122898s, valid=True
2026-05-30T02:53:31.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:53:31.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:53:31.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:53:31.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035053.123716s, valid=True
2026-05-30T02:53:31.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:53:31.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:53:31.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:53:31.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:53:31.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:53:31.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:53:31.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:53:31.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:53:31.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:53:31.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:53:31.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:53:31.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:53:31.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:53:31.466 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:53:31.700 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:53:32.063 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:53:32.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:53:32.162 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:53:32.162 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:53:32.424 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:53:32.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:54:02.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:54:02.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:54:02.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:54:02.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:54:02.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:54:03.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:54:03.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-05-30T02:54:03.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:54:03.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-05-30T02:54:03.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:54:03.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:54:03.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:54:03.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-05-30T02:54:05.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-05-30T02:54:05.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:54:05.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:54:05.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:54:05.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:54:05.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:54:05.616 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:54:05.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:54:05.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:54:05.617 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:54:05.618 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:54:05.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:54:05.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:54:05.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:54:05.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:54:05.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:54:05.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:54:05.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:54:05.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:54:05.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:54:05.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:54:05.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:54:05.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:54:05.998 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:54:04
2026-05-30T02:54:05.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73554, datetime.datetime(2026, 5, 30, 2, 54, 4), datetime.datetime(2026, 5, 30, 2, 54, 4), 'salt', 11.25, 48.81, None, 15.7, 344.64, 10.37, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:54:05.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:54:05.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:54:06.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:54:04, diff=2.005516s, valid=True
2026-05-30T02:54:06.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:54:06.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:54:06.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:54:12, diff=-5.990989s, valid=True
2026-05-30T02:54:06.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:54:06.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:54:06.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:53:58, diff=8.017219s, valid=True
2026-05-30T02:54:06.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:54:06.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:54:06.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:54:06.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:54:06.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:54:06.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:54:06.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:54:12, diff=-5.97904s, valid=True
2026-05-30T02:54:06.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:54:06.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:54:06.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:54:06.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035088.021792s, valid=True
2026-05-30T02:54:06.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:54:06.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:54:06.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:54:06.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:54:06.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:54:06.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:54:06.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:54:06.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:54:06.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:54:06.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:54:06.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:54:06.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:54:06.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:54:06.416 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:54:06.630 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:54:06.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:54:07.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:54:07.083 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:54:07.083 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:54:07.272 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:54:07.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:54:37.288 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:54:37.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:54:37.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:54:37.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:54:37.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:54:37.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:54:37.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-05-30T02:54:37.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:54:37.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-05-30T02:54:37.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:54:37.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:54:37.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:54:37.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-05-30T02:55:10.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-05-30T02:55:10.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:55:10.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:55:10.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:55:10.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:55:10.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:55:10.956 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:55:10.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:55:10.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:55:10.957 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:55:10.958 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:55:10.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:55:11.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:55:11.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:55:11.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:55:11.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:55:11.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:55:11.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:55:11.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:55:11.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:55:11.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:55:11.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:55:11.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:55:11.338 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:55:05
2026-05-30T02:55:11.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73556, datetime.datetime(2026, 5, 30, 2, 55, 5), datetime.datetime(2026, 5, 30, 2, 55, 5), 'salt', 11.28, 48.57, None, 20.22, 333.35, 10.44, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:55:11.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:55:11.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:55:11.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:55:05, diff=6.346097s, valid=True
2026-05-30T02:55:11.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:55:11.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:55:11.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:55:12, diff=-0.650485s, valid=True
2026-05-30T02:55:11.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:55:11.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:55:11.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:55:01, diff=10.357689s, valid=True
2026-05-30T02:55:11.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:55:11.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:55:11.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:55:11.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:55:11.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:55:11.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:55:11.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:55:12, diff=-0.63864s, valid=True
2026-05-30T02:55:11.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:55:11.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:55:11.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:55:11.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035153.362219s, valid=True
2026-05-30T02:55:11.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:55:11.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:55:11.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:55:11.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:55:11.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:55:11.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:55:11.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:55:11.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:55:11.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:55:11.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:55:11.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:55:11.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:55:11.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:55:11.690 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:55:11.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:55:12.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:55:12.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:55:12.359 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:55:12.359 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:55:12.548 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:55:12.548 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:55:42.577 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:55:42.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:55:42.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:55:42.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:55:42.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:55:43.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:55: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-05-30T02:55:43.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:55:43.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-05-30T02:55:43.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:55:43.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:55:43.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:55:43.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-05-30T02:56:32.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-05-30T02:56:32.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:56:32.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:56:32.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:56:32.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:56:32.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:56:32.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:56:32.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:56:32.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:56:32.959 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:56:32.959 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:56:32.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:56:33.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:56:33.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:56:33.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:56:33.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:56:33.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:56:33.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:56:33.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:56:33.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:56:33.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:56:33.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:56:33.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:56:33.348 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:56:05
2026-05-30T02:56:33.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73558, datetime.datetime(2026, 5, 30, 2, 56, 5), datetime.datetime(2026, 5, 30, 2, 56, 5), 'salt', 11.32, 48.57, None, 18.88, 343.7, 10.44, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:56:33.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:56:33.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:56:33.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:56:05, diff=28.355673s, valid=True
2026-05-30T02:56:33.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:56:33.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:56:33.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:56:12, diff=21.359226s, valid=True
2026-05-30T02:56:33.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:56:33.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:56:33.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:56:04, diff=29.367515s, valid=True
2026-05-30T02:56:33.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:56:33.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:56:33.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:56:33.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:56:33.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:56:33.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:56:33.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:56:12, diff=21.37131s, valid=True
2026-05-30T02:56:33.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:56:33.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:56:33.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:56:33.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035235.372168s, valid=True
2026-05-30T02:56:33.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:56:33.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:56:33.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:56:33.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:56:33.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:56:33.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:56:33.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:56:33.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:56:33.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:56:33.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:56:33.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:56:33.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:56:33.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:56:33.761 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:56:33.977 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:56:34.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:56:34.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:56:34.427 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:56:34.427 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:56:34.701 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:56:34.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:57:04.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:57:04.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:57:04.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:57:05.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:57:05.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:57:05.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:57:05.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-05-30T02:57:05.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:57:05.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-05-30T02:57:05.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:57:05.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:57:05.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:57:05.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-05-30T02:57:07.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-05-30T02:57:07.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:57:07.763 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:57:07.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:57:07.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:57:07.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:57:07.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:57:07.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:57:07.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:57:07.788 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:57:07.788 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:57:07.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:57:07.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:57:07.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:57:08.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:57:08.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:57:08.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:57:08.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:57:08.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:57:08.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:57:08.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:57:08.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:57:08.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:57:08.162 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:57:06
2026-05-30T02:57:08.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73560, datetime.datetime(2026, 5, 30, 2, 57, 6), datetime.datetime(2026, 5, 30, 2, 57, 6), 'salt', 11.35, 48.38, None, 12.32, 10.52, 10.5, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:57:08.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:57:08.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:57:08.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:57:06, diff=2.168964s, valid=True
2026-05-30T02:57:08.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:57:08.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:57:08.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:57:12, diff=-3.828161s, valid=True
2026-05-30T02:57:08.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:57:08.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:57:08.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:56:58, diff=10.178652s, valid=True
2026-05-30T02:57:08.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:57:08.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:57:08.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:57:08.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:57:08.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:57:08.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:57:08.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:57:12, diff=-3.818277s, valid=True
2026-05-30T02:57:08.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:57:08.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:57:08.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:57:08.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035270.182387s, valid=True
2026-05-30T02:57:08.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:57:08.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:57:08.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:57:08.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:57:08.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:57:08.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:57:08.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:57:08.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:57:08.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:57:08.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:57:08.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:57:08.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:57:08.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:57:08.627 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:57:08.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:57:09.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:57:09.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:57:09.282 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:57:09.282 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:57:09.471 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:57:09.471 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:57:39.486 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:57:39.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:57:39.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:57:39.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:57:39.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:57:40.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:57:40.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T02:57:40.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:57:40.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-05-30T02:57:40.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:57:40.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:57:40.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:57:40.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T02:57:43.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-05-30T02:57:43.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:57:43.551 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:57:43.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:57:43.561 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:57:43.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:57:43.575 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:57:43.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:57:43.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:57:43.576 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:57:43.576 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:57:43.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:57:43.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T02:57:43.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:57:43.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T02:57:43.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:57:43.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:57:43.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:57:43.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T02:57:43.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:57:43.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:57:43.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:57:43.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:57:43.960 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:57:36
2026-05-30T02:57:43.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73561, datetime.datetime(2026, 5, 30, 2, 57, 36), datetime.datetime(2026, 5, 30, 2, 57, 36), 'salt', 11.32, 48.71, None, 21.98, 350.16, 10.41, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:57:43.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:57:43.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T02:57:43.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:57:36, diff=7.968104s, valid=True
2026-05-30T02:57:43.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:57:43.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:57:43.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:58:12, diff=-28.028457s, valid=True
2026-05-30T02:57:43.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:57:43.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T02:57:43.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:57:28, diff=15.979764s, valid=True
2026-05-30T02:57:43.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:57:43.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:57:43.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:57:43.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:57:43.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:57:43.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T02:57:43.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:58:12, diff=-28.016529s, valid=True
2026-05-30T02:57:43.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:57:43.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:57:43.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:57:43.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035305.984325s, valid=True
2026-05-30T02:57:43.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:57:43.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:57:43.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:57:43.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:57:43.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:57:44.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:57:44.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:57:44.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:57:44.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:57:44.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:57:44.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:57:44.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:57:44.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:57:44.372 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:57:44.589 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:57:44.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:57:45.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:57:45.039 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:57:45.039 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:57:45.226 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:57:45.226 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:58:15.232 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:58:15.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:58:15.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:58:15.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:58:15.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:58:15.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:58:15.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-05-30T02:58:15.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:58:15.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-05-30T02:58:15.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:58:15.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:58:15.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:58:15.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-05-30T02:58:18.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T02:58:18.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:58:18.458 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:58:18.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:58:18.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:58:18.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:58:18.475 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:58:18.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:58:18.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:58:18.476 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:58:18.476 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:58:18.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:58:18.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:58:18.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:58:18.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:58:18.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:58:18.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:58:18.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:58:18.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:58:18.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:58:18.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:58:18.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:58:18.796 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:58:18.857 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:58:07
2026-05-30T02:58:18.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73562, datetime.datetime(2026, 5, 30, 2, 58, 7), datetime.datetime(2026, 5, 30, 2, 58, 6), 'salt', 11.18, 48.44, None, 21.74, 332.48, 10.46, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:58:18.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:58:18.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:58:18.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:58:06, diff=12.865179s, valid=True
2026-05-30T02:58:18.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:58:18.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:58:18.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:58:12, diff=6.868606s, valid=True
2026-05-30T02:58:18.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:58:18.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:58:18.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:57:59, diff=19.876689s, valid=True
2026-05-30T02:58:18.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:58:18.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:58:18.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:58:18.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:58:18.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:58:18.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:58:18.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:58:12, diff=6.880345s, valid=True
2026-05-30T02:58:18.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:58:18.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:58:18.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:58:18.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035340.881147s, valid=True
2026-05-30T02:58:18.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:58:18.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:58:18.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:58:18.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:58:18.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:58:18.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:58:18.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:58:18.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:58:18.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:58:19.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:58:19.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:58:19.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:58:19.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:58:19.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:58:19.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:58:19.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:58:19.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:58:19.858 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:58:19.858 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:58:20.048 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:58:20.048 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:58:50.074 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:58:50.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:58:50.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:58:50.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:58:50.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:58:50.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:58:50.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-05-30T02:58:50.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:58:50.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-05-30T02:58:50.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:58:50.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:58:50.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:58:50.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-05-30T02:58:59.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-05-30T02:58:59.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:58:59.358 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:58:59.358 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:58:59.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:58:59.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:58:59.374 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:58:59.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:58:59.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:58:59.375 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:58:59.376 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:58:59.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:58:59.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:58:59.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:58:59.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:58:59.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:58:59.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:58:59.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:58:59.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:58:59.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:58:59.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:58:59.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:58:59.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:58:59.753 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:58:37
2026-05-30T02:58:59.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73563, datetime.datetime(2026, 5, 30, 2, 58, 37), datetime.datetime(2026, 5, 30, 2, 58, 36), 'salt', 11.28, 48.34, None, 16.44, 2.52, 10.5, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:58:59.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:58:59.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:58:59.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:58:36, diff=23.760771s, valid=True
2026-05-30T02:58:59.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:58:59.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:58:59.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:59:12, diff=-12.235798s, valid=True
2026-05-30T02:58:59.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:58:59.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:58:59.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:58:31, diff=28.77222s, valid=True
2026-05-30T02:58:59.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:58:59.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:58:59.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:58:59.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:58:59.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:58:59.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:58:59.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:59:12, diff=-12.224028s, valid=True
2026-05-30T02:58:59.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:58:59.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:58:59.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:58:59.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035381.776786s, valid=True
2026-05-30T02:58:59.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:58:59.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:58:59.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:58:59.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:58:59.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:58:59.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:58:59.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:58:59.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:58:59.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:58:59.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:58:59.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:59:00.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:59:00.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:59:00.128 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:59:00.361 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:59:00.704 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:59:00.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:59:00.804 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:59: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-05-30T02:59:00.995 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:59:00.996 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T02:59:31.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T02:59:31.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T02:59:31.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T02:59:31.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T02:59:31.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T02:59:31.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T02:59:31.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-05-30T02:59:31.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T02:59: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-05-30T02:59:31.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T02:59:31.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T02:59:31.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T02:59:31.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-05-30T02:59:33.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-05-30T02:59:33.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T02:59:33.800 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T02:59:33.800 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T02:59:33.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T02:59:33.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T02:59:33.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T02:59:33.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T02:59:33.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T02:59:33.824 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T02:59:33.824 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T02:59:33.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T02:59:33.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T02:59:33.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T02:59:34.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T02:59:34.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:59:34.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:59:34.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T02:59:34.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T02:59:34.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T02:59:34.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T02:59:34.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T02:59:34.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T02:59:34.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 02:59:07
2026-05-30T02:59:34.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73564, datetime.datetime(2026, 5, 30, 2, 59, 7), datetime.datetime(2026, 5, 30, 2, 59, 7), 'salt', 11.38, 47.88, None, 16.9, 345.15, 10.64, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T02:59:34.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T02:59:34.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T02:59:34.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:59:07, diff=27.216397s, valid=True
2026-05-30T02:59:34.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T02:59:34.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:59:34.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:59:12, diff=22.219909s, valid=True
2026-05-30T02:59:34.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T02:59:34.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T02:59:34.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:59:02, diff=32.228314s, valid=True
2026-05-30T02:59:34.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T02:59:34.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:59:34.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T02:59:34.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T02:59:34.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T02:59:34.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T02:59:34.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 02:59:12, diff=22.232022s, valid=True
2026-05-30T02:59:34.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T02:59:34.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T02:59:34.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T02:59:34.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035416.23284s, valid=True
2026-05-30T02:59:34.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T02:59:34.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T02:59:34.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T02:59:34.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T02:59:34.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T02:59:34.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T02:59:34.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T02:59:34.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T02:59:34.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T02:59:34.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T02:59:34.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T02:59:34.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T02:59:34.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T02:59:34.552 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T02:59:34.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:59:35.168 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T02:59:35.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T02:59:35.267 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T02:59:35.267 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T02:59:35.524 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T02:59:35.525 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:00:05.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:00:05.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:00:05.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:00:05.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:00:05.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:00:05.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:00:05.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-05-30T03:00:05.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:00:05.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-05-30T03:00:05.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:00:05.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:00:05.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:00:05.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-05-30T03:00:08.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-05-30T03:00:08.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:00:08.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:00:08.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:00:08.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:00:08.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:00:08.226 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:00:08.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:00:08.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:00:08.227 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:00:08.227 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:00:08.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:00:08.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:00:08.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:00:08.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:00:08.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:00:08.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:00:08.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:00:08.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:00:08.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:00:08.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:00:08.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:00:08.547 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:00:08.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:00:08
2026-05-30T03:00:08.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73566, datetime.datetime(2026, 5, 30, 3, 0, 8), datetime.datetime(2026, 5, 30, 3, 0, 7), 'salt', 11.51, 47.28, None, 21.24, 333.56, 10.83, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:00:08.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:00:08.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:00:08.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:00:07, diff=1.618296s, valid=True
2026-05-30T03:00:08.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:00:08.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:00:08.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:00:12, diff=-3.378228s, valid=True
2026-05-30T03:00:08.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:00:08.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:00:08.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:00:05, diff=3.630046s, valid=True
2026-05-30T03:00:08.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:00:08.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:00:08.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:00:08.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:00:08.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:00:08.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:00:08.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:00:12, diff=-3.366044s, valid=True
2026-05-30T03:00:08.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:00:08.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:00:08.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:00:08.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035450.634799s, valid=True
2026-05-30T03:00:08.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:00:08.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:00:08.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:00:08.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:00:08.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:00:08.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:00:08.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:00:08.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:00:08.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:00:08.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:00:08.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:00:08.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:00:08.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:00:08.957 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:00:09.170 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:00:09.515 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:00:09.615 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:00: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-05-30T03:00: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-05-30T03:00:09.806 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:00:09.806 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:00:39.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:00:39.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:00:39.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:00:40.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:00:40.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:00:40.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:00:40.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-05-30T03:00:40.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:00:40.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-05-30T03:00:40.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:00:40.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:00:40.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:00:40.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-05-30T03:00:43.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-05-30T03:00:43.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:00:43.835 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:00:43.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:00:43.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:00:43.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:00:43.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:00:43.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:00:43.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:00:43.860 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:00:43.860 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:00:43.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:00:43.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:00:43.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:00:44.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:00:44.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:00:44.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:00:44.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:00:44.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:00:44.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:00:44.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:00:44.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:00:44.183 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:00:44.247 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:00:38
2026-05-30T03:00:44.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73567, datetime.datetime(2026, 5, 30, 3, 0, 38), datetime.datetime(2026, 5, 30, 3, 0, 37), 'salt', 11.41, 47.25, None, 19.87, 336.28, 10.83, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:00:44.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:00:44.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:00:44.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:00:37, diff=7.255415s, valid=True
2026-05-30T03:00:44.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:00:44.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:00:44.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:01:12, diff=-27.740934s, valid=True
2026-05-30T03:00:44.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:00:44.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:00:44.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:00:36, diff=8.267367s, valid=True
2026-05-30T03:00:44.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:00:44.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:00:44.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:00:44.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:00:44.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:00:44.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:00:44.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:01:12, diff=-27.728651s, valid=True
2026-05-30T03:00:44.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:00:44.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:00:44.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:00:44.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035486.272221s, valid=True
2026-05-30T03:00:44.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:00:44.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:00:44.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:00:44.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:00:44.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:00:44.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:00:44.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:00:44.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:00:44.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:00:44.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:00:44.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:00:44.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:00:44.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:00:44.593 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:00:44.805 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:00:45.217 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:00:45.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:00:45.319 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:00:45.319 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:00:45.571 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:00:45.571 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:01:15.600 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:01:15.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:01:15.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:01:15.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:01:15.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:01:16.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:01:16.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-05-30T03:01:16.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:01:16.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T03:01:16.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:01:16.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:01:16.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:01:16.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-05-30T03:01:18.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-05-30T03:01:18.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:01:18.556 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:01:18.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:01:18.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:01:18.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:01:18.582 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:01:18.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:01:18.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:01:18.583 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:01:18.583 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:01:18.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:01:18.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:01:18.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:01:18.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:01:18.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:01:18.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:01:18.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:01:18.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:01:18.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:01:18.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:01:18.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:01:18.902 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:01:18.963 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:01:08
2026-05-30T03:01:18.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73568, datetime.datetime(2026, 5, 30, 3, 1, 8), datetime.datetime(2026, 5, 30, 3, 1, 8), 'salt', 11.55, 46.98, None, 21.28, 346.09, 10.93, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:01:18.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:01:18.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:01:18.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:01:08, diff=10.971192s, valid=True
2026-05-30T03:01:18.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:01:18.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:01:18.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:01:12, diff=6.974576s, valid=True
2026-05-30T03:01:18.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:01:18.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:01:18.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:01:08, diff=10.982611s, valid=True
2026-05-30T03:01:18.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:01:18.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:01:18.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:01:18.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:01:18.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:01:18.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:01:18.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:01:12, diff=6.98621s, valid=True
2026-05-30T03:01:18.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:01:18.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:01:18.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:01:18.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035520.987021s, valid=True
2026-05-30T03:01:18.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:01:18.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:01:18.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:01:18.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:01:18.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:01:19.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:01:19.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:01:19.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:01:19.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:01:19.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:01:19.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:01:19.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:01:19.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:01:19.307 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:01:19.520 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:01:19.868 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:01:19.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:01:19.979 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:01:19.980 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:01:20.170 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:01:20.170 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:01:50.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:01:50.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:01:50.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:01:50.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:01:50.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:01:50.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:01:50.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-05-30T03:01:50.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:01:50.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-05-30T03:01:50.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:01:50.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:01:50.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:01:50.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-05-30T03:01:53.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-05-30T03:01:53.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:01:53.492 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:01:53.492 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:01:53.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:01:53.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:01:53.516 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:01:53.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:01:53.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:01:53.517 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:01:53.517 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:01:53.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:01:53.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:01:53.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:01:53.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:01:53.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:01:53.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:01:53.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:01:53.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:01:53.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:01:53.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:01:53.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:01:53.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:01:53.899 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:01:38
2026-05-30T03:01:53.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73569, datetime.datetime(2026, 5, 30, 3, 1, 38), datetime.datetime(2026, 5, 30, 3, 1, 38), 'salt', 11.58, 46.98, None, 20.25, 6.04, 10.93, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:01:53.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:01:53.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:01:53.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:01:38, diff=15.907114s, valid=True
2026-05-30T03:01:53.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:01:53.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:01:53.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:02:12, diff=-18.089388s, valid=True
2026-05-30T03:01:53.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:01:53.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:01:53.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:01:31, diff=22.918858s, valid=True
2026-05-30T03:01:53.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:01:53.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:01:53.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:01:53.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:01:53.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:01:53.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:01:53.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:02:12, diff=-18.077389s, valid=True
2026-05-30T03:01:53.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:01:53.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:01:53.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:01:53.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035555.923482s, valid=True
2026-05-30T03:01:53.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:01:53.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:01:53.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:01:53.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:01:53.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:01:53.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:01:53.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:01:53.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:01:54.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:01:54.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:01:54.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:01:54.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:01:54.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:01:54.313 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:01:54.541 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:01:54.884 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:01:54.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:01:54.984 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:01:54.984 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:01:55.173 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:01:55.173 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:02:25.179 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:02:25.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:02:25.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:02:25.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:02:25.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:02:25.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:02:25.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-05-30T03:02:25.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:02:25.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-05-30T03:02:25.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:02:25.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:02:25.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:02:25.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-05-30T03:02:28.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-05-30T03:02:28.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:02:28.193 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:02:28.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:02:28.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:02:28.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:02:28.218 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:02:28.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:02:28.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:02:28.219 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:02:28.219 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:02:28.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:02:28.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:02:28.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:02:28.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:02:28.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:02:28.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:02:28.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:02:28.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:02:28.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:02:28.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:02:28.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:02:28.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:02:28.599 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:02:09
2026-05-30T03:02:28.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73570, datetime.datetime(2026, 5, 30, 3, 2, 9), datetime.datetime(2026, 5, 30, 3, 2, 8), 'salt', 11.51, 46.85, None, 20.89, 346.77, 10.95, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:02:28.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:02:28.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:02:28.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:02:08, diff=20.606405s, valid=True
2026-05-30T03:02:28.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:02:28.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:02:28.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:02:12, diff=16.609904s, valid=True
2026-05-30T03:02:28.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:02:28.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:02:28.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:02:01, diff=27.618174s, valid=True
2026-05-30T03:02:28.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:02:28.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:02:28.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:02:28.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:02:28.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:02:28.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:02:28.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:02:12, diff=16.62191s, valid=True
2026-05-30T03:02:28.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:02:28.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:02:28.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:02:28.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035590.622745s, valid=True
2026-05-30T03:02:28.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:02:28.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:02:28.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:02:28.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:02:28.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:02:28.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:02:28.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:02:28.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:02:28.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:02:28.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:02:28.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:02:28.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:02:28.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:02:28.943 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:02:29.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:02:29.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:02:29.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:02:29.600 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:02:29.600 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:02:29.791 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:02:29.791 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:02:59.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:02:59.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:02:59.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:03:00.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:03:00.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:03:00.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:03:00.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-05-30T03:03:00.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:03:00.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-05-30T03:03:00.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:03:00.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:03:00.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:03:00.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-05-30T03:03:02.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-05-30T03:03:02.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:03:02.812 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:03:02.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:03:02.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:03:02.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:03:02.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:03:02.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:03:02.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:03:02.838 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:03:02.838 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:03:02.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:03:02.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:03:02.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:03:03.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:03:03.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:03:03.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:03:03.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:03:03.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:03:03.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:03:03.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:03:03.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:03:03.155 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:03:03.217 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:02:39
2026-05-30T03:03:03.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73571, datetime.datetime(2026, 5, 30, 3, 2, 39), datetime.datetime(2026, 5, 30, 3, 2, 38), 'salt', 11.55, 46.68, None, 18.0, 342.9, 11.01, 832.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:03:03.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:03:03.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:03:03.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:02:38, diff=25.224791s, valid=True
2026-05-30T03:03:03.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:03:03.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:03:03.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:03:12, diff=-8.771731s, valid=True
2026-05-30T03:03:03.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:03:03.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:03:03.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:02:32, diff=31.236682s, valid=True
2026-05-30T03:03:03.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:03:03.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:03:03.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:03:03.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:03:03.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:03:03.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:03:03.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:03:12, diff=-8.759584s, valid=True
2026-05-30T03:03:03.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:03:03.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:03:03.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:03:03.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035625.241289s, valid=True
2026-05-30T03:03:03.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:03:03.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:03:03.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:03:03.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:03:03.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:03:03.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:03:03.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:03:03.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:03:03.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:03:03.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:03:03.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:03:03.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:03:03.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:03:03.626 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:03:03.838 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:03:04.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:03:04.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:03:04.290 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:03:04.290 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:03:04.482 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:03:04.483 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:03:34.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:03:34.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:03:34.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:03:34.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:03:34.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:03:35.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:03:35.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-05-30T03:03:35.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:03:35.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-05-30T03:03:35.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:03:35.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:03:35.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:03:35.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-05-30T03:03:37.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-05-30T03:03:37.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:03:37.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:03:37.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:03:37.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:03:37.455 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:03:37.455 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:03:37.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:03:37.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:03:37.456 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:03:37.456 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:03:37.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:03:37.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:03:37.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:03:37.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:03:37.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:03:37.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:03:37.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:03:37.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:03:37.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:03:37.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:03:37.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:03:37.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:03:37.839 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:03:09
2026-05-30T03:03:37.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73572, datetime.datetime(2026, 5, 30, 3, 3, 9), datetime.datetime(2026, 5, 30, 3, 3, 9), 'salt', 11.55, 46.65, None, 21.52, 334.23, 11.02, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:03:37.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:03:37.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:03:37.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:03:09, diff=28.847171s, valid=True
2026-05-30T03:03:37.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:03:37.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:03:37.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:03:12, diff=25.850698s, valid=True
2026-05-30T03:03:37.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:03:37.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:03:37.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:03:04, diff=33.858924s, valid=True
2026-05-30T03:03:37.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:03:37.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:03:37.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:03:37.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:03:37.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:03:37.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:03:37.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:03:12, diff=25.862649s, valid=True
2026-05-30T03:03:37.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:03:37.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:03:37.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:03:37.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035659.863456s, valid=True
2026-05-30T03:03:37.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:03:37.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:03:37.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:03:37.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:03:37.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:03:37.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:03:37.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:03:37.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:03:37.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:03:38.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:03:38.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:03:38.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:03:38.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:03:38.186 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:03:38.399 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:03:38.744 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:03:38.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:03:38.852 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:03:38.853 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:03:39.041 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:03:39.041 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:04:09.071 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:04:09.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:04:09.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:04:09.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:04:09.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:04:09.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:04:09.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-05-30T03:04:09.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:04:09.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-05-30T03:04:09.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:04:09.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:04:09.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:04:09.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T03:04:11.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-05-30T03:04:11.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:04:11.992 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:04:11.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:04:12.005 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:04:12.018 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:04:12.018 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:04:12.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:04:12.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:04:12.019 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:04:12.020 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:04:12.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:04:12.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:04:12.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:04:12.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:04:12.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:04:12.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:04:12.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:04:12.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:04:12.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:04:12.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:04:12.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:04:12.341 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:04:12.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:04:10
2026-05-30T03:04:12.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73574, datetime.datetime(2026, 5, 30, 3, 4, 10), datetime.datetime(2026, 5, 30, 3, 4, 9), 'salt', 11.51, 47.18, None, 24.06, 342.24, 10.86, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:04:12.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:04:12.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:04:12.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:04:09, diff=3.410338s, valid=True
2026-05-30T03:04:12.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:04:12.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:04:12.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:04:12, diff=0.413647s, valid=True
2026-05-30T03:04:12.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:04:12.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:04:12.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:04:07, diff=5.421283s, valid=True
2026-05-30T03:04:12.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:04:12.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:04:12.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:04:12.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:04:12.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:04:12.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:04:12.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:04:12, diff=0.424785s, valid=True
2026-05-30T03:04:12.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:04:12.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:04:12.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:04:12.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035694.425537s, valid=True
2026-05-30T03:04:12.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:04:12.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:04:12.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:04:12.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:04:12.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:04:12.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:04:12.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:04:12.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:04:12.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:04:12.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:04:12.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:04:12.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:04:12.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:04:12.829 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:04:13.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:04:13.416 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:04:13.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:04:13.521 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:04:13.521 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:04:15.860 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:04:15.861 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:04:45.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:04:45.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:04:45.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:04:46.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:04:46.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:04:46.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:04: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-05-30T03:04:46.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:04:46.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-05-30T03:04:46.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:04:46.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:04:46.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:04:46.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-05-30T03:04:49.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-05-30T03:04:49.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:04:49.075 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:04:49.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:04:49.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:04:49.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:04:49.098 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:04:49.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:04:49.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:04:49.099 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:04:49.100 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:04:49.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:04:49.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:04:49.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:04:49.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:04:49.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:04:49.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:04:49.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:04:49.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:04:49.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:04:49.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:04:49.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:04:49.419 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:04:49.479 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:04:40
2026-05-30T03:04:49.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73575, datetime.datetime(2026, 5, 30, 3, 4, 40), datetime.datetime(2026, 5, 30, 3, 4, 39), 'salt', 11.45, 47.05, None, 21.35, 332.99, 10.9, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:04:49.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:04:49.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:04:49.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:04:39, diff=10.487318s, valid=True
2026-05-30T03:04:49.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:04:49.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:04:49.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:05:12, diff=-22.509154s, valid=True
2026-05-30T03:04:49.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:04:49.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:04:49.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:04:38, diff=11.499362s, valid=True
2026-05-30T03:04:49.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:04:49.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:04:49.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:04:49.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:04:49.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:04:49.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:04:49.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:05:12, diff=-22.496882s, valid=True
2026-05-30T03:04:49.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:04:49.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:04:49.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:04:49.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035731.503967s, valid=True
2026-05-30T03:04:49.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:04:49.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:04:49.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:04:49.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:04:49.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:04:49.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:04:49.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:04:49.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:04:49.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:04:49.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:04:49.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:04:49.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:04:49.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:04:49.824 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:04:50.055 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:04:50.444 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:04:50.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:04:50.545 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:04:50.545 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:04:50.982 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:04:50.982 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:05:20.985 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:05:20.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:05:20.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:05:21.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:05:21.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:05:21.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:05:21.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-05-30T03:05:21.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:05:21.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-05-30T03:05:21.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:05:21.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:05:21.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:05:21.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-05-30T03:05:23.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-05-30T03:05:23.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:05:23.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:05:23.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:05:23.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:05:23.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:05:23.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:05:23.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:05:23.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:05:23.935 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:05:23.935 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:05:23.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:05:24.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:05:24.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:05:24.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:05:24.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:05:24.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:05:24.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:05:24.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:05:24.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:05:24.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:05:24.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:05:24.252 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:05:24.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:05:10
2026-05-30T03:05:24.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73576, datetime.datetime(2026, 5, 30, 3, 5, 10), datetime.datetime(2026, 5, 30, 3, 5, 10), 'salt', 11.55, 46.85, None, 21.77, 346.25, 10.97, 831.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:05:24.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:05:24.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:05:24.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:05:10, diff=14.325424s, valid=True
2026-05-30T03:05:24.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:05:24.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:05:24.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:05:12, diff=12.328802s, valid=True
2026-05-30T03:05:24.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:05:24.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:05:24.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:05:09, diff=15.336845s, valid=True
2026-05-30T03:05:24.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:05:24.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:05:24.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:05:24.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:05:24.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:05:24.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:05:24.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:05:12, diff=12.340432s, valid=True
2026-05-30T03:05:24.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:05:24.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:05:24.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:05:24.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035766.341225s, valid=True
2026-05-30T03:05:24.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:05:24.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:05:24.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:05:24.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:05:24.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:05:24.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:05:24.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:05:24.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:05:24.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:05:24.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:05:24.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:05:24.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:05:24.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:05:24.661 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:05:24.892 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:05:25.237 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:05:25.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:05:25.337 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:05:25.337 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:05:25.599 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:05:25.599 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:05:55.629 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:05:55.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:05:55.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:05:56.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:05:56.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:05:56.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:05:56.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-05-30T03:05:56.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:05:56.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-05-30T03:05:56.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:05:56.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:05:56.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:05:56.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-05-30T03:06:00.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-05-30T03:06:00.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:06:00.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:06:00.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:06:00.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:06:00.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:06:00.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:06:00.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:06:00.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:06:00.996 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:06:00.996 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:06:01.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:06:01.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:06:01.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:06:01.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:06:01.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:06:01.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:06:01.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:06:01.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:06:01.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:06:01.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:06:01.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:06:01.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:06:01.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:05:40
2026-05-30T03:06:01.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73577, datetime.datetime(2026, 5, 30, 3, 5, 40), datetime.datetime(2026, 5, 30, 3, 5, 40), 'salt', 11.41, 47.21, None, 22.3, 352.92, 10.84, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:06:01.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:06:01.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:06:01.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:05:40, diff=21.392787s, valid=True
2026-05-30T03:06:01.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:06:01.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:06:01.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:06:12, diff=-10.603696s, valid=True
2026-05-30T03:06:01.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:06:01.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:06:01.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:05:33, diff=28.406517s, valid=True
2026-05-30T03:06:01.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:06:01.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:06:01.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:06:01.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:06:01.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:06:01.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:06:01.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:06:12, diff=-10.587228s, valid=True
2026-05-30T03:06:01.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:06:01.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:06:01.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:06:01.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035803.414354s, valid=True
2026-05-30T03:06:01.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:06:01.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:06:01.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:06:01.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:06:01.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:06:01.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:06:01.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:06:01.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:06:01.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:06:01.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:06:01.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:06:01.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:06:01.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:06:01.758 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:06:01.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:06:02.373 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:06:02.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:06:02.473 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:06:02.473 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:06:02.657 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:06:02.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:06:32.659 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:06:32.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:06:32.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:06:32.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:06:32.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:06:33.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:06:33.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-05-30T03:06:33.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:06:33.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T03:06:33.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:06:33.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:06:33.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:06:33.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-05-30T03:06:35.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-05-30T03:06:35.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:06:35.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:06:35.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:06:35.675 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:06:35.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:06:35.688 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:06:35.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:06:35.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:06:35.690 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:06:35.690 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:06:35.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:06:35.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:06:35.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:06:35.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:06:35.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:06:35.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:06:35.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:06:36.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:06:36.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:06:36.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:06:36.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:06:36.015 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:06:36.077 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:06:11
2026-05-30T03:06:36.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73578, datetime.datetime(2026, 5, 30, 3, 6, 11), datetime.datetime(2026, 5, 30, 3, 6, 10), 'salt', 11.35, 47.64, None, 16.76, 347.26, 10.72, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:06:36.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:06:36.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:06:36.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:06:10, diff=26.084952s, valid=True
2026-05-30T03:06:36.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:06:36.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:06:36.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:06:12, diff=24.088451s, valid=True
2026-05-30T03:06:36.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:06:36.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:06:36.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:06:03, diff=33.096725s, valid=True
2026-05-30T03:06:36.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:06:36.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:06:36.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:06:36.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:06:36.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:06:36.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:06:36.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:06:12, diff=24.1005s, valid=True
2026-05-30T03:06:36.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:06:36.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:06:36.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:06:36.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035838.101331s, valid=True
2026-05-30T03:06:36.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:06:36.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:06:36.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:06:36.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:06:36.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:06:36.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:06:36.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:06:36.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:06:36.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:06:36.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:06:36.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:06:36.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:06:36.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:06:36.446 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:06:36.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:06:37.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:06:37.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:06:37.104 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:06:37.104 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:06:37.291 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:06:37.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:07:07.300 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:07:07.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:07:07.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:07:07.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:07:07.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:07:07.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:07:07.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-05-30T03:07:07.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:07:07.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-05-30T03:07:07.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:07:07.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:07:07.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:07:07.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-05-30T03:07:11.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-05-30T03:07:11.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:07:11.541 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:07:11.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:07:11.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:07:11.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:07:11.569 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:07:11.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:07:11.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:07:11.570 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:07:11.570 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:07:11.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:07:11.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:07:11.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:07:11.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:07:11.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:07:11.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:07:11.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:07:11.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:07:11.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:07:11.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:07:11.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:07:11.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:07:11.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:07:11
2026-05-30T03:07:11.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73580, datetime.datetime(2026, 5, 30, 3, 7, 11), datetime.datetime(2026, 5, 30, 3, 7, 11), 'salt', 11.31, 48.34, None, 15.14, 9.44, 10.5, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:07:11.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:07:11.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:07:11.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:07:11, diff=0.902744s, valid=True
2026-05-30T03:07:11.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:07:11.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:07:11.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:07:12, diff=-0.09402s, valid=True
2026-05-30T03:07:11.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:07:11.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:07:11.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:07:05, diff=6.913434s, valid=True
2026-05-30T03:07:11.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:07:11.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:07:11.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:07:11.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:07:11.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:07:11.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:07:11.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:07:12, diff=-0.083179s, valid=True
2026-05-30T03:07:11.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:07:11.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:07:11.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:07:11.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035873.917557s, valid=True
2026-05-30T03:07:11.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:07:11.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:07:11.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:07:11.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:07:11.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:07:11.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:07:11.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:07:11.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:07:12.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:07:12.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:07:12.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:07:12.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:07:12.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:07:12.257 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:07:12.472 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:07:12.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:07:12.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:07:12.991 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:07:12.991 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:07:13.257 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:07:13.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:07:43.288 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:07:43.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:07:43.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:07:43.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:07:43.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:07:43.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:07:43.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-05-30T03:07:43.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:07:43.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-05-30T03:07:44.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:07:44.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:07:44.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:07:44.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-05-30T03:07:46.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-05-30T03:07:46.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:07:46.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:07:46.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:07:46.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:07:46.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:07:46.743 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:07:46.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:07:46.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:07:46.744 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:07:46.744 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:07:46.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:07:46.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:07:46.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:07:46.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:07:46.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:07:47.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:07:47.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:07:47.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:07:47.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:07:47.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:07:47.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:07:47.062 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:07:47.124 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:07:41
2026-05-30T03:07:47.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73581, datetime.datetime(2026, 5, 30, 3, 7, 41), datetime.datetime(2026, 5, 30, 3, 7, 41), 'salt', 11.28, 48.41, None, 20.78, 343.6, 10.49, 831.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:07:47.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:07:47.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:07:47.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:07:41, diff=6.131941s, valid=True
2026-05-30T03:07:47.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:07:47.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:07:47.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:08:12, diff=-24.864532s, valid=True
2026-05-30T03:07:47.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:07:47.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:07:47.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:07:36, diff=11.143729s, valid=True
2026-05-30T03:07:47.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:07:47.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:07:47.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:07:47.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:07:47.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:07:47.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:07:47.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:08:12, diff=-24.852497s, valid=True
2026-05-30T03:07:47.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:07:47.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:07:47.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:07:47.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035909.148368s, valid=True
2026-05-30T03:07:47.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:07:47.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:07:47.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:07:47.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:07:47.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:07:47.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:07:47.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:07:47.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:07:47.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:07:47.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:07:47.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:07:47.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:07:47.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:07:47.471 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:07:47.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:07:48.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:07:48.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:07:48.137 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:07:48.137 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:07:48.391 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:07:48.392 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:08:18.398 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:08:18.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:08:18.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:08:18.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:08:18.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:08:18.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:08:18.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-05-30T03:08:18.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:08:18.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T03:08:18.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:08:18.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:08:18.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:08:18.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-05-30T03:08:26.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-05-30T03:08:26.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:08:26.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:08:26.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:08:26.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:08:26.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:08:26.528 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:08:26.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:08:26.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:08:26.529 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:08:26.530 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:08:26.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:08:26.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:08:26.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:08:26.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:08:26.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:08:26.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:08:26.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:08:26.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:08:26.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:08:26.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:08:26.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:08:26.851 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:08:26.917 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:08:12
2026-05-30T03:08:26.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73582, datetime.datetime(2026, 5, 30, 3, 8, 12), datetime.datetime(2026, 5, 30, 3, 8, 11), 'salt', 11.15, 48.64, None, 21.42, 345.36, 10.41, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:08:26.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:08:26.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:08:26.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:08:11, diff=15.924939s, valid=True
2026-05-30T03:08:26.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:08:26.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:08:26.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:08:12, diff=14.928291s, valid=True
2026-05-30T03:08:26.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:08:26.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:08:26.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:08:07, diff=19.935746s, valid=True
2026-05-30T03:08:26.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:08:26.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:08:26.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:08:26.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:08:26.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:08:26.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:08:26.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:08:12, diff=14.939021s, valid=True
2026-05-30T03:08:26.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:08:26.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:08:26.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:08:26.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1035948.939729s, valid=True
2026-05-30T03:08:26.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:08:26.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:08:26.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:08:26.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:08:26.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:08:27.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:08:27.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:08:27.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:08:27.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:08:27.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:08:27.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:08:27.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:08:27.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:08:27.259 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:08:27.573 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:08:27.915 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:08:28.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:08:28.017 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:08:28.017 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:08:28.270 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:08:28.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:08:58.295 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:08:58.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:08:58.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:08:58.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:08:58.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:08:58.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:08:58.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-05-30T03:08:58.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:08:58.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-05-30T03:08:59.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:08:59.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:08:59.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:08:59.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-05-30T03:09:21.914 [ERROR] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] processing LCO all-sky image: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
2026-05-30T03:09:21.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:09:21.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:09:21.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:09:21.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:09:21.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:09:21.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:09:21.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:09:21.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:09:21.940 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:09:21.940 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:09:21.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:09:22.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:09:22.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:09:22.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:09:22.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:09:22.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:09:22.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:09:22.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:09:22.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:09:22.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:09:22.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:09:22.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:09:22.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:09:12
2026-05-30T03:09:22.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73584, datetime.datetime(2026, 5, 30, 3, 9, 12), datetime.datetime(2026, 5, 30, 3, 9, 11), 'salt', 11.15, 48.57, None, 19.48, 341.44, 10.43, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:09:22.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:09:22.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:09:22.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:09:11, diff=11.332366s, valid=True
2026-05-30T03:09:22.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:09:22.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:09:22.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:09:12, diff=10.335844s, valid=True
2026-05-30T03:09:22.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:09:22.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:09:22.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:09:10, diff=12.344077s, valid=True
2026-05-30T03:09:22.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:09:22.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:09:22.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:09:22.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:09:22.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:09:22.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:09:22.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:09:12, diff=10.347815s, valid=True
2026-05-30T03:09:22.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:09:22.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:09:22.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:09:22.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036004.348641s, valid=True
2026-05-30T03:09:22.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:09:22.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:09:22.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:09:22.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:09:22.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:09:22.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:09:22.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:09:22.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:09:22.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:09:22.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:09:22.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:09:22.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:09:22.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:09:22.671 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:09:22.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:09:23.230 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:09:23.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:09:23.333 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:09:23.333 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:09:23.523 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:09:23.523 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:09:53.541 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:09:53.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:09:53.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:09:53.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:09:53.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:09:54.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:09:54.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-05-30T03:09:54.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:09:54.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-05-30T03:09:54.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:09:54.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:09:54.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:09:54.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-05-30T03:09:56.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-05-30T03:09:56.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:09:56.657 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:09:56.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:09:56.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:09:56.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:09:56.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:09:56.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:09:56.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:09:56.675 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:09:56.675 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:09:56.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:09:56.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:09:56.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:09:56.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:09:56.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:09:56.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:09:56.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:09:56.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:09:56.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:09:56.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:09:56.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:09:56.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:09:57.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:09:42
2026-05-30T03:09:57.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73585, datetime.datetime(2026, 5, 30, 3, 9, 42), datetime.datetime(2026, 5, 30, 3, 9, 42), 'salt', 11.15, 48.8, None, 16.66, 2.38, 10.37, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:09:57.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:09:57.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:09:57.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:09:42, diff=15.061554s, valid=True
2026-05-30T03:09:57.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:09:57.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:09:57.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:10:12, diff=-14.934997s, valid=True
2026-05-30T03:09:57.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:09:57.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:09:57.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:09:42, diff=15.073081s, valid=True
2026-05-30T03:09:57.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:09:57.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:09:57.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:09:57.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:09:57.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:09:57.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:09:57.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:10:12, diff=-14.923289s, valid=True
2026-05-30T03:09:57.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:09:57.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:09:57.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:09:57.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036039.077497s, valid=True
2026-05-30T03:09:57.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:09:57.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:09:57.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:09:57.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:09:57.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:09:57.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:09:57.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:09:57.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:09:57.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:09:57.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:09:57.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:09:57.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:09:57.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:09:57.466 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:09:57.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:09:58.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:09:58.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:09:58.141 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:09:58.141 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:09:58.338 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:09:58.338 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:10:28.368 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:10:28.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:10:28.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:10:28.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:10:28.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:10:28.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:10:28.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-05-30T03:10:28.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:10: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-05-30T03:10:28.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:10:28.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:10:28.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:10:28.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-05-30T03:10:31.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T03:10:31.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:10:31.380 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:10:31.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:10:31.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:10:31.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:10:31.402 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:10:31.402 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:10:31.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:10:31.402 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:10:31.403 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:10:31.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:10:31.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:10:31.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:10:31.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:10:31.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:10:31.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:10:31.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:10:31.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:10:31.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:10:31.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:10:31.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:10:31.661 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:10:31.721 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:10:13
2026-05-30T03:10:31.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73586, datetime.datetime(2026, 5, 30, 3, 10, 13), datetime.datetime(2026, 5, 30, 3, 10, 12), 'salt', 11.15, 49.04, None, 17.61, 344.11, 10.3, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:10:31.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:10:31.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:10:31.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:10:12, diff=19.728585s, valid=True
2026-05-30T03:10:31.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:10:31.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:10:31.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:10:12, diff=19.731429s, valid=True
2026-05-30T03:10:31.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:10:31.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:10:31.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:10:05, diff=26.738157s, valid=True
2026-05-30T03:10:31.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:10:31.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:10:31.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:10:31.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:10:31.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:10:31.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:10:31.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:10:12, diff=19.741204s, valid=True
2026-05-30T03:10:31.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:10:31.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:10:31.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:10:31.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036073.74187s, valid=True
2026-05-30T03:10:31.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:10:31.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:10:31.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:10:31.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:10:31.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:10:31.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:10:31.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:10:31.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:10:31.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:10:31.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:10:31.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:10:31.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:10:32.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:10:32.073 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:10:32.288 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:10:32.651 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:10:32.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:10:32.751 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:10:32.751 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:10:32.943 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:10:32.943 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:11:02.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:11:02.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:11:02.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:11:03.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:11:03.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:11:03.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:11: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-05-30T03:11:03.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:11: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-05-30T03:11:03.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:11:03.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:11:03.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:11:03.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-05-30T03:12:12.730 [ERROR] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] processing LCO all-sky image: HTTPSConnectionPool(host='s3.us-west-2.amazonaws.com', port=443): Read timed out.
2026-05-30T03:12:12.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:12:12.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:12:12.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:12:12.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:12:12.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:12:12.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:12:12.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:12:12.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:12:12.765 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:12:12.765 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:12:12.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:12:12.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:12:12.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:12:12.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:12:12.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:12:13.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:12:13.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:12:13.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:12:13.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:12:13.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:12:13.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:12:13.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:12:13.149 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:11:43
2026-05-30T03:12:13.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73589, datetime.datetime(2026, 5, 30, 3, 11, 43), datetime.datetime(2026, 5, 30, 3, 11, 43), 'salt', 11.08, 48.9, None, 16.87, 345.89, 10.33, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:12:13.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:12:13.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:12:13.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:11:43, diff=30.156512s, valid=True
2026-05-30T03:12:13.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:12:13.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:12:13.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:12:12, diff=1.160059s, valid=True
2026-05-30T03:12:13.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:12:13.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:12:13.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:11:37, diff=36.168119s, valid=True
2026-05-30T03:12:13.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:12:13.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:12:13.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:12:13.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:12:13.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:12:13.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:12:13.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:12:12, diff=1.171672s, valid=True
2026-05-30T03:12:13.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:12:13.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:12:13.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:12:13.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036175.172449s, valid=True
2026-05-30T03:12:13.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:12:13.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:12:13.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:12:13.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:12:13.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:12:13.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:12:13.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:12:13.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:12:13.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:12:13.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:12:13.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:12:13.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:12:13.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:12:13.564 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:12:13.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:12:14.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:12:14.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:12:14.235 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:12:14.236 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:12:14.440 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:12:14.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:12:44.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:12:44.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:12:44.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:12:44.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:12:44.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:12:44.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:12:44.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-05-30T03:12:44.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:12:44.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-05-30T03:12:44.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:12:44.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:12:44.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:12:44.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-05-30T03:12:47.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T03:12:47.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:12:47.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:12:47.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:12:47.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:12:47.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:12:47.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:12:47.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:12:47.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:12:47.439 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:12:47.439 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:12:47.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:12:47.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:12:47.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:12:47.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:12:47.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:12:47.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:12:47.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:12:47.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:12:47.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:12:47.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:12:47.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:12:47.764 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:12:47.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:12:44
2026-05-30T03:12:47.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73591, datetime.datetime(2026, 5, 30, 3, 12, 44), datetime.datetime(2026, 5, 30, 3, 12, 43), 'salt', 11.08, 49.3, None, 20.54, 340.85, 10.22, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:12:47.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:12:47.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:12:47.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:12:43, diff=4.842554s, valid=True
2026-05-30T03:12:47.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:12:47.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:12:47.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:13:12, diff=-24.153931s, valid=True
2026-05-30T03:12:47.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:12:47.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:12:47.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:12:40, diff=7.85438s, valid=True
2026-05-30T03:12:47.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:12:47.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:12:47.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:12:47.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:12:47.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:12:47.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:12:47.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:13:12, diff=-24.14187s, valid=True
2026-05-30T03:12:47.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:12:47.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:12:47.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:12:47.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036209.858959s, valid=True
2026-05-30T03:12:47.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:12:47.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:12:47.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:12:47.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:12:47.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:12:47.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:12:47.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:12:47.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:12:47.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:12:47.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:12:48.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:12:48.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:12:48.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:12:48.184 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:12:48.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:12:48.744 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:12:48.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:12:48.845 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:12:48.845 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:12:49.118 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:12:49.118 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:13:19.146 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:13:19.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:13:19.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:13:19.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:13:19.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:13:19.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:13:19.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-05-30T03:13:19.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:13:19.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-05-30T03:13:19.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:13:19.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:13:19.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:13:19.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T03:13:22.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-05-30T03:13:22.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:13:22.454 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:13:22.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:13:22.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:13:22.471 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:13:22.472 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:13:22.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:13:22.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:13:22.473 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:13:22.473 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:13:22.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:13:22.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:13:22.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:13:22.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:13:22.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:13:22.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:13:22.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:13:22.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:13:22.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:13:22.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:13:22.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:13:22.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:13:22.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:13:14
2026-05-30T03:13:22.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73592, datetime.datetime(2026, 5, 30, 3, 13, 14), datetime.datetime(2026, 5, 30, 3, 13, 14), 'salt', 11.05, 48.87, None, 17.47, 343.48, 10.34, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:13:22.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:13:22.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:13:22.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:13:14, diff=8.901497s, valid=True
2026-05-30T03:13:22.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:13:22.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:13:22.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:13:12, diff=10.90437s, valid=True
2026-05-30T03:13:22.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:13:22.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:13:22.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:13:11, diff=11.91128s, valid=True
2026-05-30T03:13:22.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:13:22.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:13:22.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:13:22.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:13:22.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:13:22.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:13:22.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:13:12, diff=10.914398s, valid=True
2026-05-30T03:13:22.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:13:22.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:13:22.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:13:22.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036244.915096s, valid=True
2026-05-30T03:13:22.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:13:22.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:13:22.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:13:22.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:13:22.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:13:22.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:13:22.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:13:22.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:13:22.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:13:23.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:13:23.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:13:23.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:13:23.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:13:23.231 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:13:23.446 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:13:23.793 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:13:23.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:13:23.894 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:13:23.894 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:13:24.091 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:13:24.091 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:13:54.102 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:13:54.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:13:54.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:13:54.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:13:54.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:13:54.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:13:54.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-05-30T03:13:54.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:13:54.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-05-30T03:13:54.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:13:54.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:13:54.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:13:54.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-05-30T03:13:57.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-05-30T03:13:57.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:13:57.057 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:13:57.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:13:57.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:13:57.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:13:57.074 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:13:57.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:13:57.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:13:57.076 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:13:57.076 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:13:57.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:13:57.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:13:57.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:13:57.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:13:57.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:13:57.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:13:57.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:13:57.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:13:57.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:13:57.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:13:57.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:13:57.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:13:57.456 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:13:44
2026-05-30T03:13:57.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73593, datetime.datetime(2026, 5, 30, 3, 13, 44), datetime.datetime(2026, 5, 30, 3, 13, 44), 'salt', 11.11, 49.24, None, 19.2, 343.87, 10.23, 831.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:13:57.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:13:57.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:13:57.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:13:44, diff=13.464065s, valid=True
2026-05-30T03:13:57.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:13:57.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:13:57.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:14:12, diff=-14.532328s, valid=True
2026-05-30T03:13:57.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:13:57.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:13:57.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:13:43, diff=14.475841s, valid=True
2026-05-30T03:13:57.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:13:57.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:13:57.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:13:57.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:13:57.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:13:57.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:13:57.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:14:12, diff=-14.520435s, valid=True
2026-05-30T03:13:57.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:13:57.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:13:57.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:13:57.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036279.480381s, valid=True
2026-05-30T03:13:57.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:13:57.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:13:57.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:13:57.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:13:57.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:13:57.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:13:57.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:13:57.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:13:57.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:13:57.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:13:57.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:13:57.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:13:57.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:13:57.800 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:13:58.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:13:58.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:13:58.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:13:58.521 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:13:58.521 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:13:58.817 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:13:58.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:14:28.830 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:14:28.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:14:28.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:14:29.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:14:29.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:14:29.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:14:29.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-05-30T03:14:29.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:14:29.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-05-30T03:14:29.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:14:29.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:14:29.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:14:29.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-05-30T03:16: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-05-30T03:16:07.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:16:07.606 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:16:07.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:16:07.614 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:16:07.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:16:07.626 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:16:07.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:16:07.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:16:07.626 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:16:07.626 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:16:07.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:16:07.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:16:07.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:16:07.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:16:07.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:16:07.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:16:07.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:16:07.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:16:07.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:16:07.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:16:07.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:16:07.911 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:16:07.970 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:15:45
2026-05-30T03:16:07.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73597, datetime.datetime(2026, 5, 30, 3, 15, 45), datetime.datetime(2026, 5, 30, 3, 15, 45), 'salt', 10.95, 49.8, None, 14.93, 348.62, 10.07, 831.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:16:07.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:16:07.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:16:07.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:15:45, diff=22.978243s, valid=True
2026-05-30T03:16:07.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:16:07.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:16:07.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:16:12, diff=-4.018459s, valid=True
2026-05-30T03:16:07.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:16:07.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:16:07.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:15:38, diff=29.989408s, valid=True
2026-05-30T03:16:07.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:16:07.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:16:07.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:16:07.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:16:07.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:16:07.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:16:07.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:16:12, diff=-4.007079s, valid=True
2026-05-30T03:16:07.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:16:07.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:16:07.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:16:07.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036409.993688s, valid=True
2026-05-30T03:16:07.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:16:07.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:16:07.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:16:07.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:16:07.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:16:08.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:16:08.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:16:08.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:16:08.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:16:08.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:16:08.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:16:08.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:16:08.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:16:08.317 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:16:08.530 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:16:08.875 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:16:08.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:16:08.975 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:16:08.975 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:16:09.169 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:16:09.169 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:16:39.198 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:16:39.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:16:39.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:16:39.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:16:39.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:16:39.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:16:39.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-05-30T03:16:39.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:16:39.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-05-30T03:16:39.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:16:39.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:16:39.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:16:39.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-05-30T03:17:24.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-05-30T03:17:24.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:17:24.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:17:24.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:17:24.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:17:24.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:17:24.129 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:17:24.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:17:24.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:17:24.131 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:17:24.131 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:17:24.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:17:24.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:17:24.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:17:24.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:17:24.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:17:24.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:17:24.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:17:24.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:17:24.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:17:24.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:17:24.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:17:24.449 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:17:24.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:17:16
2026-05-30T03:17:24.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73600, datetime.datetime(2026, 5, 30, 3, 17, 16), datetime.datetime(2026, 5, 30, 3, 17, 16), 'salt', 10.81, 50.56, None, 16.2, 338.4, 9.84, 831.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:17:24.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:17:24.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:17:24.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:17:16, diff=8.517052s, valid=True
2026-05-30T03:17:24.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:17:24.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:17:24.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:17:12, diff=12.520549s, valid=True
2026-05-30T03:17:24.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:17:24.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:17:24.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:17:12, diff=12.528879s, valid=True
2026-05-30T03:17:24.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:17:24.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:17:24.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:17:24.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:17:24.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:17:24.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:17:24.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:17:12, diff=12.532633s, valid=True
2026-05-30T03:17:24.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:17:24.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:17:24.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:17:24.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036486.533448s, valid=True
2026-05-30T03:17:24.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:17:24.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:17:24.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:17:24.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:17:24.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:17:24.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:17:24.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:17:24.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:17:24.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:17:24.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:17:24.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:17:24.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:17:24.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:17:24.855 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:17:25.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:17:25.487 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:17:25.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:17:25.589 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:17:25.589 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:17:25.776 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:17:25.776 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:17:55.788 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:17:55.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:17:55.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:17:55.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:17:55.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:17:56.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:17:56.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-05-30T03:17:56.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:17:56.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-05-30T03:17:56.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:17:56.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:17:56.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:17:56.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-05-30T03:18:31.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-05-30T03:18:31.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:18:31.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:18:31.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:18:31.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:18:31.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:18:31.272 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:18:31.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:18:31.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:18:31.273 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:18:31.273 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:18:31.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:18:31.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:18:31.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:18:31.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:18:31.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:18:31.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:18:31.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:18:31.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:18:31.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:18:31.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:18:31.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:18:31.583 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:18:31.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:18:17
2026-05-30T03:18:31.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73602, datetime.datetime(2026, 5, 30, 3, 18, 17), datetime.datetime(2026, 5, 30, 3, 18, 16), 'salt', 10.75, 50.66, None, 15.99, 343.8, 9.81, 832.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:18:31.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:18:31.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:18:31.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:18:16, diff=15.649848s, valid=True
2026-05-30T03:18:31.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:18:31.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:18:31.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:18:12, diff=19.652761s, valid=True
2026-05-30T03:18:31.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:18:31.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:18:31.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:18:15, diff=16.659599s, valid=True
2026-05-30T03:18:31.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:18:31.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:18:31.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:18:31.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:18:31.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:18:31.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:18:31.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:18:12, diff=19.662692s, valid=True
2026-05-30T03:18:31.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:18:31.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:18:31.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:18:31.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036553.663372s, valid=True
2026-05-30T03:18:31.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:18:31.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:18:31.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:18:31.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:18:31.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:18:31.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:18:31.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:18:31.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:18:31.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:18:31.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:18:31.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:18:31.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:18:31.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:18:31.984 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:18:32.215 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:18:32.661 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:18:32.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:18:32.763 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:18:32.763 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:18:35.050 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:18:35.050 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:19:05.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:19:05.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:19:05.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:19:06.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:19:06.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:19:06.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:19:06.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-05-30T03:19:06.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:19:06.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-05-30T03:19:06.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:19:06.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:19:06.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:19:06.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T03:20:32.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-05-30T03:20:32.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:20:32.955 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:20:32.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:20:32.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:20:32.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:20:32.982 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:20:32.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:20:32.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:20:32.983 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:20:32.984 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:20:32.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:20:33.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:20:33.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:20:33.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:20:33.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:20:33.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:20:33.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:20:33.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:20:33.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:20:33.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:20:33.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:20:33.325 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:20:33.389 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:20:18
2026-05-30T03:20:33.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73606, datetime.datetime(2026, 5, 30, 3, 20, 18), datetime.datetime(2026, 5, 30, 3, 20, 17), 'salt', 10.91, 50.0, None, 14.26, 332.75, 10.0, 831.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:20:33.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:20:33.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:20:33.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:20:17, diff=16.397405s, valid=True
2026-05-30T03:20:33.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:20:33.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:20:33.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:20:12, diff=21.400899s, valid=True
2026-05-30T03:20:33.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:20:33.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:20:33.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:20:11, diff=22.409128s, valid=True
2026-05-30T03:20:33.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:20:33.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:20:33.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:20:33.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:20:33.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:20:33.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:20:33.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:20:12, diff=21.412936s, valid=True
2026-05-30T03:20:33.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:20:33.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:20:33.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:20:33.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036675.413773s, valid=True
2026-05-30T03:20:33.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:20:33.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:20:33.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:20:33.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:20:33.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:20:33.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:20:33.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:20:33.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:20:33.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:20:33.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:20:33.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:20:33.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:20:33.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:20:33.807 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:20:34.019 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:20:34.364 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:20:34.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:20:34.463 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:20:34.463 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:20:34.716 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:20:34.716 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:21:04.746 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:21:04.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:21:04.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:21:04.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:21:04.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:21:05.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:21:05.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-05-30T03:21:05.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:21:05.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-05-30T03:21:05.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:21:05.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:21:05.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:21:05.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-05-30T03:21:07.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T03:21:07.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:21:07.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:21:07.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:21:07.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:21:07.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:21:07.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:21:07.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:21:07.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:21:07.550 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:21:07.550 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:21:07.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:21:07.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:21:07.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:21:07.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:21:07.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:21:07.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:21:07.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:21:07.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:21:07.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:21:07.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:21:07.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:21:07.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:21:07.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:20:48
2026-05-30T03:21:07.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73607, datetime.datetime(2026, 5, 30, 3, 20, 48), datetime.datetime(2026, 5, 30, 3, 20, 47), 'salt', 10.81, 50.13, None, 11.19, 337.86, 9.96, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:21:07.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:21:07.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:21:07.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:20:47, diff=20.960793s, valid=True
2026-05-30T03:21:07.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:21:07.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:21:07.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:21:12, diff=-4.035684s, valid=True
2026-05-30T03:21:07.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:21:07.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:21:07.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:20:42, diff=25.97264s, valid=True
2026-05-30T03:21:07.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:21:07.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:21:07.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:21:07.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:21:07.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:21:07.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:21:07.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:21:12, diff=-4.023548s, valid=True
2026-05-30T03:21:07.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:21:07.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:21:07.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:21:07.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036709.977304s, valid=True
2026-05-30T03:21:07.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:21:07.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:21:07.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:21:07.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:21:07.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:21:08.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:21:08.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:21:08.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:21:08.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:21:08.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:21:08.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:21:08.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:21:08.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:21:08.300 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:21:08.514 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:21:08.860 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:21:08.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:21:08.960 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:21:08.961 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:21:09.147 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:21:09.148 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:21:39.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:21:39.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:21:39.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:21:39.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:21:39.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:21:39.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:21:39.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-05-30T03:21:39.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:21:39.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-05-30T03:21:39.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:21:39.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:21:39.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:21:39.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-05-30T03:21:42.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-05-30T03:21:42.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:21:42.103 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:21:42.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:21:42.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:21:42.126 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:21:42.126 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:21:42.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:21:42.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:21:42.128 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:21:42.128 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:21:42.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:21:42.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:21:42.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:21:42.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:21:42.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:21:42.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:21:42.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:21:42.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:21:42.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:21:42.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:21:42.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:21:42.460 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:21:42.524 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:21:18
2026-05-30T03:21:42.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73608, datetime.datetime(2026, 5, 30, 3, 21, 18), datetime.datetime(2026, 5, 30, 3, 21, 18), 'salt', 10.88, 50.36, None, 10.2, 344.53, 9.9, 831.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:21:42.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:21:42.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:21:42.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:21:18, diff=24.532206s, valid=True
2026-05-30T03:21:42.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:21:42.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:21:42.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:21:12, diff=30.53577s, valid=True
2026-05-30T03:21:42.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:21:42.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:21:42.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:21:13, diff=29.544092s, valid=True
2026-05-30T03:21:42.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:21:42.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:21:42.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:21:42.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:21:42.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:21:42.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:21:42.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:21:12, diff=30.547839s, valid=True
2026-05-30T03:21:42.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:21:42.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:21:42.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:21:42.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036744.548697s, valid=True
2026-05-30T03:21:42.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:21:42.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:21:42.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:21:42.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:21:42.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:21:42.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:21:42.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:21:42.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:21:42.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:21:42.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:21:42.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:21:42.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:21:42.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:21:42.937 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:21:43.149 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:21:43.494 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:21:43.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:21:43.596 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:21:43.596 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:21:43.787 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:21:43.788 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:22:13.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:22:13.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:22:13.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:22:14.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:22:14.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:22:14.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:22: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-05-30T03:22:14.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:22:14.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-05-30T03:22:14.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:22:14.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:22:14.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:22:14.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-05-30T03:22:16.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T03:22:16.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:22:16.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:22:16.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:22:16.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:22:16.961 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:22:16.961 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:22:16.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:22:16.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:22:16.962 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:22:16.963 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:22:16.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:22:17.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:22:17.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:22:17.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:22:17.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:22:17.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:22:17.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:22:17.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:22:17.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:22:17.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:22:17.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:22:17.307 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:22:17.366 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:21:48
2026-05-30T03:22:17.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73609, datetime.datetime(2026, 5, 30, 3, 21, 48), datetime.datetime(2026, 5, 30, 3, 21, 48), 'salt', 10.81, 50.76, None, 15.81, 338.36, 9.79, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:22:17.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:22:17.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:22:17.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:21:48, diff=29.373898s, valid=True
2026-05-30T03:22:17.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:22:17.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:22:17.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:22:12, diff=5.377201s, valid=True
2026-05-30T03:22:17.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:22:17.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:22:17.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:21:45, diff=32.385052s, valid=True
2026-05-30T03:22:17.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:22:17.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:22:17.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:22:17.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:22:17.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:22:17.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:22:17.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:22:12, diff=5.390849s, valid=True
2026-05-30T03:22:17.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:22:17.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:22:17.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:22:17.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036779.392404s, valid=True
2026-05-30T03:22:17.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:22:17.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:22:17.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:22:17.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:22:17.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:22:17.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:22:17.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:22:17.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:22:17.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:22:17.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:22:17.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:22:17.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:22:17.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:22:17.714 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:22:17.926 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:22:18.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:22:18.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:22:18.369 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:22:18.369 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:22:18.560 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:22:18.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:22:48.564 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:22:48.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:22:48.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:22:48.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:22:48.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:22:48.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:22:48.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-05-30T03:22:48.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:22:48.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-05-30T03:22:48.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:22:48.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:22:48.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:22:48.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-05-30T03:23:00.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-05-30T03:23:00.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:23:00.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:23:00.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:23:00.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:23:00.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:23:00.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:23:00.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:23:00.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:23:00.321 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:23:00.321 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:23:00.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:23:00.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:23:00.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:23:00.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:23:00.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:23:00.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:23:00.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:23:00.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:23:00.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:23:00.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:23:00.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:23:00.651 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:23:00.713 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:22:49
2026-05-30T03:23:00.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73611, datetime.datetime(2026, 5, 30, 3, 22, 49), datetime.datetime(2026, 5, 30, 3, 22, 48), 'salt', 10.61, 50.93, None, 14.82, 339.18, 9.73, 831.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:23:00.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:23:00.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:23:00.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:22:48, diff=12.720787s, valid=True
2026-05-30T03:23:00.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:23:00.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:23:00.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:23:12, diff=-11.275739s, valid=True
2026-05-30T03:23:00.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:23:00.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:23:00.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:22:48, diff=12.732861s, valid=True
2026-05-30T03:23:00.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:23:00.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:23:00.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:23:00.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:23:00.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:23:00.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:23:00.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:23:12, diff=-11.263395s, valid=True
2026-05-30T03:23:00.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:23:00.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:23:00.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:23:00.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036822.737487s, valid=True
2026-05-30T03:23:00.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:23:00.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:23:00.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:23:00.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:23:00.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:23:00.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:23:00.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:23:00.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:23:00.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:23:00.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:23:01.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:23:01.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:23:01.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Seeing data
2026-05-30T03:23:01.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:23:01.516 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:23:01.708 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:23:02.040 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:23:02.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:23:02.128 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:23:02.128 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:23:02.322 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:23:02.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:23:32.336 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:23:32.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:23:32.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:23:32.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:23:32.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:23:32.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:23:32.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-05-30T03:23:32.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:23:32.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-05-30T03:23:32.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:23:32.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:23:32.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:23:32.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T03:24:11.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-05-30T03:24:11.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:24:11.515 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:24:11.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:24:11.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:24:11.539 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:24:11.540 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:24:11.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:24:11.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:24:11.541 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:24:11.541 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:24:11.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:24:11.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:24:11.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:24:11.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:24:11.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:24:11.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:24:11.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:24:11.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:24:11.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:24:11.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:24:11.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:24:11.859 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:24:11.921 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:23:49
2026-05-30T03:24:11.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73613, datetime.datetime(2026, 5, 30, 3, 23, 49), datetime.datetime(2026, 5, 30, 3, 23, 49), 'salt', 10.61, 51.19, None, 12.18, 346.64, 9.65, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:24:11.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:24:11.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:24:11.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:23:49, diff=22.929338s, valid=True
2026-05-30T03:24:11.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:24:11.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:24:11.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:24:12, diff=-0.06725s, valid=True
2026-05-30T03:24:11.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:24:11.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:24:11.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:23:42, diff=29.940748s, valid=True
2026-05-30T03:24:11.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:24:11.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:24:11.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:24:11.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:24:11.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:24:11.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:24:11.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:24:12, diff=-0.055439s, valid=True
2026-05-30T03:24:11.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:24:11.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:24:11.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:24:11.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036893.945432s, valid=True
2026-05-30T03:24:11.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:24:11.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:24:11.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:24:11.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:24:11.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:24:12.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:24:12.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:24:12.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:24:12.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:24:12.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:24:12.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:24:12.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:24:12.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Seeing data
2026-05-30T03:24:12.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:24:12.565 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:24:12.739 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:24:13.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:24:13.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:24:13.141 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:24:13.141 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:24:13.334 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:24:13.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:24:43.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:24:43.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:24:43.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:24:43.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:24:43.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:24:44.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:24:44.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-05-30T03:24:44.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:24:44.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-05-30T03:24:44.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:24:44.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:24:44.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:24:44.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-05-30T03:24:47.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-05-30T03:24:47.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:24:47.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:24:47.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:24:47.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:24:47.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:24:47.199 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:24:47.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:24:47.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:24:47.200 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:24:47.200 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:24:47.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:24:47.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:24:47.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:24:47.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:24:47.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:24:47.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:24:47.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:24:47.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:24:47.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:24:47.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:24:47.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:24:47.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:24:47.581 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:24:20
2026-05-30T03:24:47.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73614, datetime.datetime(2026, 5, 30, 3, 24, 20), datetime.datetime(2026, 5, 30, 3, 24, 19), 'salt', 10.61, 51.36, None, 15.17, 355.28, 9.61, 831.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:24:47.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:24:47.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:24:47.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:24:19, diff=28.588429s, valid=True
2026-05-30T03:24:47.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:24:47.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:24:47.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:24:12, diff=35.591806s, valid=True
2026-05-30T03:24:47.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:24:47.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:24:47.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:24:13, diff=34.599735s, valid=True
2026-05-30T03:24:47.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:24:47.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:24:47.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:24:47.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:24:47.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:24:47.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:24:47.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:24:12, diff=35.60334s, valid=True
2026-05-30T03:24:47.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:24:47.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:24:47.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:24:47.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036929.604134s, valid=True
2026-05-30T03:24:47.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:24:47.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:24:47.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:24:47.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:24:47.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:24:47.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:24:47.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:24:47.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:24:47.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:24:47.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:24:47.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:24:47.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:24:47.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Seeing data
2026-05-30T03:24:48.096 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:24:48.231 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:24:48.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:24:48.722 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:24:48.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:24:48.808 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:24:48.808 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:24:48.994 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:24:48.994 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:25:19.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:25:19.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03: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-05-30T03:25:19.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:25:19.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:25:19.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:25:19.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-05-30T03:25:19.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:25:19.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-05-30T03:25:19.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:25:19.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:25:19.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:25:19.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-05-30T03:25:21.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T03:25:21.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:25:21.998 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:25:21.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:25:22.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:25:22.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:25:22.024 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:25:22.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:25:22.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:25:22.025 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:25:22.025 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:25:22.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:25:22.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:25:22.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:25:22.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:25:22.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:25:22.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:25:22.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:25:22.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:25:22.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:25:22.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:25:22.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:25:22.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:25:22.409 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:25:20
2026-05-30T03:25:22.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73616, datetime.datetime(2026, 5, 30, 3, 25, 20), datetime.datetime(2026, 5, 30, 3, 25, 20), 'salt', 10.61, 50.89, None, 14.86, 351.81, 9.73, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:25:22.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:25:22.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:25:22.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:25:20, diff=2.416368s, valid=True
2026-05-30T03:25:22.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:25:22.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:25:22.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:25:12, diff=10.419755s, valid=True
2026-05-30T03:25:22.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:25:22.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:25:22.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:25:14, diff=8.427769s, valid=True
2026-05-30T03:25:22.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:25:22.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:25:22.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:25:22.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:25:22.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:25:22.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:25:22.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:25:12, diff=10.431336s, valid=True
2026-05-30T03:25:22.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:25:22.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:25:22.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:25:22.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036964.432133s, valid=True
2026-05-30T03:25:22.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:25:22.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:25:22.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:25:22.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:25:22.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:25:22.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:25:22.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:25:22.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:25:22.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:25:22.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:25:22.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:25:22.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:25:22.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Seeing data
2026-05-30T03:25:22.981 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:25:23.107 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:25:23.284 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:25:23.600 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:25:23.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:25:23.689 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:25:23.689 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:25:23.875 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:25:23.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:25:53.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:25:53.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:25:53.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:25:54.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:25:54.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:25:54.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:25:54.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-05-30T03:25:54.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:25:54.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-05-30T03:25:54.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:25:54.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:25:54.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:25:54.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-05-30T03:25:57.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-05-30T03:25:57.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:25:57.051 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:25:57.051 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:25:57.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:25:57.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:25:57.074 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:25:57.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:25:57.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:25:57.075 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:25:57.076 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:25:57.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:25:57.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:25:57.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:25:57.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:25:57.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:25:57.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:25:57.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:25:57.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:25:57.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:25:57.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:25:57.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:25:57.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:25:57.452 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:25:50
2026-05-30T03:25:57.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73617, datetime.datetime(2026, 5, 30, 3, 25, 50), datetime.datetime(2026, 5, 30, 3, 25, 50), 'salt', 10.65, 50.73, None, 13.09, 346.6, 9.79, 831.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:25:57.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:25:57.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:25:57.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:25:50, diff=7.458973s, valid=True
2026-05-30T03:25:57.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:25:57.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:25:57.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:26:12, diff=-14.537676s, valid=True
2026-05-30T03:25:57.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:25:57.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:25:57.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:25:46, diff=11.470179s, valid=True
2026-05-30T03:25:57.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:25:57.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:25:57.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:25:57.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:25:57.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:25:57.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:25:57.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:26:12, diff=-14.526211s, valid=True
2026-05-30T03:25:57.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:25:57.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:25:57.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:25:57.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1036999.474546s, valid=True
2026-05-30T03:25:57.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:25:57.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:25:57.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:25:57.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:25:57.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:25:57.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:25:57.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:25:57.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:25:57.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:25:57.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:25:57.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:25:57.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:25:57.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:25:57.792 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:25:58.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:25:58.377 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:25:58.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:25:58.490 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:25:58.490 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:25:58.671 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:25:58.671 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:26:28.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:26:28.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:26:28.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:26:28.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:26:28.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:26:29.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:26:29.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-05-30T03:26:29.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:26:29.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-05-30T03:26:29.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:26:29.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:26:29.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:26:29.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-05-30T03:27: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-05-30T03:27:19.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:27:19.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:27:19.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:27:19.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:27:19.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:27:19.957 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:27:19.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:27:19.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:27:19.958 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:27:19.958 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:27:19.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:27:20.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:27:20.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:27:20.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:27:20.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:27:20.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:27:20.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:27:20.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:27:20.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:27:20.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:27:20.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:27:20.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:27:20.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:26:52
2026-05-30T03:27:20.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73619, datetime.datetime(2026, 5, 30, 3, 26, 52), datetime.datetime(2026, 5, 30, 3, 26, 51), 'salt', 10.65, 50.66, None, 14.05, 332.16, 9.81, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:27:20.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:27:20.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:27:20.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:26:51, diff=29.298485s, valid=True
2026-05-30T03:27:20.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:27:20.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:27:20.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:27:12, diff=8.301732s, valid=True
2026-05-30T03:27:20.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:27:20.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:27:20.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:26:49, diff=31.309304s, valid=True
2026-05-30T03:27:20.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:27:20.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:27:20.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:27:20.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:27:20.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:27:20.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:27:20.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:27:12, diff=8.312771s, valid=True
2026-05-30T03:27:20.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:27:20.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:27:20.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:27:20.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037082.313519s, valid=True
2026-05-30T03:27:20.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:27:20.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:27:20.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:27:20.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:27:20.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:27:20.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:27:20.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:27:20.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:27:20.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:27:20.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:27:20.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:27:20.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:27:20.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:27:20.703 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:27:20.916 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:27:21.263 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:27:21.363 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:27:21.363 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:27:21.363 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:27:21.545 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:27:21.545 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:27:51.558 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:27:51.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:27:51.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:27:51.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:27:51.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:27:52.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:27:52.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-05-30T03:27:52.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:27:52.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-05-30T03:27:52.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:27:52.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:27:52.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:27:52.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-05-30T03:27:54.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-05-30T03:27:54.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:27:54.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:27:54.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:27:54.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:27:54.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:27:54.906 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:27:54.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:27:54.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:27:54.907 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:27:54.907 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:27:54.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:27:55.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:27:55.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:27:55.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:27:55.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:27:55.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:27:55.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:27:55.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:27:55.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:27:55.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:27:55.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:27:55.234 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:27:55.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:27:52
2026-05-30T03:27:55.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73621, datetime.datetime(2026, 5, 30, 3, 27, 52), datetime.datetime(2026, 5, 30, 3, 27, 52), 'salt', 10.61, 50.63, None, 14.96, 321.06, 9.81, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:27:55.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:27:55.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:27:55.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:27:52, diff=3.30584s, valid=True
2026-05-30T03:27:55.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:27:55.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:27:55.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:28:12, diff=-16.69064s, valid=True
2026-05-30T03:27:55.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:27:55.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:27:55.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:27:52, diff=3.317691s, valid=True
2026-05-30T03:27:55.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:27:55.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:27:55.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:27:55.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:27:55.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:27:55.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:27:55.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:28:12, diff=-16.678541s, valid=True
2026-05-30T03:27:55.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:27:55.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:27:55.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:27:55.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037117.322303s, valid=True
2026-05-30T03:27:55.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:27:55.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:27:55.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:27:55.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:27:55.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:27:55.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:27:55.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:27:55.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:27:55.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:27:55.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:27:55.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:27:55.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:27:55.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:27:55.644 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:27:55.855 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:27:56.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:27:56.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:27:56.297 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:27:56.297 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:27:56.487 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:27:56.487 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:28:26.517 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:28:26.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:28:26.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:28:26.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:28:26.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:28:27.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:28:27.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-05-30T03:28:27.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:28:27.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-05-30T03:28:27.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:28:27.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:28:27.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:28:27.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T03:28:40.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-05-30T03:28:40.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:28:40.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:28:40.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:28:40.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:28:40.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:28:40.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:28:40.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:28:40.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:28:40.036 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:28:40.036 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:28:40.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:28:40.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:28:40.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:28:40.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:28:40.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:28:40.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:28:40.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:28:40.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:28:40.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:28:40.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:28:40.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:28:40.305 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:28:40.366 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:28:23
2026-05-30T03:28:40.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73622, datetime.datetime(2026, 5, 30, 3, 28, 23), datetime.datetime(2026, 5, 30, 3, 28, 22), 'salt', 10.61, 50.86, None, 13.02, 353.61, 9.74, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:28:40.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:28:40.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:28:40.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:28:22, diff=18.373721s, valid=True
2026-05-30T03:28:40.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:28:40.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:28:40.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:28:12, diff=28.376901s, valid=True
2026-05-30T03:28:40.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:28:40.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:28:40.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:28:14, diff=26.384513s, valid=True
2026-05-30T03:28:40.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:28:40.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:28:40.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:28:40.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:28:40.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:28:40.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:28:40.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:28:12, diff=28.38792s, valid=True
2026-05-30T03:28:40.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:28:40.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:28:40.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:28:40.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037162.38868s, valid=True
2026-05-30T03:28:40.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:28:40.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:28:40.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:28:40.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:28:40.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:28:40.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:28:40.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:28:40.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:28:40.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:28:40.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:28:40.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:28:40.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:28:40.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:28:40.774 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:28:40.988 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:28:41.330 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:28:41.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:28:41.432 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:28:41.432 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:28:41.613 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:28:41.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:29:11.644 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:29:11.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:29:11.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:29:11.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:29:11.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:29:12.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:29:12.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-05-30T03:29:12.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:29:12.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-05-30T03:29:12.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:29:12.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:29:12.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:29:12.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-05-30T03:29:15.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-05-30T03:29:15.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:29:15.812 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:29:15.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:29:15.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:29:15.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:29:15.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:29:15.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:29:15.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:29:15.833 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:29:15.833 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:29:15.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:29:15.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:29:15.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:29:15.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:29:15.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:29:16.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:29:16.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:29:16.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:29:16.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:29:16.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:29:16.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:29:16.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:29:16.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:28:53
2026-05-30T03:29:16.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73623, datetime.datetime(2026, 5, 30, 3, 28, 53), datetime.datetime(2026, 5, 30, 3, 28, 53), 'salt', 10.55, 50.66, None, 14.33, 355.33, 9.8, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:29:16.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:29:16.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:29:16.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:28:53, diff=23.154264s, valid=True
2026-05-30T03:29:16.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:29:16.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:29:16.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:29:12, diff=4.157444s, valid=True
2026-05-30T03:29:16.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:29:16.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:29:16.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:28:45, diff=31.164923s, valid=True
2026-05-30T03:29:16.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:29:16.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:29:16.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:29:16.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:29:16.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:29:16.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:29:16.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:29:12, diff=4.168284s, valid=True
2026-05-30T03:29:16.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:29:16.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:29:16.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:29:16.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037198.16903s, valid=True
2026-05-30T03:29:16.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:29:16.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:29:16.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:29:16.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:29:16.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:29:16.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:29:16.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:29:16.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:29:16.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:29:16.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:29:16.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:29:16.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:29:16.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:29:16.487 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:29:16.698 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:29:17.040 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:29:17.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:29:17.140 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:29:17.140 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:29:17.372 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:29:17.372 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:29:47.402 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:29:47.402 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:29:47.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:29:47.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:29:47.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:29:47.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:29:47.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-05-30T03:29:47.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:29:47.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-05-30T03:29:47.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:29:47.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:29:47.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:29:47.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-05-30T03:29:51.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-05-30T03:29:51.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:29:51.582 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:29:51.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:29:51.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:29:51.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:29:51.605 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:29:51.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:29:51.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:29:51.606 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:29:51.606 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:29:51.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:29:51.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:29:51.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:29:51.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:29:51.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:29:51.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:29:51.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:29:51.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:29:51.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:29:51.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:29:51.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:29:51.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:29:51.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:29:23
2026-05-30T03:29:51.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73624, datetime.datetime(2026, 5, 30, 3, 29, 23), datetime.datetime(2026, 5, 30, 3, 29, 23), 'salt', 10.65, 50.3, None, 13.48, 337.35, 9.91, 831.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:29:51.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:29:51.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:29:51.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:29:23, diff=28.999883s, valid=True
2026-05-30T03:29:52.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:29:52.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:29:52.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:29:12, diff=40.003408s, valid=True
2026-05-30T03:29:52.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:29:52.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:29:52.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:29:15, diff=37.011871s, valid=True
2026-05-30T03:29:52.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:29:52.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:29:52.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:29:52.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:29:52.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:29:52.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:29:52.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:29:12, diff=40.015686s, valid=True
2026-05-30T03:29:52.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:29:52.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:29:52.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:29:52.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037234.016497s, valid=True
2026-05-30T03:29:52.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:29:52.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:29:52.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:29:52.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:29:52.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:29:52.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:29:52.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:29:52.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:29:52.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:29:52.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:29:52.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:29:52.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:29:52.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:29:52.336 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:29:52.548 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:29:52.888 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:29:52.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:29:52.984 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:29:52.984 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:29:53.171 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:29:53.171 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:30:23.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:30:23.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:30:23.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:30:23.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:30:23.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:30:23.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:30:23.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-05-30T03:30:23.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:30:23.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-05-30T03:30:23.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:30:23.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:30:23.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:30:23.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-05-30T03:30:29.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-05-30T03:30:29.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:30:29.412 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:30:29.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:30:29.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:30:29.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:30:29.436 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:30:29.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:30:29.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:30:29.437 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:30:29.437 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:30:29.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:30:29.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:30:29.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:30:29.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:30:29.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:30:29.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:30:29.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:30:29.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:30:29.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:30:29.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:30:29.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:30:29.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:30:29.761 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:30:24
2026-05-30T03:30:29.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73626, datetime.datetime(2026, 5, 30, 3, 30, 24), datetime.datetime(2026, 5, 30, 3, 30, 23), 'salt', 10.65, 50.1, None, 15.03, 339.46, 9.96, 831.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:30:29.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:30:29.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:30:29.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:30:23, diff=6.767579s, valid=True
2026-05-30T03:30:29.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:30:29.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:30:29.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:30:12, diff=17.770418s, valid=True
2026-05-30T03:30:29.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:30:29.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:30:29.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:30:18, diff=11.777068s, valid=True
2026-05-30T03:30:29.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:30:29.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:30:29.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:30:29.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:30:29.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:30:29.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:30:29.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:30:12, diff=17.780149s, valid=True
2026-05-30T03:30:29.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:30:29.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:30:29.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:30:29.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037271.780822s, valid=True
2026-05-30T03:30:29.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:30:29.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:30:29.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:30:29.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:30:29.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:30:29.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:30:29.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:30:29.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:30:29.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:30:29.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:30:29.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:30:30.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:30:30.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:30:30.118 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:30:30.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:30:30.675 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:30:30.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:30:30.777 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:30:30.777 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:30:31.052 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:30:31.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:31:01.076 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:31:01.077 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:31:01.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:31:01.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:31:01.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:31:01.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:31:01.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-05-30T03:31:01.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:31:01.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-05-30T03:31:01.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:31:01.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:31:01.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:31:01.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-05-30T03:31:04.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-05-30T03:31:04.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:31:04.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:31:04.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:31:04.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:31:04.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:31:04.790 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:31:04.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:31:04.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:31:04.791 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:31:04.791 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:31:04.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:31:04.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:31:04.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:31:05.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:31:05.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:31:05.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:31:05.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:31:05.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:31:05.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:31:05.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:31:05.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:31:05.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:31:05.160 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:30:54
2026-05-30T03:31:05.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73627, datetime.datetime(2026, 5, 30, 3, 30, 54), datetime.datetime(2026, 5, 30, 3, 30, 54), 'salt', 10.71, 49.93, None, 16.73, 343.19, 10.01, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:31:05.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:31:05.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:31:05.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:30:54, diff=11.166699s, valid=True
2026-05-30T03:31:05.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:31:05.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:31:05.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:31:12, diff=-6.830501s, valid=True
2026-05-30T03:31:05.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:31:05.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:31:05.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:30:50, diff=15.17621s, valid=True
2026-05-30T03:31:05.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:31:05.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:31:05.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:31:05.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:31:05.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:31:05.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:31:05.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:31:12, diff=-6.820726s, valid=True
2026-05-30T03:31:05.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:31:05.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:31:05.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:31:05.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037307.179967s, valid=True
2026-05-30T03:31:05.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:31:05.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:31:05.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:31:05.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:31:05.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:31:05.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:31:05.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:31:05.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:31:05.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:31:05.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:31:05.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:31:05.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:31:05.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:31:05.502 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:31:05.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:31:06.066 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:31:06.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:31:06.167 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:31:06.167 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:31:06.419 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:31:06.419 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:31:36.449 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:31:36.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:31:36.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:31:36.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:31:36.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:31:37.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:31:37.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-05-30T03:31:37.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:31:37.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-05-30T03:31:37.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:31:37.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:31:37.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:31:37.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-05-30T03:32:21.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-05-30T03:32:21.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:32:21.978 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:32:21.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:32:21.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:32:22.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:32:22.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:32:22.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:32:22.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:32:22.002 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:32:22.003 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:32:22.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:32:22.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:32:22.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:32:22.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:32:22.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:32:22.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:32:22.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:32:22.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:32:22.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:32:22.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:32:22.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:32:22.316 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:32:22.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:31:55
2026-05-30T03:32:22.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73629, datetime.datetime(2026, 5, 30, 3, 31, 55), datetime.datetime(2026, 5, 30, 3, 31, 54), 'salt', 10.75, 49.6, None, 16.55, 340.51, 10.11, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:32:22.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:32:22.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:32:22.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:31:54, diff=28.386275s, valid=True
2026-05-30T03:32:22.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:32:22.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:32:22.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:32:12, diff=10.389816s, valid=True
2026-05-30T03:32:22.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:32:22.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:32:22.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:31:52, diff=30.398254s, valid=True
2026-05-30T03:32:22.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:32:22.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:32:22.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:32:22.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:32:22.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:32:22.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:32:22.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:32:12, diff=10.402059s, valid=True
2026-05-30T03:32:22.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:32:22.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:32:22.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:32:22.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037384.402896s, valid=True
2026-05-30T03:32:22.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:32:22.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:32:22.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:32:22.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:32:22.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:32:22.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:32:22.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:32:22.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:32:22.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:32:22.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:32:22.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:32:22.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:32:22.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:32:22.723 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:32:22.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:32:23.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:32:23.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:32:23.433 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:32:23.433 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:32:23.629 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:32:23.629 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:32:53.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:32:53.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:32:53.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:32:53.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:32:53.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:32:54.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:32:54.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-05-30T03:32:54.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:32:54.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-05-30T03:32:54.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:32:54.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:32:54.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:32:54.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-05-30T03:32:57.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-05-30T03:32:57.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:32:57.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:32:57.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:32:57.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:32:57.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:32:57.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:32:57.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:32:57.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:32:57.111 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:32:57.111 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:32:57.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:32:57.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:32:57.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:32:57.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:32:57.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:32:57.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:32:57.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:32:57.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:32:57.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:32:57.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:32:57.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:32:57.426 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:32:57.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:32:55
2026-05-30T03:32:57.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73631, datetime.datetime(2026, 5, 30, 3, 32, 55), datetime.datetime(2026, 5, 30, 3, 32, 55), 'salt', 10.78, 49.5, None, 15.49, 337.7, 10.14, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:32:57.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:32:57.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:32:57.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:32:55, diff=2.495304s, valid=True
2026-05-30T03:32:57.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:32:57.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:32:57.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:33:12, diff=-14.501315s, valid=True
2026-05-30T03:32:57.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:32:57.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:32:57.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:32:47, diff=10.506726s, valid=True
2026-05-30T03:32:57.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:32:57.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:32:57.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:32:57.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:32:57.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:32:57.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:32:57.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:33:12, diff=-14.489651s, valid=True
2026-05-30T03:32:57.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:32:57.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:32:57.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:32:57.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037419.511157s, valid=True
2026-05-30T03:32:57.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:32:57.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:32:57.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:32:57.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:32:57.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:32:57.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:32:57.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:32:57.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:32:57.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:32:57.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:32:57.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:32:57.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:32:57.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:32:57.831 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:32:58.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:32:58.388 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:32:58.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:32:58.490 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:32:58.490 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:32:58.682 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:32:58.682 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:33:28.712 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:33:28.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:33:28.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:33:29.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:33:29.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:33:29.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:33:29.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-05-30T03:33:29.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:33:29.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T03:33:29.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:33:29.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:33:29.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:33:29.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-05-30T03:33:31.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-05-30T03:33:31.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:33:31.898 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:33:31.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:33:31.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:33:31.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:33:31.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:33:31.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:33:31.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:33:31.920 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:33:31.920 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:33:31.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:33:32.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:33:32.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:33:32.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:33:32.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:33:32.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:33:32.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:33:32.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:33:32.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:33:32.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:33:32.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:33:32.250 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:33:32.311 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:33:25
2026-05-30T03:33:32.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73632, datetime.datetime(2026, 5, 30, 3, 33, 25), datetime.datetime(2026, 5, 30, 3, 33, 25), 'salt', 10.85, 49.47, None, 14.5, 336.45, 10.15, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:33:32.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:33:32.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:33:32.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:33:25, diff=7.318293s, valid=True
2026-05-30T03:33:32.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:33:32.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:33:32.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:33:12, diff=20.321572s, valid=True
2026-05-30T03:33:32.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:33:32.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:33:32.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:33:17, diff=15.328759s, valid=True
2026-05-30T03:33:32.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:33:32.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:33:32.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:33:32.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:33:32.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:33:32.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:33:32.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:33:12, diff=20.332053s, valid=True
2026-05-30T03:33:32.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:33:32.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:33:32.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:33:32.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037454.33278s, valid=True
2026-05-30T03:33:32.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:33:32.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:33:32.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:33:32.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:33:32.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:33:32.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:33:32.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:33:32.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:33:32.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:33:32.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:33:32.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:33:32.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:33:32.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:33:32.756 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:33:32.970 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:33:33.314 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:33:33.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:33:33.414 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:33:33.414 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:33:33.675 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:33:33.675 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:34:03.696 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:34:03.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:34:03.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:34:04.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:34:04.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:34:04.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:34:04.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-05-30T03:34:04.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:34:04.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-05-30T03:34:04.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:34:04.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:34:04.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:34:04.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T03:34:07.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-05-30T03:34:07.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:34:07.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:34:07.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:34:07.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:34:07.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:34:07.085 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:34:07.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:34:07.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:34:07.086 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:34:07.086 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:34:07.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:34:07.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:34:07.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:34:07.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:34:07.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:34:07.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:34:07.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:34:07.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:34:07.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:34:07.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:34:07.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:34:07.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:34:07.415 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:33:56
2026-05-30T03:34:07.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73633, datetime.datetime(2026, 5, 30, 3, 33, 56), datetime.datetime(2026, 5, 30, 3, 33, 55), 'salt', 10.78, 49.17, None, 17.15, 336.2, 10.23, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:34:07.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:34:07.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:34:07.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:33:55, diff=12.422352s, valid=True
2026-05-30T03:34:07.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:34:07.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:34:07.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:34:12, diff=-4.574456s, valid=True
2026-05-30T03:34:07.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:34:07.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:34:07.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:33:48, diff=19.433203s, valid=True
2026-05-30T03:34:07.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:34:07.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:34:07.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:34:07.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:34:07.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:34:07.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:34:07.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:34:12, diff=-4.563392s, valid=True
2026-05-30T03:34:07.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:34:07.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:34:07.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:34:07.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037489.43735s, valid=True
2026-05-30T03:34:07.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:34:07.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:34:07.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:34:07.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:34:07.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:34:07.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:34:07.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:34:07.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:34:07.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:34:07.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:34:07.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:34:07.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:34:07.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:34:07.757 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:34:07.969 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:34:08.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:34:08.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:34:08.412 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:34:08.412 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:34:08.633 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:34:08.634 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:34:38.641 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:34:38.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:34:38.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:34:39.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:34:39.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:34:39.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:34:39.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-05-30T03:34:39.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:34:39.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-05-30T03:34:39.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:34:39.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:34:39.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:34:39.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-05-30T03:35:20.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-05-30T03:35:20.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:35:20.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:35:20.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:35:20.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:35:20.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:35:20.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:35:20.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:35:20.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:35:20.325 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:35:20.325 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:35:20.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:35:20.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:35:20.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:35:20.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:35:20.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:35:20.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:35:20.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:35:20.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:35:20.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:35:20.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:35:20.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:35:20.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:35:20.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:34:56
2026-05-30T03:35:20.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73635, datetime.datetime(2026, 5, 30, 3, 34, 56), datetime.datetime(2026, 5, 30, 3, 34, 56), 'salt', 10.81, 48.94, None, 18.91, 339.86, 10.29, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:35:20.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:35:20.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:35:20.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:34:56, diff=24.720267s, valid=True
2026-05-30T03:35:20.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:35:20.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:35:20.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:35:12, diff=8.723773s, valid=True
2026-05-30T03:35:20.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:35:20.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:35:20.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:34:51, diff=29.731994s, valid=True
2026-05-30T03:35:20.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:35:20.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:35:20.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:35:20.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:35:20.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:35:20.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:35:20.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:35:12, diff=8.735775s, valid=True
2026-05-30T03:35:20.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:35:20.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:35:20.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:35:20.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037562.736605s, valid=True
2026-05-30T03:35:20.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:35:20.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:35:20.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:35:20.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:35:20.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:35:20.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:35:20.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:35:20.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:35:20.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:35:20.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:35:21.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:35:21.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:35:21.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:35:21.126 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:35:21.340 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:35:21.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:35:21.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:35:21.785 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:35:21.785 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:35:22.064 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:35:22.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:35:52.066 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:35:52.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:35:52.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:35:52.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:35:52.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:35:52.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:35:52.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T03:35:52.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:35:52.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-05-30T03:35:52.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:35:52.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:35:52.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:35:52.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-05-30T03:35:54.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-05-30T03:35:54.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:35:54.968 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:35:54.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:35:54.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:35:54.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:35:54.992 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:35:54.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:35:54.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:35:54.992 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:35:54.993 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:35:54.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:35:55.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:35:55.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:35:55.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:35:55.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:35:55.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:35:55.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:35:55.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:35:55.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:35:55.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:35:55.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:35:55.264 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:35:55.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:35:26
2026-05-30T03:35:55.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73636, datetime.datetime(2026, 5, 30, 3, 35, 26), datetime.datetime(2026, 5, 30, 3, 35, 26), 'salt', 10.91, 48.94, None, 15.03, 346.76, 10.3, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:35:55.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:35:55.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:35:55.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:35:26, diff=29.331455s, valid=True
2026-05-30T03:35:55.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:35:55.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:35:55.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:35:12, diff=43.334648s, valid=True
2026-05-30T03:35:55.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:35:55.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:35:55.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:35:22, diff=33.34211s, valid=True
2026-05-30T03:35:55.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:35:55.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:35:55.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:35:55.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:35:55.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:35:55.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:35:55.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:35:12, diff=43.345512s, valid=True
2026-05-30T03:35:55.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:35:55.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:35:55.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:35:55.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037597.346265s, valid=True
2026-05-30T03:35:55.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:35:55.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:35:55.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:35:55.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:35:55.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:35:55.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:35:55.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:35:55.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:35:55.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:35:56.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:35:56.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:35:56.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:35:56.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:35:56.569 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:35:56.786 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:35:57.135 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:35:57.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:35:57.234 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:35:57.235 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:35:59.220 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:35:59.220 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:36:29.250 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:36:29.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:36:29.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:36:29.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:36:29.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:36:29.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:36:29.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-05-30T03:36:29.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:36:29.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-05-30T03:36:29.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:36:29.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:36:29.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:36:29.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-05-30T03:36:53.500 [ERROR] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] processing LCO all-sky image: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
2026-05-30T03:36:53.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:36:53.501 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:36:53.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:36:53.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:36:53.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:36:53.527 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:36:53.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:36:53.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:36:53.528 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:36:53.528 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:36:53.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:36:53.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:36:53.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:36:53.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:36:53.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:36:53.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:36:53.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:36:53.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:36:53.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:36:53.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:36:53.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:36:53.858 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:36:53.917 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:36:27
2026-05-30T03:36:53.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73638, datetime.datetime(2026, 5, 30, 3, 36, 27), datetime.datetime(2026, 5, 30, 3, 36, 27), 'salt', 10.91, 48.41, None, 11.79, 0.92, 10.45, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:36:53.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:36:53.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:36:53.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:36:27, diff=26.92399s, valid=True
2026-05-30T03:36:53.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:36:53.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:36:53.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:36:12, diff=41.926939s, valid=True
2026-05-30T03:36:53.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:36:53.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:36:53.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:36:25, diff=28.93378s, valid=True
2026-05-30T03:36:53.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:36:53.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:36:53.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:36:53.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:36:53.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:36:53.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:36:53.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:36:12, diff=41.936882s, valid=True
2026-05-30T03:36:53.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:36:53.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:36:53.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:36:53.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037655.937533s, valid=True
2026-05-30T03:36:53.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:36:53.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:36:53.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:36:53.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:36:53.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:36:53.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:36:53.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:36:53.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:36:54.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:36:54.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:36:54.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:36:54.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:36:54.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:36:54.458 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:36:54.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:36:55.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:36:55.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:36:55.113 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:36:55.113 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:36:55.378 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:36:55.379 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:37:25.409 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:37:25.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:37:25.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:37:25.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:37:25.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:37:26.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:37:26.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-05-30T03:37:26.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:37:26.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-05-30T03:37:26.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:37:26.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:37:26.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:37: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-05-30T03:37:28.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-05-30T03:37:28.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:37:28.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:37:28.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:37:28.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:37:28.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:37:28.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:37:28.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:37:28.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:37:28.572 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:37:28.573 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:37:28.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:37:28.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:37:28.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:37:28.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:37:28.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:37:28.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:37:28.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:37:28.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:37:28.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:37:28.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:37:28.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:37:28.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:37:28.950 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:37:27
2026-05-30T03:37:28.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73640, datetime.datetime(2026, 5, 30, 3, 37, 27), datetime.datetime(2026, 5, 30, 3, 37, 27), 'salt', 11.01, 47.97, None, 17.93, 334.04, 10.59, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:37:28.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:37:28.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:37:28.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:37:27, diff=1.958143s, valid=True
2026-05-30T03:37:28.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:37:28.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:37:28.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:37:12, diff=16.961582s, valid=True
2026-05-30T03:37:28.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:37:28.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:37:28.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:37:19, diff=9.969694s, valid=True
2026-05-30T03:37:28.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:37:28.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:37:28.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:37:28.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:37:28.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:37:28.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:37:28.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:37:12, diff=16.97331s, valid=True
2026-05-30T03:37:28.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:37:28.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:37:28.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:37:28.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037690.974109s, valid=True
2026-05-30T03:37:28.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:37:28.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:37:28.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:37:28.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:37:28.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:37:29.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:37:29.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:37:29.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:37:29.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:37:29.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:37:29.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:37:29.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:37:29.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:37:29.292 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:37:29.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:37:29.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:37:29.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:37:29.945 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:37:29.945 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:37:30.144 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:37:30.144 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:38:00.173 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:38:00.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:38:00.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:38:00.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:38:00.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:38:00.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:38:00.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-05-30T03:38:00.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:38:00.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-05-30T03:38:00.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:38:00.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:38:00.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:38:00.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T03:38:02.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-05-30T03:38:02.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:38:02.980 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:38:02.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:38:02.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:38:03.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:38:03.003 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:38:03.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:38:03.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:38:03.004 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:38:03.005 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:38:03.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:38:03.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:38:03.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:38:03.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:38:03.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:38:03.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:38:03.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:38:03.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:38:03.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:38:03.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:38:03.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:38:03.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:38:03.393 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:37:58
2026-05-30T03:38:03.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73641, datetime.datetime(2026, 5, 30, 3, 37, 58), datetime.datetime(2026, 5, 30, 3, 37, 57), 'salt', 11.08, 47.58, None, 20.11, 337.67, 10.71, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:38:03.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:38:03.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:38:03.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:37:57, diff=6.400993s, valid=True
2026-05-30T03:38:03.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:38:03.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:38:03.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:38:12, diff=-8.595427s, valid=True
2026-05-30T03:38:03.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:38:03.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:38:03.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:37:49, diff=14.413126s, valid=True
2026-05-30T03:38:03.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:38:03.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:38:03.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:38:03.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:38:03.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:38:03.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:38:03.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:38:12, diff=-8.583035s, valid=True
2026-05-30T03:38:03.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:38:03.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:38:03.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:38:03.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037725.417805s, valid=True
2026-05-30T03:38:03.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:38:03.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:38:03.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:38:03.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:38:03.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:38:03.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:38:03.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:38:03.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:38:03.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:38:03.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:38:03.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:38:03.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:38:03.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:38:03.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:38:03.969 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:38:04.308 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:38:04.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:38:04.406 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:38:04.406 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:38:04.610 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:38:04.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:38:34.622 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:38:34.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:38:34.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:38:34.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:38:34.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:38:35.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:38:35.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-05-30T03:38:35.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:38:35.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-05-30T03:38:35.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:38:35.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:38:35.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:38:35.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-05-30T03:38:37.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-05-30T03:38:37.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:38:37.503 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:38:37.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:38:37.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:38:37.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:38:37.525 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:38:37.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:38:37.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:38:37.526 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:38:37.527 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:38:37.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:38:37.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:38:37.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:38:37.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:38:37.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:38:37.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:38:37.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:38:37.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:38:37.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:38:37.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:38:37.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:38:37.843 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:38:37.904 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:38:28
2026-05-30T03:38:37.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73642, datetime.datetime(2026, 5, 30, 3, 38, 28), datetime.datetime(2026, 5, 30, 3, 38, 28), 'salt', 11.11, 47.28, None, 17.29, 328.92, 10.8, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:38:37.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:38:37.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:38:37.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:38:28, diff=9.91197s, valid=True
2026-05-30T03:38:37.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:38:37.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:38:37.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:38:12, diff=25.915516s, valid=True
2026-05-30T03:38:37.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:38:37.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:38:37.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:38:21, diff=16.924035s, valid=True
2026-05-30T03:38:37.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:38:37.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:38:37.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:38:37.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:38:37.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:38:37.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:38:37.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:38:12, diff=25.927891s, valid=True
2026-05-30T03:38:37.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:38:37.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:38:37.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:38:37.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037759.928742s, valid=True
2026-05-30T03:38:37.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:38:37.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:38:37.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:38:37.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:38:37.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:38:37.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:38:37.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:38:37.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:38:38.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:38:38.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:38:38.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:38:38.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:38:38.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:38:38.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:38:38.454 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:38:38.788 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:38:38.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:38:38.887 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:38:38.887 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:38:39.078 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:38:39.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:39:09.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:39:09.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:39:09.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:39:09.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:39:09.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:39:09.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:39:09.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-05-30T03:39:09.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:39:09.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-05-30T03:39:09.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:39:09.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:39:09.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:39:09.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-05-30T03:39:28.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-05-30T03:39:28.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:39:28.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:39:28.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:39:28.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:39:28.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:39:28.726 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:39:28.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:39:28.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:39:28.727 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:39:28.728 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:39:28.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:39:28.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:39:28.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:39:28.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:39:28.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:39:29.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:39:29.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:39:29.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:39:29.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:39:29.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:39:29.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:39:29.056 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:39:29.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:39:28
2026-05-30T03:39:29.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73644, datetime.datetime(2026, 5, 30, 3, 39, 28), datetime.datetime(2026, 5, 30, 3, 39, 28), 'salt', 11.15, 47.08, None, 15.91, 333.61, 10.86, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:39:29.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:39:29.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:39:29.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:39:28, diff=1.126792s, valid=True
2026-05-30T03:39:29.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:39:29.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:39:29.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:39:12, diff=17.130264s, valid=True
2026-05-30T03:39:29.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:39:29.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:39:29.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:39:23, diff=6.138422s, valid=True
2026-05-30T03:39:29.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:39:29.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:39:29.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:39:29.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:39:29.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:39:29.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:39:29.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:39:12, diff=17.142237s, valid=True
2026-05-30T03:39:29.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:39:29.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:39:29.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:39:29.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037811.143076s, valid=True
2026-05-30T03:39:29.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:39:29.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:39:29.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:39:29.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:39:29.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:39:29.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:39:29.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:39:29.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:39:29.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:39:29.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:39:29.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:39:29.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:39:29.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:39:29.464 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:39:29.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:39:30.021 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:39:30.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:39:30.126 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:39:30.127 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:39:30.320 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:39:30.320 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:40:00.341 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:40:00.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:40:00.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:40:00.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:40:00.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:40:00.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:40:00.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-05-30T03:40:01.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:40:01.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-05-30T03:40:01.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:40:01.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:40:01.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:40:01.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-05-30T03:40:04.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-05-30T03:40:04.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:40:04.150 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:40:04.150 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:40:04.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:40:04.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:40:04.174 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:40:04.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:40:04.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:40:04.176 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:40:04.176 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:40:04.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:40:04.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:40:04.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:40:04.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:40:04.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:40:04.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:40:04.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:40:04.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:40:04.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:40:04.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:40:04.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:40:04.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:40:04.566 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:39:59
2026-05-30T03:40:04.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73645, datetime.datetime(2026, 5, 30, 3, 39, 59), datetime.datetime(2026, 5, 30, 3, 39, 58), 'salt', 11.18, 47.08, None, 17.47, 337.84, 10.86, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:40:04.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:40:04.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:40:04.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:39:58, diff=6.574249s, valid=True
2026-05-30T03:40:04.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:40:04.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:40:04.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:40:12, diff=-7.422141s, valid=True
2026-05-30T03:40:04.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:40:04.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:40:04.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:39:55, diff=9.586368s, valid=True
2026-05-30T03:40:04.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:40:04.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:40:04.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:40:04.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:40:04.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:40:04.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:40:04.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:40:12, diff=-7.409789s, valid=True
2026-05-30T03:40:04.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:40:04.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:40:04.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:40:04.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037846.591078s, valid=True
2026-05-30T03:40:04.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:40:04.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:40:04.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:40:04.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:40:04.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:40:04.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:40:04.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:40:04.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:40:04.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:40:04.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:40:04.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:40:04.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:40:04.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:40:04.916 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:40:05.199 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:40:05.539 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:40:05.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:40:05.640 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:40:05.640 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:40:05.835 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:40:05.835 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:40:35.845 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:40:35.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:40:35.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:40:36.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:40:36.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:40:36.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:40:36.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-05-30T03:40:36.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:40:36.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-05-30T03:40:36.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:40:36.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:40:36.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:40:36.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-05-30T03:40:38.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-05-30T03:40:38.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:40:38.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:40:38.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:40:38.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:40:39.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:40:39.002 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:40:39.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:40:39.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:40:39.003 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:40:39.003 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:40:39.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:40:39.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:40:39.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:40:39.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:40:39.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:40:39.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:40:39.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:40:39.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:40:39.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:40:39.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:40:39.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:40:39.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:40:39.388 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:40:29
2026-05-30T03:40:39.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73646, datetime.datetime(2026, 5, 30, 3, 40, 29), datetime.datetime(2026, 5, 30, 3, 40, 29), 'salt', 11.18, 47.24, None, 16.2, 335.87, 10.82, 831.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:40:39.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:40:39.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:40:39.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:40:29, diff=10.396299s, valid=True
2026-05-30T03:40:39.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:40:39.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:40:39.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:40:12, diff=27.399843s, valid=True
2026-05-30T03:40:39.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:40:39.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:40:39.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:40:26, diff=13.408049s, valid=True
2026-05-30T03:40:39.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:40:39.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:40:39.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:40:39.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:40:39.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:40:39.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:40:39.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:40:12, diff=27.411793s, valid=True
2026-05-30T03:40:39.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:40:39.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:40:39.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:40:39.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037881.4126s, valid=True
2026-05-30T03:40:39.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:40:39.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:40:39.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:40:39.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:40:39.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:40:39.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:40:39.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:40:39.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:40:39.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:40:39.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:40:39.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:40:39.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:40:39.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:40:39.733 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:40:39.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:40:40.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:40:40.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:40:40.399 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:40:40.399 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:40:40.657 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:40:40.658 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:41:10.685 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:41:10.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:41:10.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:41:10.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:41:10.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:41:11.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:41:11.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-05-30T03:41:11.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:41:11.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-05-30T03:41:11.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:41:11.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:41:11.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:41:11.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-05-30T03:41:13.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-05-30T03:41:13.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:41:13.730 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:41:13.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:41:13.740 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:41:13.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:41:13.754 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:41:13.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:41:13.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:41:13.755 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:41:13.756 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:41:13.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:41:13.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:41:13.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:41:13.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:41:13.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:41:14.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:41:14.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:41:14.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:41:14.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:41:14.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:41:14.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:41:14.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:41:14.142 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:40:59
2026-05-30T03:41:14.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73647, datetime.datetime(2026, 5, 30, 3, 40, 59), datetime.datetime(2026, 5, 30, 3, 40, 59), 'salt', 11.08, 47.44, None, 15.53, 355.35, 10.75, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:41:14.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:41:14.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:41:14.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:40:59, diff=15.150407s, valid=True
2026-05-30T03:41:14.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:41:14.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:41:14.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:41:12, diff=2.154058s, valid=True
2026-05-30T03:41:14.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:41:14.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:41:14.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:40:58, diff=16.162872s, valid=True
2026-05-30T03:41:14.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:41:14.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:41:14.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:41:14.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:41:14.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:41:14.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:41:14.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:41:12, diff=2.166845s, valid=True
2026-05-30T03:41:14.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:41:14.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:41:14.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:41:14.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037916.16771s, valid=True
2026-05-30T03:41:14.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:41:14.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:41:14.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:41:14.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:41:14.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:41:14.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:41:14.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:41:14.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:41:14.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:41:14.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:41:14.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:41:14.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:41:14.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:41:14.593 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:41:14.804 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:41:15.141 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:41:15.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:41:15.239 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:41:15.239 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:41:15.507 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:41:15.507 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:41:45.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:41:45.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:41:45.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:41:45.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:41:45.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:41:46.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:41:46.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-05-30T03:41:46.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:41:46.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-05-30T03:41:46.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:41:46.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:41:46.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:41:46.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-05-30T03:41:48.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-05-30T03:41:48.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:41:48.545 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:41:48.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:41:48.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:41:48.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:41:48.567 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:41:48.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:41:48.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:41:48.568 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:41:48.569 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:41:48.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:41:48.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:41:48.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:41:48.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:41:48.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:41:48.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:41:48.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:41:48.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:41:48.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:41:48.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:41:48.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:41:48.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:41:48.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:41:29
2026-05-30T03:41:48.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73648, datetime.datetime(2026, 5, 30, 3, 41, 29), datetime.datetime(2026, 5, 30, 3, 41, 29), 'salt', 11.11, 47.68, None, 18.35, 343.14, 10.68, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:41:48.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:41:48.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:41:48.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:41:29, diff=19.970093s, valid=True
2026-05-30T03:41:48.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:41:48.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:41:48.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:41:12, diff=36.973657s, valid=True
2026-05-30T03:41:48.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:41:48.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:41:48.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:41:29, diff=19.981968s, valid=True
2026-05-30T03:41:48.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:41:48.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:41:48.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:41:48.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:41:48.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:41:48.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:41:48.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:41:12, diff=36.985755s, valid=True
2026-05-30T03:41:48.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:41:48.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:41:48.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:41:48.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1037950.986569s, valid=True
2026-05-30T03:41:48.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:41:48.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:41:48.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:41:48.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:41:48.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:41:49.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:41:49.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:41:49.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:41:49.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:41:49.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:41:49.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:41:49.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:41:49.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:41:49.310 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:41:49.513 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:41:49.848 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:41:49.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:41:49.952 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:41:49.952 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:41:50.252 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:41:50.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:42:20.282 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:42:20.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:42:20.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:42:20.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:42:20.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:42:20.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:42:20.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-05-30T03:42:20.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:42:20.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-05-30T03:42:20.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:42:20.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:42:20.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:42:20.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-05-30T03:42:46.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-05-30T03:42:46.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:42:46.098 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:42:46.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:42:46.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:42:46.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:42:46.112 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:42:46.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:42:46.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:42:46.113 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:42:46.113 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:42:46.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:42:46.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:42:46.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:42:46.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:42:46.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:42:46.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:42:46.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:42:46.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:42:46.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:42:46.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:42:46.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:42:46.450 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:42:46.517 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:42:30
2026-05-30T03:42:46.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73650, datetime.datetime(2026, 5, 30, 3, 42, 30), datetime.datetime(2026, 5, 30, 3, 42, 30), 'salt', 11.08, 47.44, None, 17.61, 343.17, 10.75, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:42:46.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:42:46.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:42:46.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:42:30, diff=16.525306s, valid=True
2026-05-30T03:42:46.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:42:46.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:42:46.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:42:12, diff=34.52886s, valid=True
2026-05-30T03:42:46.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:42:46.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:42:46.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:42:22, diff=24.537165s, valid=True
2026-05-30T03:42:46.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:42:46.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:42:46.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:42:46.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:42:46.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:42:46.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:42:46.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:42:12, diff=34.540932s, valid=True
2026-05-30T03:42:46.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:42:46.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:42:46.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:42:46.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038008.541767s, valid=True
2026-05-30T03:42:46.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:42:46.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:42:46.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:42:46.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:42:46.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:42:46.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:42:46.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:42:46.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:42:46.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:42:46.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:42:46.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:42:46.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:42:46.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:42:46.935 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:42:47.141 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:42:47.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:42:47.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:42:47.580 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:42:47.580 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:42:47.776 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:42:47.777 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:43:17.807 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:43:17.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:43:17.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:43:18.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:43:18.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:43:18.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:43:18.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-05-30T03:43:18.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:43:18.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-05-30T03:43:18.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:43:18.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:43:18.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:43:18.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-05-30T03:43:57.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-05-30T03:43:58.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:43:58.209 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:43:58.209 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:43:58.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:43:58.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:43:58.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:43:58.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:43:58.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:43:58.303 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:43:58.303 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:43:58.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:43:58.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:43:58.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:43:58.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:43:58.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:43:58.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:43:58.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:43:58.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:43:58.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:43:58.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:43:58.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:43:58.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:43:58.645 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:43:31
2026-05-30T03:43:58.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73652, datetime.datetime(2026, 5, 30, 3, 43, 31), datetime.datetime(2026, 5, 30, 3, 43, 30), 'salt', 11.15, 47.61, None, 19.2, 334.81, 10.71, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:43:58.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:43:58.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:43:58.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:43:30, diff=28.651903s, valid=True
2026-05-30T03:43:58.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:43:58.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:43:58.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:43:12, diff=46.655191s, valid=True
2026-05-30T03:43:58.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:43:58.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:43:58.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:43:25, diff=33.662845s, valid=True
2026-05-30T03:43:58.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:43:58.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:43:58.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:43:58.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:43:58.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:43:58.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:43:58.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:43:12, diff=46.666351s, valid=True
2026-05-30T03:43:58.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:43:58.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:43:58.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:43:58.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038080.667142s, valid=True
2026-05-30T03:43:58.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:43:58.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:43:58.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:43:58.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:43:58.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:43:58.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:43:58.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:43:58.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:43:58.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:43:58.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:43:58.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:43:58.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:43:58.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:43:58.989 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:43:59.194 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:43:59.532 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:43:59.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:43:59.632 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:43:59.633 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:44:00.959 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:44:00.959 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:44:30.989 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:44:30.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:44:30.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:44:31.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:44:31.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:44:31.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:44:31.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-05-30T03:44:31.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:44:31.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-05-30T03:44:31.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:44:31.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:44:31.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:44:31.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-05-30T03:44:33.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-05-30T03:44:33.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:44:33.969 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:44:33.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:44:33.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:44:33.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:44:33.993 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:44:33.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:44:33.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:44:33.994 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:44:33.994 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:44:34.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:44:34.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:44:34.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:44:34.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:44:34.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:44:34.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:44:34.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:44:34.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:44:34.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:44:34.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:44:34.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:44:34.316 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:44:34.376 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:44:31
2026-05-30T03:44:34.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73654, datetime.datetime(2026, 5, 30, 3, 44, 31), datetime.datetime(2026, 5, 30, 3, 44, 31), 'salt', 11.05, 48.01, None, 17.08, 320.52, 10.59, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:44:34.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:44:34.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:44:34.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:44:31, diff=3.383714s, valid=True
2026-05-30T03:44:34.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:44:34.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:44:34.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:44:12, diff=22.387239s, valid=True
2026-05-30T03:44:34.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:44:34.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:44:34.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:44:28, diff=6.395674s, valid=True
2026-05-30T03:44:34.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:44:34.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:44:34.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:44:34.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:44:34.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:44:34.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:44:34.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:44:12, diff=22.39946s, valid=True
2026-05-30T03:44:34.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:44:34.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:44:34.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:44:34.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038116.400301s, valid=True
2026-05-30T03:44:34.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:44:34.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:44:34.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:44:34.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:44:34.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:44:34.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:44:34.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:44:34.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:44:34.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:44:34.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:44:34.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:44:34.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:44:34.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:44:34.786 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:44:34.990 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:44:35.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:44:35.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:44:35.423 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:44:35.424 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:44:35.605 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:44:35.605 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:45:05.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:45:05.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:45:05.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:45:06.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:45:06.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:45:06.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:45:06.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-05-30T03:45:06.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:45:06.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-05-30T03:45:06.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:45:06.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:45:06.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:45:06.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-05-30T03:45:08.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-05-30T03:45:08.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:45:08.743 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:45:08.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:45:08.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:45:08.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:45:08.767 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:45:08.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:45:08.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:45:08.768 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:45:08.769 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:45:08.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:45:08.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:45:08.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:45:08.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:45:08.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:45:09.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T03:45:09.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:45:09.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T03:45:09.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:45:09.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:45:09.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:45:09.091 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:45:09.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:45:01
2026-05-30T03:45:09.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73655, datetime.datetime(2026, 5, 30, 3, 45, 1), datetime.datetime(2026, 5, 30, 3, 45, 1), 'salt', 10.88, 47.64, None, 18.14, 331.2, 10.67, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:45:09.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:45:09.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:45:09.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:01, diff=8.162254s, valid=True
2026-05-30T03:45:09.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:45:09.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T03:45:09.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:12, diff=-2.834216s, valid=True
2026-05-30T03:45:09.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:45:09.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:45:09.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:44:59, diff=10.174145s, valid=True
2026-05-30T03:45:09.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:45:09.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:45:09.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:45:09.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:45:09.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:45:09.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T03:45:09.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:12, diff=-2.822094s, valid=True
2026-05-30T03:45:09.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:45:09.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:45:09.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:45:09.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038151.178761s, valid=True
2026-05-30T03:45:09.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:45:09.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:45:09.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:45:09.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:45:09.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:45:09.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:45:09.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:45:09.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:45:09.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:45:09.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:45:09.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:45:09.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:45:09.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:45:09.503 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:45:09.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:45:10.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:45:10.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:45:10.165 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:45:10.165 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:45:10.347 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:45:10.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:45:40.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:45:40.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:45:40.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:45:40.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:45:40.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:45:40.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:45:40.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-05-30T03:45:40.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:45:40.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-05-30T03:45:40.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:45:40.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:45:41.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:45:41.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-05-30T03:45:43.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-05-30T03:45:43.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:45:43.341 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:45:43.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:45:43.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:45:43.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:45:43.365 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:45:43.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:45:43.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:45:43.366 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:45:43.366 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:45:43.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:45:43.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:45:43.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:45:43.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:45:43.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:45:43.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T03:45:43.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:45:43.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T03:45:43.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:45:43.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:45:43.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:45:43.687 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:45:43.769 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:45:32
2026-05-30T03:45:43.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73656, datetime.datetime(2026, 5, 30, 3, 45, 32), datetime.datetime(2026, 5, 30, 3, 45, 31), 'salt', 11.01, 47.87, None, 17.26, 342.02, 10.62, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:45:43.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:45:43.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:45:43.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:31, diff=12.776524s, valid=True
2026-05-30T03:45:43.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:45:43.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T03:45:43.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:12, diff=31.779983s, valid=True
2026-05-30T03:45:43.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:45:43.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:45:43.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:30, diff=13.788039s, valid=True
2026-05-30T03:45:43.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:45:43.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:45:43.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:45:43.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:45:43.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:45:43.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T03:45:43.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:12, diff=31.791742s, valid=True
2026-05-30T03:45:43.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:45:43.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:45:43.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:45:43.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038185.792539s, valid=True
2026-05-30T03:45:43.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:45:43.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:45:43.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:45:43.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:45:43.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:45:43.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:45:43.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:45:43.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:45:43.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:45:43.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:45:43.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:45:44.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:45:44.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:45:44.113 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:45:44.317 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:45:44.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:45:44.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:45:44.749 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:45:44.749 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:45:44.992 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:45:44.992 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:46:15.022 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:46:15.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:46:15.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:46:15.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:46:15.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:46:15.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:46: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-05-30T03:46:15.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:46:15.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-05-30T03:46:15.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:46:15.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:46:15.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:46:15.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-05-30T03:46:52.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-05-30T03:46:52.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:46:52.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:46:52.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:46:52.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:46:52.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:46:52.070 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:46:52.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:46:52.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:46:52.071 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:46:52.071 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:46:52.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:46:52.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:46:52.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:46:52.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:46:52.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:46:52.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T03:46:52.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:46:52.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T03:46:52.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:46:52.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:46:52.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:46:52.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:46:52.452 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:46:32
2026-05-30T03:46:52.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73658, datetime.datetime(2026, 5, 30, 3, 46, 32), datetime.datetime(2026, 5, 30, 3, 46, 31), 'salt', 10.98, 47.68, None, 17.64, 341.71, 10.67, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:46:52.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:46:52.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:46:52.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:46:31, diff=21.459652s, valid=True
2026-05-30T03:46:52.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:46:52.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T03:46:52.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:12, diff=100.463159s, valid=True
2026-05-30T03:46:52.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:46:52.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:46:52.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:46:23, diff=29.471626s, valid=True
2026-05-30T03:46:52.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:46:52.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:46:52.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:46:52.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:46:52.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:46:52.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T03:46:52.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:12, diff=100.475386s, valid=True
2026-05-30T03:46:52.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:46:52.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:46:52.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:46:52.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038254.476217s, valid=True
2026-05-30T03:46:52.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:46:52.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:46:52.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:46:52.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:46:52.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:46:52.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:46:52.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:46:52.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:46:52.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:46:52.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:46:52.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:46:52.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:46:52.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:46:52.797 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:46:53.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:46:53.330 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:46:53.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:46:53.489 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:46:53.489 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:46:53.686 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:46:53.687 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:47:23.693 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:47:23.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:47:23.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:47:24.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:47:24.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:47:24.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:47:24.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-05-30T03:47:24.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:47:24.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-05-30T03:47:24.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:47:24.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:47:24.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:47:24.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-05-30T03:47:26.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-05-30T03:47:26.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:47:26.743 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:47:26.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:47:26.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:47:26.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:47:26.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:47:26.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:47:26.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:47:26.767 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:47:26.768 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:47:26.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:47:26.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:47:26.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:47:27.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:47:27.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:47:27.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T03:47:27.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:47:27.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T03:47:27.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:47:27.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:47:27.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:47:27.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:47:27.160 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:47:02
2026-05-30T03:47:27.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73659, datetime.datetime(2026, 5, 30, 3, 47, 2), datetime.datetime(2026, 5, 30, 3, 47, 2), 'salt', 11.05, 47.91, None, 16.94, 353.97, 10.61, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:47:27.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:47:27.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:47:27.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:47:02, diff=25.167582s, valid=True
2026-05-30T03:47:27.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:47:27.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T03:47:27.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:12, diff=135.170972s, valid=True
2026-05-30T03:47:27.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:47:27.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:47:27.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:46:54, diff=33.179011s, valid=True
2026-05-30T03:47:27.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:47:27.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:47:27.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:47:27.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:47:27.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:47:27.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T03:47:27.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:12, diff=135.182629s, valid=True
2026-05-30T03:47:27.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:47:27.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:47:27.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:47:27.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038289.183428s, valid=True
2026-05-30T03:47:27.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:47:27.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:47:27.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:47:27.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:47:27.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:47:27.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:47:27.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:47:27.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:47:27.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:47:27.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:47:27.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:47:27.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:47:27.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:47:27.504 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:47:27.707 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:47:28.042 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:47:28.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:47:28.143 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:47:28.143 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:47:28.402 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:47:28.402 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:47:58.432 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:47:58.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:47:58.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:47:58.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:47:58.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:47:58.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:47:58.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-05-30T03:47:58.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:47:58.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-05-30T03:47:58.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:47:58.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:47:58.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:47:58.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-05-30T03:48:01.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-05-30T03:48:01.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:48:01.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:48:01.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:48:01.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:48:01.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:48:01.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:48:01.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:48:01.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:48:01.413 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:48:01.413 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:48:01.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:48:01.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:48:01.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:48:01.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:48:01.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:48:01.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T03:48:01.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:48:01.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T03:48:01.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:48:01.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:48:01.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:48:01.716 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:48:01.785 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:47:32
2026-05-30T03:48:01.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73660, datetime.datetime(2026, 5, 30, 3, 47, 32), datetime.datetime(2026, 5, 30, 3, 47, 32), 'salt', 10.95, 47.68, None, 17.96, 344.06, 10.67, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:48:01.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:48:01.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:48:01.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:47:32, diff=29.792645s, valid=True
2026-05-30T03:48:01.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:48:01.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T03:48:01.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:12, diff=169.79607s, valid=True
2026-05-30T03:48:01.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:48:01.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:48:01.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:47:25, diff=36.80421s, valid=True
2026-05-30T03:48:01.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:48:01.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:48:01.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:48:01.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:48:01.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:48:01.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T03:48:01.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:12, diff=169.807899s, valid=True
2026-05-30T03:48:01.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:48:01.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:48:01.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:48:01.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038323.808703s, valid=True
2026-05-30T03:48:01.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:48:01.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:48:01.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:48:01.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:48:01.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:48:01.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:48:01.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:48:01.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:48:01.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:48:01.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:48:02.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:48:02.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:48:02.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:48:02.131 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:48:02.408 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:48:02.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:48:02.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:48:02.845 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:48:02.845 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:48:03.032 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:48:03.032 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:48:33.056 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:48:33.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:48:33.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:48:33.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:48:33.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:48:33.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:48:33.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-05-30T03:48:33.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:48:33.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-05-30T03:48:33.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:48:33.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:48:33.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:48:33.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-05-30T03:49:17.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-05-30T03:49:17.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:49:17.336 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:49:17.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:49:17.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:49:17.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:49:17.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:49:17.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:49:17.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:49:17.370 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:49:17.370 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:49:17.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:49:17.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:49:17.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:49:17.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:49:17.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:49:17.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:49:17.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:49:17.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:49:17.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:49:17.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:49:17.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:49:17.704 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:49:17.765 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:49:03
2026-05-30T03:49:17.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73663, datetime.datetime(2026, 5, 30, 3, 49, 3), datetime.datetime(2026, 5, 30, 3, 49, 3), 'salt', 10.95, 48.21, None, 19.02, 330.02, 10.52, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:49:17.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:49:17.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:49:17.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:49:03, diff=14.772757s, valid=True
2026-05-30T03:49:17.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:49:17.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:49:17.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:12, diff=245.776305s, valid=True
2026-05-30T03:49:17.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:49:17.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:49:17.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:49:00, diff=17.784538s, valid=True
2026-05-30T03:49:17.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:49:17.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:49:17.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:49:17.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:49:17.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:49:17.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:49:17.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:12, diff=245.788327s, valid=True
2026-05-30T03:49:17.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:49:17.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:49:17.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:49:17.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038399.789231s, valid=True
2026-05-30T03:49:17.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:49:17.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:49:17.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:49:17.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:49:17.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:49:17.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:49:17.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:49:17.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:49:17.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:49:17.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:49:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:49:18.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:49:18.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:49:18.111 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:49:18.317 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:49:18.651 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:49:18.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:49:18.749 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:49:18.749 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:49:19.002 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:49:19.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:49:49.024 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:49:49.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:49:49.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:49:49.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:49:49.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:49:49.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:49:49.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-05-30T03:49:49.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:49:49.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T03:49:49.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:49:49.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:49:49.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:49:49.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-05-30T03:49:52.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T03:49:52.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:49:52.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:49:52.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:49:52.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:49:52.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:49:52.205 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:49:52.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:49:52.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:49:52.207 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:49:52.207 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:49:52.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:49:52.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:49:52.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:49:52.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:49:52.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:49:52.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:49:52.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:49:52.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:49:52.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:49:52.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:49:52.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:49:52.523 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:49:52.583 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:49:33
2026-05-30T03:49:52.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73664, datetime.datetime(2026, 5, 30, 3, 49, 33), datetime.datetime(2026, 5, 30, 3, 49, 33), 'salt', 10.91, 48.11, None, 16.02, 323.78, 10.54, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:49:52.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:49:52.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:49:52.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:49:33, diff=19.591031s, valid=True
2026-05-30T03:49:52.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:49:52.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:49:52.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:12, diff=280.594512s, valid=True
2026-05-30T03:49:52.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:49:52.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:49:52.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:49:31, diff=21.602872s, valid=True
2026-05-30T03:49:52.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:49:52.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:49:52.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:49:52.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:49:52.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:49:52.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:49:52.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:12, diff=280.606605s, valid=True
2026-05-30T03:49:52.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:49:52.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:49:52.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:49:52.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038434.607434s, valid=True
2026-05-30T03:49:52.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:49:52.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:49:52.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:49:52.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:49:52.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:49:52.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:49:52.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:49:52.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:49:52.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:49:52.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:49:52.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:49:52.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:49:52.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:49:52.926 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:49:53.207 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:49:53.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:49:53.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:49:53.650 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:49:53.650 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:49:53.897 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:49:53.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:50:23.928 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:50:23.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:50:23.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:50:24.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:50:24.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:50:24.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:50:24.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-05-30T03:50:24.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:50:24.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-05-30T03:50:24.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:50:24.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:50:24.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:50:24.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-05-30T03:50:27.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-05-30T03:50:27.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:50:27.242 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:50:27.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:50:27.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:50:27.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:50:27.266 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:50:27.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:50:27.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:50:27.267 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:50:27.267 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:50:27.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:50:27.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:50:27.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:50:27.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:50:27.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:50:27.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:50:27.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:50:27.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:50:27.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:50:27.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:50:27.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:50:27.587 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:50:27.650 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:50:04
2026-05-30T03:50:27.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73665, datetime.datetime(2026, 5, 30, 3, 50, 4), datetime.datetime(2026, 5, 30, 3, 50, 3), 'salt', 10.91, 48.17, None, 15.99, 348.1, 10.52, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:50:27.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:50:27.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:50:27.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:50:03, diff=24.657868s, valid=True
2026-05-30T03:50:27.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:50:27.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:50:27.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:12, diff=315.661381s, valid=True
2026-05-30T03:50:27.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:50:27.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:50:27.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:50:03, diff=24.669823s, valid=True
2026-05-30T03:50:27.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:50:27.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:50:27.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:50:27.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:50:27.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:50:27.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:50:27.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:45:12, diff=315.67359s, valid=True
2026-05-30T03:50:27.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:50:27.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:50:27.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:50:27.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038469.674422s, valid=True
2026-05-30T03:50:27.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:50:27.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:50:27.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:50:27.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:50:27.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:50:27.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:50:27.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:50:27.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:50:27.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:50:27.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:50:27.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:50:27.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:50:27.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:50:27.999 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:50:28.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:50:28.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:50:28.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:50:28.695 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:50:28.695 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:50:28.964 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:50:28.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:50:58.988 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:50:58.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:50:58.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:50:59.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:50:59.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:50:59.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:50:59.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-05-30T03:50:59.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:50:59.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T03:50:59.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:50:59.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:50:59.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:50:59.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-05-30T03:51:02.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-05-30T03:51:02.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:51:02.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:51:02.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:51:02.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:51:02.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:51:02.211 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:51:02.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:51:02.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:51:02.212 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:51:02.212 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:51:02.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:51:02.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:51:02.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:51:02.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:51:02.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:51:02.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:51:02.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:51:02.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:51:02.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:51:02.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:51:02.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:51:02.541 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:51:02.604 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:50:34
2026-05-30T03:51:02.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73666, datetime.datetime(2026, 5, 30, 3, 50, 34), datetime.datetime(2026, 5, 30, 3, 50, 34), 'salt', 10.85, 47.77, None, 18.81, 343.22, 10.64, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:51:02.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:51:02.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:51:02.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:50:34, diff=28.612079s, valid=True
2026-05-30T03:51:02.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:51:02.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:51:02.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:51:12, diff=-9.384234s, valid=True
2026-05-30T03:51:02.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:51:02.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:51:02.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:50:25, diff=37.624476s, valid=True
2026-05-30T03:51:02.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:51:02.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:51:02.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:51:02.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:51:02.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:51:02.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:51:02.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:51:12, diff=-9.371596s, valid=True
2026-05-30T03:51:02.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:51:02.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:51:02.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:51:02.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038504.629273s, valid=True
2026-05-30T03:51:02.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:51:02.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:51:02.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:51:02.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:51:02.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:51:02.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:51:02.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:51:02.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:51:02.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:51:02.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:51:02.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:51:02.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:51:02.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:51:03.020 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:51:03.233 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:51:03.578 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:51:03.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:51:03.680 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:51:03.681 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:51:03.931 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:51:03.932 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:51:33.962 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:51:33.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:51:33.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:51:34.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:51:34.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:51:34.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:51:34.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-05-30T03:51:34.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:51:34.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-05-30T03:51:34.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:51:34.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:51:34.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:51:34.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-05-30T03:51:36.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-05-30T03:51:36.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:51:36.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:51:36.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:51:36.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:51:36.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:51:36.968 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:51:36.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:51:36.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:51:36.969 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:51:36.969 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:51:36.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:51:37.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:51:37.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:51:37.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:51:37.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:51:37.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:51:37.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:51:37.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:51:37.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:51:37.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:51:37.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:51:37.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:51:37.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:51:34
2026-05-30T03:51:37.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73668, datetime.datetime(2026, 5, 30, 3, 51, 34), datetime.datetime(2026, 5, 30, 3, 51, 34), 'salt', 11.08, 47.77, None, 14.93, 341.03, 10.65, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:51:37.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:51:37.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:51:37.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:51:34, diff=3.355027s, valid=True
2026-05-30T03:51:37.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:51:37.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:51:37.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:52:12, diff=-34.641544s, valid=True
2026-05-30T03:51:37.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:51:37.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:51:37.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:51:26, diff=11.366584s, valid=True
2026-05-30T03:51:37.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:51:37.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:51:37.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:51:37.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:51:37.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:51:37.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:51:37.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:52:12, diff=-34.629764s, valid=True
2026-05-30T03:51:37.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:51:37.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:51:37.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:51:37.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038539.371033s, valid=True
2026-05-30T03:51:37.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:51:37.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:51:37.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:51:37.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:51:37.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:51:37.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:51:37.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:51:37.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:51:37.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:51:37.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:51:37.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:51:37.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:51:37.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:51:37.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:51:37.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:51:38.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:51:38.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:51:38.348 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:51:38.348 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:51:38.607 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:51:38.607 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:52:08.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:52:08.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:52:08.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:52:09.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:52:09.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:52:09.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:52:09.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-05-30T03:52:09.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:52: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-05-30T03:52:09.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:52:09.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:52:09.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:52:09.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-05-30T03:52:12.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-05-30T03:52:12.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:52:12.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:52:12.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:52:12.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:52:12.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:52:12.469 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:52:12.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:52:12.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:52:12.470 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:52:12.471 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:52:12.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:52:12.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:52:12.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:52:12.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:52:12.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:52:12.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:52:12.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:52:12.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:52:12.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:52:12.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:52:12.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:52:12.790 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:52:12.851 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:52:05
2026-05-30T03:52:12.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73669, datetime.datetime(2026, 5, 30, 3, 52, 5), datetime.datetime(2026, 5, 30, 3, 52, 4), 'salt', 11.01, 48.01, None, 16.94, 347.7, 10.58, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:52:12.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:52:12.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:52:12.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:52:04, diff=8.858484s, valid=True
2026-05-30T03:52:12.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:52:12.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:52:12.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:52:12, diff=0.861996s, valid=True
2026-05-30T03:52:12.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:52:12.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:52:12.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:51:58, diff=14.8701s, valid=True
2026-05-30T03:52:12.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:52:12.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:52:12.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:52:12.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:52:12.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:52:12.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:52:12.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:52:12, diff=0.873858s, valid=True
2026-05-30T03:52:12.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:52:12.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:52:12.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:52:12.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038574.874673s, valid=True
2026-05-30T03:52:12.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:52:12.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:52:12.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:52:12.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:52:12.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:52:12.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:52:12.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:52:12.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:52:13.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:52:13.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:52:13.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:52:13.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:52:13.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:52:13.262 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:52:13.478 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:52:13.823 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:52:13.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:52:13.923 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:52:13.923 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:52:14.183 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:52:14.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:52:44.207 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:52:44.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:52:44.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:52:44.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:52:44.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:52:44.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:52:44.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-05-30T03:52:44.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:52:44.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T03:52:44.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:52:44.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:52:44.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:52:44.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-05-30T03:52:47.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-05-30T03:52:47.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:52:47.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:52:47.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:52:47.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:52:47.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:52:47.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:52:47.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:52:47.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:52:47.544 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:52:47.544 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:52:47.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:52:47.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:52:47.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:52:47.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:52:47.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:52:47.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:52:47.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:52:47.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:52:47.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:52:47.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:52:47.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:52:47.862 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:52:47.923 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:52:35
2026-05-30T03:52:47.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73670, datetime.datetime(2026, 5, 30, 3, 52, 35), datetime.datetime(2026, 5, 30, 3, 52, 35), 'salt', 10.88, 47.97, None, 16.66, 346.57, 10.58, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:52:47.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:52:47.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:52:47.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:52:35, diff=12.930478s, valid=True
2026-05-30T03:52:47.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:52:47.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:52:47.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:53:12, diff=-24.066179s, valid=True
2026-05-30T03:52:47.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:52:47.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:52:47.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:52:30, diff=17.941724s, valid=True
2026-05-30T03:52:47.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:52:47.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:52:47.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:52:47.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:52:47.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:52:47.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:52:47.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:53:12, diff=-24.054751s, valid=True
2026-05-30T03:52:47.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:52:47.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:52:47.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:52:47.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038609.946024s, valid=True
2026-05-30T03:52:47.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:52:47.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:52:47.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:52:47.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:52:47.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:52:48.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:52:48.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:52:48.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:52:48.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:52:48.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:52:48.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:52:48.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:52:48.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:52:48.273 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:52:48.485 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:52:48.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:52:48.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:52:48.934 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:52:48.934 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:52:49.126 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:52:49.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:53:19.156 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:53:19.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:53:19.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:53:19.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:53:19.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:53:19.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:53:19.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-05-30T03:53:19.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:53:19.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-05-30T03:53:19.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:53:19.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:53:19.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:53:19.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T03:53:22.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-05-30T03:53:22.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:53:22.342 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:53:22.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:53:22.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:53:22.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:53:22.366 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:53:22.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:53:22.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:53:22.367 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:53:22.368 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:53:22.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:53:22.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:53:22.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:53:22.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:53:22.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:53:22.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:53:22.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:53:22.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:53:22.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:53:22.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:53:22.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:53:22.693 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:53:22.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:53:06
2026-05-30T03:53:22.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73671, datetime.datetime(2026, 5, 30, 3, 53, 6), datetime.datetime(2026, 5, 30, 3, 53, 5), 'salt', 11.01, 47.91, None, 17.57, 341.24, 10.6, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:53:22.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:53:22.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:53:22.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:53:05, diff=17.761833s, valid=True
2026-05-30T03:53:22.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:53:22.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:53:22.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:53:12, diff=10.765199s, valid=True
2026-05-30T03:53:22.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:53:22.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:53:22.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:53:01, diff=21.773168s, valid=True
2026-05-30T03:53:22.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:53:22.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:53:22.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:53:22.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:53:22.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:53:22.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:53:22.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:53:12, diff=10.776773s, valid=True
2026-05-30T03:53:22.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:53:22.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:53:22.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:53:22.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038644.777547s, valid=True
2026-05-30T03:53:22.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:53:22.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:53:22.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:53:22.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:53:22.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:53:22.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:53:22.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:53:22.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:53:22.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:53:22.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:53:22.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:53:23.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:53:23.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:53:23.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:53:23.309 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:53:23.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:53:23.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:53:23.763 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:53:23.763 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:53:24.014 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:53:24.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:53:54.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:53:54.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:53:54.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:53:54.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:53:54.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:53:54.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:53:54.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-05-30T03:53:54.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:53:54.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-05-30T03:53:54.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:53:54.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:53:54.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:53:54.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-05-30T03:53: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-05-30T03:53:57.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:53:57.387 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:53:57.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:53:57.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:53:57.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:53:57.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:53:57.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:53:57.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:53:57.411 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:53:57.412 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:53:57.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:53:57.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:53:57.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:53:57.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:53:57.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:53:57.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:53:57.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:53:57.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:53:57.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:53:57.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:53:57.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:53:57.742 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:53:57.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:53:36
2026-05-30T03:53:57.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73672, datetime.datetime(2026, 5, 30, 3, 53, 36), datetime.datetime(2026, 5, 30, 3, 53, 36), 'salt', 10.91, 48.04, None, 15.53, 324.95, 10.56, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:53:57.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:53:57.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:53:57.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:53:36, diff=21.81714s, valid=True
2026-05-30T03:53:57.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:53:57.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:53:57.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:54:12, diff=-14.179335s, valid=True
2026-05-30T03:53:57.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:53:57.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:53:57.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:53:33, diff=24.828909s, valid=True
2026-05-30T03:53:57.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:53:57.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:53:57.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:53:57.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:53:57.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:53:57.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:53:57.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:54:12, diff=-14.167358s, valid=True
2026-05-30T03:53:57.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:53:57.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:53:57.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:53:57.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038679.833449s, valid=True
2026-05-30T03:53:57.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:53:57.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:53:57.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:53:57.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:53:57.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:53:57.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:53:57.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:53:57.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:53:57.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:53:57.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:53:58.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:53:58.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:53:58.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:53:58.160 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:53:58.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:53:58.779 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:53:58.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:53:58.881 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:53:58.881 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:53:59.119 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:53:59.119 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:54:29.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:54:29.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:54:29.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:54:29.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:54:29.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:54:29.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:54:29.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-05-30T03:54:29.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:54:29.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-05-30T03:54:29.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:54:29.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:54:29.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:54:29.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-05-30T03:54:33.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-05-30T03:54:33.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:54:33.792 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:54:33.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:54:33.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:54:33.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:54:33.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:54:33.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:54:33.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:54:33.817 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:54:33.818 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:54:33.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:54:33.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:54:33.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:54:34.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:54:34.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:54:34.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:54:34.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:54:34.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:54:34.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:54:34.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:54:34.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:54:34.145 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:54:34.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:54:06
2026-05-30T03:54:34.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73673, datetime.datetime(2026, 5, 30, 3, 54, 6), datetime.datetime(2026, 5, 30, 3, 54, 6), 'salt', 11.01, 47.81, None, 15.81, 335.35, 10.63, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:54:34.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:54:34.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:54:34.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:54:06, diff=28.214273s, valid=True
2026-05-30T03:54:34.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:54:34.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:54:34.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:54:12, diff=22.217827s, valid=True
2026-05-30T03:54:34.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:54:34.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:54:34.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:54:04, diff=30.225779s, valid=True
2026-05-30T03:54:34.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:54:34.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:54:34.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:54:34.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:54:34.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:54:34.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:54:34.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:54:12, diff=22.229126s, valid=True
2026-05-30T03:54:34.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:54:34.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:54:34.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:54:34.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038716.229889s, valid=True
2026-05-30T03:54:34.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:54:34.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:54:34.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:54:34.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:54:34.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:54:34.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:54:34.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:54:34.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:54:34.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:54:34.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:54:34.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:54:34.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:54:34.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:54:34.549 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:54:34.762 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:54:35.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:54:35.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:54:35.206 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:54:35.206 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:54:35.452 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:54:35.453 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:55:05.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:55:05.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:55:05.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:55:05.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:55:05.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:55:06.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:55:06.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T03:55:06.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:55:06.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-05-30T03:55:06.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:55:06.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:55:06.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:55:06.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-05-30T03:55:08.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-05-30T03:55:08.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:55:08.468 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:55:08.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:55:08.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:55:08.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:55:08.489 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:55:08.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:55:08.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:55:08.489 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:55:08.489 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:55:08.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:55:08.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:55:08.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:55:08.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:55:08.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:55:08.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:55:08.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:55:08.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:55:08.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:55:08.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:55:08.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:55:08.745 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:55:08.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:55:07
2026-05-30T03:55:08.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73675, datetime.datetime(2026, 5, 30, 3, 55, 7), datetime.datetime(2026, 5, 30, 3, 55, 6), 'salt', 10.95, 48.44, None, 12.95, 353.14, 10.45, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:55:08.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:55:08.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:55:08.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:55:06, diff=2.812325s, valid=True
2026-05-30T03:55:08.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:55:08.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:55:08.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:55:12, diff=-3.184558s, valid=True
2026-05-30T03:55:08.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:55:08.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:55:08.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:54:58, diff=10.822838s, valid=True
2026-05-30T03:55:08.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:55:08.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:55:08.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:55:08.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:55:08.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:55:08.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:55:08.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:55:12, diff=-3.173799s, valid=True
2026-05-30T03:55:08.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:55:08.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:55:08.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:55:08.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038750.82695s, valid=True
2026-05-30T03:55:08.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:55:08.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:55:08.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:55:08.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:55:08.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:55:08.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:55:08.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:55:08.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:55:08.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:55:08.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:55:09.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:55:09.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:55:09.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:55:09.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:55:09.437 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:55:09.781 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:55:09.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:55:09.891 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:55:09.891 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:55:10.067 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:55:10.068 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:55:40.097 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:55:40.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:55:40.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:55:40.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:55:40.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:55:40.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:55:40.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-05-30T03:55:40.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:55:40.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-05-30T03:55:40.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:55:40.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:55:40.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:55:40.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-05-30T03:55:42.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-05-30T03:55:42.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:55:42.990 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:55:42.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:55:43.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:55:43.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:55:43.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:55:43.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:55:43.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:55:43.016 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:55:43.016 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:55:43.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:55:43.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:55:43.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:55:43.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:55:43.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:55:43.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:55:43.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:55:43.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:55:43.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:55:43.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:55:43.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:55:43.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:55:43.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:55:37
2026-05-30T03:55:43.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73676, datetime.datetime(2026, 5, 30, 3, 55, 37), datetime.datetime(2026, 5, 30, 3, 55, 37), 'salt', 10.75, 48.57, None, 16.94, 338.33, 10.4, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:55:43.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:55:43.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:55:43.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:55:37, diff=6.40451s, valid=True
2026-05-30T03:55:43.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:55:43.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:55:43.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:56:12, diff=-28.591739s, valid=True
2026-05-30T03:55:43.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:55:43.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:55:43.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:55:28, diff=15.416951s, valid=True
2026-05-30T03:55:43.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:55:43.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:55:43.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:55:43.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:55:43.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:55:43.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:55:43.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:56:12, diff=-28.579125s, valid=True
2026-05-30T03:55:43.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:55:43.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:55:43.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:55:43.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038785.421782s, valid=True
2026-05-30T03:55:43.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:55:43.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:55:43.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:55:43.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:55:43.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:55:43.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:55:43.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:55:43.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:55:43.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:55:43.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:55:43.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:55:43.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:55:43.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:55:43.748 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:55:43.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:55:44.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:55:44.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:55:44.405 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:55:44.405 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:55:45.882 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:55:45.882 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:56:15.892 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:56:15.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:56:15.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:56:16.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:56:16.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:56:16.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:56:16.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-05-30T03:56:16.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:56:16.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-05-30T03:56:16.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:56:16.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:56:16.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:56:16.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-05-30T03:56:19.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T03:56:19.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:56:19.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:56:19.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:56:19.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:56:19.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:56:19.247 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:56:19.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:56:19.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:56:19.248 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:56:19.248 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:56:19.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:56:19.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:56:19.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:56:19.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:56:19.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:56:19.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:56:19.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:56:19.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:56:19.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:56:19.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:56:19.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:56:19.566 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:56:19.635 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:56:07
2026-05-30T03:56:19.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73677, datetime.datetime(2026, 5, 30, 3, 56, 7), datetime.datetime(2026, 5, 30, 3, 56, 7), 'salt', 10.71, 49.1, None, 15.77, 346.95, 10.24, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:56:19.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:56:19.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:56:19.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:56:07, diff=12.642628s, valid=True
2026-05-30T03:56:19.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:56:19.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:56:19.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:56:12, diff=7.646126s, valid=True
2026-05-30T03:56:19.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:56:19.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:56:19.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:55:59, diff=20.654313s, valid=True
2026-05-30T03:56:19.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:56:19.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:56:19.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:56:19.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:56:19.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:56:19.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:56:19.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:56:12, diff=7.658062s, valid=True
2026-05-30T03:56:19.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:56:19.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:56:19.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:56:19.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038821.658881s, valid=True
2026-05-30T03:56:19.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:56:19.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:56:19.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:56:19.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:56:19.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:56:19.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:56:19.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:56:19.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:56:19.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:56:19.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:56:19.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:56:19.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:56:20.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:56:20.072 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:56:20.292 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:56:20.639 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:56:20.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:56:20.738 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:56:20.739 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:56:21.003 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:56:21.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:56:51.028 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:56:51.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:56:51.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:56:51.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:56:51.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:56:51.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:56:51.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-05-30T03:56:51.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:56:51.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-05-30T03:56:51.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:56:51.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:56:51.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:56:51.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-05-30T03:56:54.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-05-30T03:56:54.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:56:54.251 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:56:54.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:56:54.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:56:54.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:56:54.274 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:56:54.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:56:54.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:56:54.275 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:56:54.275 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:56:54.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:56:54.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:56:54.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:56:54.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:56:54.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:56:54.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:56:54.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:56:54.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:56:54.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:56:54.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:56:54.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:56:54.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:56:54.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:56:37
2026-05-30T03:56:54.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73678, datetime.datetime(2026, 5, 30, 3, 56, 37), datetime.datetime(2026, 5, 30, 3, 56, 37), 'salt', 10.68, 49.33, None, 11.5, 335.59, 10.17, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:56:54.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:56:54.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:56:54.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:56:37, diff=17.67332s, valid=True
2026-05-30T03:56:54.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:56:54.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:56:54.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:57:12, diff=-17.323143s, valid=True
2026-05-30T03:56:54.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:56:54.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:56:54.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:56:31, diff=23.685183s, valid=True
2026-05-30T03:56:54.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:56:54.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:56:54.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:56:54.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:56:54.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:56:54.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:56:54.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:57:12, diff=-17.311072s, valid=True
2026-05-30T03:56:54.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:56:54.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:56:54.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:56:54.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038856.689749s, valid=True
2026-05-30T03:56:54.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:56:54.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:56:54.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:56:54.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:56:54.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:56:54.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:56:54.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:56:54.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:56:54.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:56:54.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:56:54.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:56:54.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:56:54.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:56:55.012 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:56:55.223 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:56:55.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:56:55.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:56:55.669 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:56:55.669 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:56:55.941 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:56:55.941 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:57:25.972 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:57:25.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:57:25.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:57:26.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:57:26.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:57:26.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:57:26.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T03:57:26.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:57:26.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-05-30T03:57:26.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:57:26.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:57:26.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:57:26.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-05-30T03:57:55.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-05-30T03:57:55.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:57:55.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:57:55.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:57:55.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:57:55.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:57:55.968 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:57:55.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:57:55.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:57:55.969 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:57:55.969 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:57:55.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:57:56.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:57:56.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:57:56.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:57:56.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:57:56.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:57:56.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:57:56.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:57:56.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:57:56.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:57:56.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:57:56.288 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:57:56.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:57:38
2026-05-30T03:57:56.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73680, datetime.datetime(2026, 5, 30, 3, 57, 38), datetime.datetime(2026, 5, 30, 3, 57, 38), 'salt', 10.71, 48.8, None, 15.67, 334.81, 10.32, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:57:56.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:57:56.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:57:56.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:57:38, diff=18.35603s, valid=True
2026-05-30T03:57:56.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:57:56.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:57:56.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:58:12, diff=-15.640703s, valid=True
2026-05-30T03:57:56.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:57:56.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:57:56.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:57:33, diff=23.367004s, valid=True
2026-05-30T03:57:56.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:57:56.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:57:56.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:57:56.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:57:56.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:57:56.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:57:56.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:58:12, diff=-15.629481s, valid=True
2026-05-30T03:57:56.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:57:56.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:57:56.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:57:56.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038918.371306s, valid=True
2026-05-30T03:57:56.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:57:56.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:57:56.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:57:56.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:57:56.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:57:56.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:57:56.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:57:56.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:57:56.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:57:56.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:57:56.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:57:56.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:57:56.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:57:56.762 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:57:56.979 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:57:57.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:57:57.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:57:57.426 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:57:57.426 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:57:57.687 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:57:57.687 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:58:27.717 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:58:27.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:58:27.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:58:27.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:58:27.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:58:28.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:58:28.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-05-30T03:58:28.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:58:28.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-05-30T03:58:28.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:58:28.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:58:28.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:58:28.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-05-30T03:58:30.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-05-30T03:58:30.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:58:30.938 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:58:30.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:58:30.949 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:58:30.961 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:58:30.962 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:58:30.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:58:30.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:58:30.963 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:58:30.963 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:58:30.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:58:31.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:58:31.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:58:31.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:58:31.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:58:31.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:58:31.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:58:31.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:58:31.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:58:31.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:58:31.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:58:31.296 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:58:31.367 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:58:08
2026-05-30T03:58:31.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73681, datetime.datetime(2026, 5, 30, 3, 58, 8), datetime.datetime(2026, 5, 30, 3, 58, 8), 'salt', 10.75, 48.31, None, 13.94, 345.52, 10.47, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:58:31.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:58:31.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:58:31.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:58:08, diff=23.374991s, valid=True
2026-05-30T03:58:31.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:58:31.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:58:31.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:58:12, diff=19.378496s, valid=True
2026-05-30T03:58:31.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:58:31.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:58:31.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:58:05, diff=26.386641s, valid=True
2026-05-30T03:58:31.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:58:31.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:58:31.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:58:31.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:58:31.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:58:31.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:58:31.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:58:12, diff=19.390319s, valid=True
2026-05-30T03:58:31.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:58:31.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:58:31.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:58:31.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038953.391126s, valid=True
2026-05-30T03:58:31.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:58:31.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:58:31.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:58:31.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:58:31.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:58:31.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:58:31.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:58:31.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:58:31.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:58:31.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:58:31.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:58:31.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:58:31.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:58:31.720 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:58:31.938 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:58:32.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:58:32.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:58:32.433 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:58:32.434 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:58:32.669 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:58:32.669 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:59:02.700 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:59:02.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:59:02.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:59:02.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:59:02.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:59:03.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:59:03.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-05-30T03:59:03.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:59:03.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-05-30T03:59:03.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:59:03.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:59:03.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:59:03.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-05-30T03:59:05.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-05-30T03:59:05.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:59:05.398 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:59:05.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:59:05.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:59:05.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:59:05.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:59:05.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:59:05.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:59:05.425 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:59:05.425 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:59:05.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:59:05.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T03:59:05.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:59:05.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T03:59:05.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:59:05.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:59:05.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:59:05.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T03:59:05.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:59:05.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:59:05.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:59:05.748 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:59:05.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:58:38
2026-05-30T03:59:05.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73682, datetime.datetime(2026, 5, 30, 3, 58, 38), datetime.datetime(2026, 5, 30, 3, 58, 38), 'salt', 10.88, 48.14, None, 16.8, 346.88, 10.53, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:59:05.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:59:05.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T03:59:05.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:58:38, diff=27.816878s, valid=True
2026-05-30T03:59:05.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:59:05.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:59:05.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:59:12, diff=-6.179554s, valid=True
2026-05-30T03:59:05.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:59:05.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T03:59:05.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:58:37, diff=28.828887s, valid=True
2026-05-30T03:59:05.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:59:05.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:59:05.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:59:05.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:59:05.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:59:05.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T03:59:05.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:59:12, diff=-6.167338s, valid=True
2026-05-30T03:59:05.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:59:05.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:59:05.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:59:05.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1038987.833484s, valid=True
2026-05-30T03:59:05.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:59:05.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:59:05.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:59:05.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:59:05.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:59:05.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:59:05.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:59:05.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:59:05.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:59:06.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:59:06.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:59:06.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:59:06.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:59:06.220 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:59:06.441 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:59:06.786 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:59:06.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:59:06.887 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:59:06.887 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:59:07.081 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:59:07.081 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T03:59:37.112 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T03:59:37.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T03:59:37.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T03:59:37.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T03:59:37.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T03:59:37.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T03:59:37.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-05-30T03:59:37.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T03:59:37.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-05-30T03:59:37.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T03:59:37.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T03:59:37.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T03:59:37.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-05-30T03:59:40.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T03:59:40.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T03:59:40.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T03:59:40.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T03:59:40.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T03:59:40.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T03:59:40.218 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T03:59:40.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T03:59:40.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T03:59:40.220 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T03:59:40.220 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T03:59:40.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T03:59:40.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T03:59:40.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T03:59:40.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T03:59:40.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:59:40.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:59:40.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T03:59:40.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T03:59:40.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T03:59:40.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T03:59:40.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T03:59:40.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T03:59:40.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 03:59:39
2026-05-30T03:59:40.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73684, datetime.datetime(2026, 5, 30, 3, 59, 39), datetime.datetime(2026, 5, 30, 3, 59, 38), 'salt', 11.01, 47.51, None, 18.1, 337.72, 10.72, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T03:59:40.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T03:59:40.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T03:59:40.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:59:38, diff=2.618457s, valid=True
2026-05-30T03:59:40.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T03:59:40.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:59:40.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:00:12, diff=-31.377952s, valid=True
2026-05-30T03:59:40.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T03:59:40.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T03:59:40.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 03:59:30, diff=10.63042s, valid=True
2026-05-30T03:59:40.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T03:59:40.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:59:40.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T03:59:40.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T03:59:40.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T03:59:40.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T03:59:40.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:00:12, diff=-31.365636s, valid=True
2026-05-30T03:59:40.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T03:59:40.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T03:59:40.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T03:59:40.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039022.635281s, valid=True
2026-05-30T03:59:40.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T03:59:40.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T03:59:40.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T03:59:40.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T03:59:40.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T03:59:40.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T03:59:40.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T03:59:40.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T03:59:40.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T03:59:40.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T03:59:40.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T03:59:40.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T03:59:40.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T03:59:40.956 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T03:59:41.168 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:59:41.513 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T03:59:41.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T03:59:41.614 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T03:59:41.614 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T03:59:41.871 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T03:59:41.872 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:00:11.894 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:00:11.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:00:11.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:00:12.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:00:12.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:00:12.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:00:12.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-05-30T04:00:12.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:00:12.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-05-30T04:00:12.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:00:12.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:00:12.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:00:12.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-05-30T04:00:15.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-05-30T04:00:15.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:00:15.064 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:00:15.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:00:15.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:00:15.088 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:00:15.089 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:00:15.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:00:15.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:00:15.090 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:00:15.090 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:00:15.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:00:15.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:00:15.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:00:15.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:00:15.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:00:15.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:00:15.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:00:15.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:00:15.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:00:15.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:00:15.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:00:15.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:00:15.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:00:09
2026-05-30T04:00:15.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73685, datetime.datetime(2026, 5, 30, 4, 0, 9), datetime.datetime(2026, 5, 30, 4, 0, 9), 'salt', 10.98, 47.01, None, 16.76, 330.31, 10.87, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:00:15.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:00:15.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:00:15.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:00:09, diff=6.484353s, valid=True
2026-05-30T04:00:15.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:00:15.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:00:15.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:00:12, diff=3.48794s, valid=True
2026-05-30T04:00:15.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:00:15.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:00:15.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:00:00, diff=15.496165s, valid=True
2026-05-30T04:00:15.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:00:15.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:00:15.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:00:15.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:00:15.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:00:15.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:00:15.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:00:12, diff=3.499928s, valid=True
2026-05-30T04:00:15.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:00:15.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:00:15.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:00:15.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039057.500768s, valid=True
2026-05-30T04:00:15.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:00:15.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:00:15.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:00:15.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:00:15.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:00:15.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:00:15.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:00:15.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:00:15.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:00:15.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:00:15.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:00:15.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:00:15.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:00:15.825 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:00:16.037 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:00:16.380 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:00:16.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:00:16.480 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:00:16.480 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:00:16.741 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:00:16.741 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:00:46.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:00:46.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:00:46.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:00:46.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:00:47.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:00:47.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:00:47.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-05-30T04:00:47.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:00:47.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-05-30T04:00:47.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:00:47.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:00:47.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:00:47.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-05-30T04:00:49.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-05-30T04:00:49.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:00:49.546 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:00:49.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:00:49.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:00:49.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:00:49.569 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:00:49.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:00:49.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:00:49.570 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:00:49.570 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:00:49.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:00:49.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:00:49.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:00:49.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:00:49.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:00:49.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:00:49.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:00:49.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:00:49.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:00:49.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:00:49.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:00:49.894 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:00:49.959 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:00:39
2026-05-30T04:00:49.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73686, datetime.datetime(2026, 5, 30, 4, 0, 39), datetime.datetime(2026, 5, 30, 4, 0, 39), 'salt', 11.08, 47.11, None, 17.54, 340.21, 10.85, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:00:49.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:00:49.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:00:49.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:00:39, diff=10.965587s, valid=True
2026-05-30T04:00:49.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:00:49.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:00:49.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:01:12, diff=-22.031447s, valid=True
2026-05-30T04:00:49.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:00:49.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:00:49.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:00:32, diff=17.975387s, valid=True
2026-05-30T04:00:49.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:00:49.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:00:49.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:00:49.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:00:49.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:00:49.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:00:49.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:01:12, diff=-22.021418s, valid=True
2026-05-30T04:00:49.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:00:49.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:00:49.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:00:49.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039091.979252s, valid=True
2026-05-30T04:00:49.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:00:49.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:00:49.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:00:49.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:00:49.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:00:50.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:00:50.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:00:50.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:00:50.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:00:50.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:00:50.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:00:50.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:00:50.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:00:50.382 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:00:50.607 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:00:51.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:00:51.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:00:51.127 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:00:51.127 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:00:51.371 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:00:51.371 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:01:21.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:01:21.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:01:21.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:01:21.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:01:21.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:01:21.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:01: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-05-30T04:01:21.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:01:21.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-05-30T04:01:21.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:01:21.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:01:21.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:01:21.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-05-30T04:01:49.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-05-30T04:01:49.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:01:49.829 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:01:49.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:01:49.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:01:49.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:01:49.847 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:01:49.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:01:49.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:01:49.848 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:01:49.848 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:01:49.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:01:49.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:01:49.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:01:50.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:01:50.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:01:50.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:01:50.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:01:50.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:01:50.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:01:50.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:01:50.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:01:50.142 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:01:50.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:01:40
2026-05-30T04:01:50.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73688, datetime.datetime(2026, 5, 30, 4, 1, 40), datetime.datetime(2026, 5, 30, 4, 1, 40), 'salt', 11.21, 46.85, None, 16.62, 341.76, 10.93, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:01:50.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:01:50.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:01:50.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:01:40, diff=10.213337s, valid=True
2026-05-30T04:01:50.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:01:50.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:01:50.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:02:12, diff=-21.783679s, valid=True
2026-05-30T04:01:50.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:01:50.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:01:50.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:01:35, diff=15.223112s, valid=True
2026-05-30T04:01:50.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:01:50.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:01:50.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:01:50.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:01:50.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:01:50.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:01:50.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:02:12, diff=-21.773691s, valid=True
2026-05-30T04:01:50.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:01:50.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:01:50.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:01:50.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039152.227003s, valid=True
2026-05-30T04:01:50.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:01:50.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:01:50.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:01:50.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:01:50.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:01:50.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:01:50.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:01:50.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:01:50.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:01:50.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:01:50.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:01:50.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:01:50.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:01:50.542 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:01:50.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:01:51.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:01:51.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:01:51.214 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:01:51.215 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:01:51.415 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:01:51.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:02:21.445 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:02:21.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:02:21.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:02:21.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:02:21.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:02:22.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:02:22.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-05-30T04:02:22.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:02:22.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-05-30T04:02:22.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:02:22.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:02:22.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:02:22.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-05-30T04:02:45.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-05-30T04:02:45.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:02:45.311 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:02:45.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:02:45.322 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:02:45.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:02:45.335 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:02:45.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:02:45.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:02:45.337 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:02:45.337 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:02:45.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:02:45.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:02:45.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:02:45.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:02:45.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:02:45.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T04:02:45.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:02:45.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T04:02:45.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:02:45.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:02:45.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:02:45.727 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:02:45.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:02:40
2026-05-30T04:02:45.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73690, datetime.datetime(2026, 5, 30, 4, 2, 40), datetime.datetime(2026, 5, 30, 4, 2, 40), 'salt', 11.21, 46.88, None, 15.6, 343.89, 10.92, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:02:45.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:02:45.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:02:45.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:02:40, diff=5.83716s, valid=True
2026-05-30T04:02:45.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:02:45.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T04:02:45.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:03:12, diff=-26.159755s, valid=True
2026-05-30T04:02:45.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:02:45.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:02:45.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:02:39, diff=6.847152s, valid=True
2026-05-30T04:02:45.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:02:45.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:02:45.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:02:45.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:02:45.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:02:45.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T04:02:45.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:03:12, diff=-26.149708s, valid=True
2026-05-30T04:02:45.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:02:45.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:02:45.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:02:45.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039207.850982s, valid=True
2026-05-30T04:02:45.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:02:45.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:02:45.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:02:45.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:02:45.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:02:45.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:02:45.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:02:45.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:02:45.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:02:45.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:02:46.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:02:46.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:02:46.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:02:46.168 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:02:46.452 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:02:46.795 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:02:46.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:02:46.895 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:02:46.895 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:02:47.089 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:02:47.089 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:03:17.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:03:17.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:03:17.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:03:17.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:03:17.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:03:17.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:03:17.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-05-30T04:03:17.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:03:17.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-05-30T04:03:17.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:03:17.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:03:17.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:03:17.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-05-30T04:03:40.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-05-30T04:03:40.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:03:40.825 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:03:40.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:03:40.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:03:40.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:03:40.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:03:40.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:03:40.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:03:40.851 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:03:40.851 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:03:40.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:03:40.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:03:40.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:03:41.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:03:41.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:03:41.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:03:41.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:03:41.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:03:41.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:03:41.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:03:41.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:03:41.195 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:03:41.261 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:03:11
2026-05-30T04:03:41.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73691, datetime.datetime(2026, 5, 30, 4, 3, 11), datetime.datetime(2026, 5, 30, 4, 3, 10), 'salt', 11.21, 46.78, None, 16.66, 337.35, 10.95, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:03:41.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:03:41.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:03:41.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:03:40, diff=1.269181s, valid=True
2026-05-30T04:03:41.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:03:41.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:03:41.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:03:12, diff=29.272659s, valid=True
2026-05-30T04:03:41.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:03:41.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:03:41.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:03:32, diff=9.280961s, valid=True
2026-05-30T04:03:41.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:03:41.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:03:41.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:03:41.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:03:41.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:03:41.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:03:41.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:03:12, diff=29.28467s, valid=True
2026-05-30T04:03:41.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:03:41.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:03:41.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:03:41.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039263.285459s, valid=True
2026-05-30T04:03:41.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:03:41.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:03:41.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:03:41.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:03:41.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:03:41.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:03:41.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:03:41.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:03:41.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:03:41.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:03:41.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:03:41.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:03:41.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:03:41.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:03:41.828 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:03:42.174 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:03:42.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:03:42.276 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:03:42.276 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:03:42.463 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:03:42.463 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:04:12.467 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:04:12.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:04:12.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:04:12.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:04:12.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:04:12.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:04:12.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-05-30T04:04:13.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:04:13.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-05-30T04:04:13.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:04:13.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:04:13.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:04:13.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-05-30T04:04:17.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-05-30T04:04:17.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:04:17.099 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:04:17.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:04:17.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:04:17.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:04:17.124 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:04:17.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:04:17.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:04:17.125 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:04:17.125 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:04:17.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:04:17.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:04:17.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:04:17.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:04:17.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:04:17.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:04:17.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:04:17.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:04:17.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:04:17.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:04:17.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:04:17.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:04:17.503 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:04:11
2026-05-30T04:04:17.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73693, datetime.datetime(2026, 5, 30, 4, 4, 11), datetime.datetime(2026, 5, 30, 4, 4, 11), 'salt', 11.11, 47.48, None, 14.36, 337.09, 10.74, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:04:17.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:04:17.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:04:17.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:04:11, diff=6.511006s, valid=True
2026-05-30T04:04:17.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:04:17.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:04:17.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:04:12, diff=5.514403s, valid=True
2026-05-30T04:04:17.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:04:17.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:04:17.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:04:02, diff=15.522511s, valid=True
2026-05-30T04:04:17.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:04:17.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:04:17.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:04:17.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:04:17.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:04:17.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:04:17.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:04:12, diff=5.526172s, valid=True
2026-05-30T04:04:17.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:04:17.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:04:17.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:04:17.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039299.526977s, valid=True
2026-05-30T04:04:17.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:04:17.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:04:17.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:04:17.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:04:17.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:04:17.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:04:17.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:04:17.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:04:17.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:04:17.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:04:17.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:04:17.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:04:17.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:04:17.920 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:04:18.134 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:04:18.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:04:18.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:04:18.581 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:04:18.582 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:04:18.833 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:04:18.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:04:48.837 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:04:48.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:04:48.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:04:49.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:04:49.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:04:49.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:04:49.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-05-30T04:04:49.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:04:49.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-05-30T04:04:49.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:04:49.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:04:49.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:04:49.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-05-30T04:04:51.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-05-30T04:04:51.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:04:51.863 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:04:51.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:04:51.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:04:51.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:04:51.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:04:51.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:04:51.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:04:51.887 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:04:51.888 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:04:51.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:04:52.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:04:52.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:04:52.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:04:52.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:04:52.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:04:52.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:04:52.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:04:52.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:04:52.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:04:52.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:04:52.214 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:04:52.278 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:04:41
2026-05-30T04:04:52.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73694, datetime.datetime(2026, 5, 30, 4, 4, 41), datetime.datetime(2026, 5, 30, 4, 4, 41), 'salt', 11.01, 47.58, None, 15.28, 337.74, 10.7, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:04:52.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:04:52.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:04:52.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:04:41, diff=11.285826s, valid=True
2026-05-30T04:04:52.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:04:52.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:04:52.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:05:12, diff=-19.710628s, valid=True
2026-05-30T04:04:52.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:04:52.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:04:52.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:04:34, diff=18.297556s, valid=True
2026-05-30T04:04:52.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:04:52.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:04:52.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:04:52.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:04:52.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:04:52.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:04:52.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:05:12, diff=-19.698592s, valid=True
2026-05-30T04:04:52.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:04:52.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:04:52.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:04:52.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039334.302241s, valid=True
2026-05-30T04:04:52.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:04:52.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:04:52.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:04:52.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:04:52.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:04:52.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:04:52.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:04:52.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:04:52.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:04:52.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:04:52.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:04:52.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:04:52.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:04:52.625 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:04:52.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:04:53.180 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:04:53.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:04:53.280 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:04:53.280 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:04:53.536 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:04:53.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:05:23.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:05:23.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:05:23.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:05:23.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:05:23.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:05:24.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:05:24.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T04:05:24.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:05:24.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T04:05:24.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:05:24.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:05:24.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:05:24.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T04:05:27.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-05-30T04:05:27.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:05:27.587 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:05:27.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:05:27.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:05:27.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:05:27.604 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:05:27.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:05:27.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:05:27.605 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:05:27.605 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:05:27.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:05:27.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:05:27.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:05:27.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:05:27.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:05:27.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:05:27.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:05:27.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:05:27.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:05:27.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:05:27.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:05:27.929 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:05:27.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:05:12
2026-05-30T04:05:27.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73695, datetime.datetime(2026, 5, 30, 4, 5, 12), datetime.datetime(2026, 5, 30, 4, 5, 11), 'salt', 11.08, 47.48, None, 15.14, 349.01, 10.74, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:05:27.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:05:27.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:05:28.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:05:11, diff=17.000239s, valid=True
2026-05-30T04:05:28.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:05:28.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:05:28.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:05:12, diff=16.003788s, valid=True
2026-05-30T04:05:28.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:05:28.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:05:28.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:05:05, diff=23.012048s, valid=True
2026-05-30T04:05:28.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:05:28.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:05:28.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:05:28.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:05:28.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:05:28.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:05:28.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:05:12, diff=16.015818s, valid=True
2026-05-30T04:05:28.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:05:28.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:05:28.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:05:28.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039370.016657s, valid=True
2026-05-30T04:05:28.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:05:28.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:05:28.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:05:28.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:05:28.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:05:28.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:05:28.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:05:28.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:05:28.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:05:28.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:05:28.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:05:28.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:05:28.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:05:28.410 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:05:28.626 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:05:28.974 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:05:29.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:05:29.076 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:05:29.076 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:05:29.327 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:05:29.327 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:05:59.357 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:05:59.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:05:59.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:05:59.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:05:59.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:05:59.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:05:59.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-05-30T04:05:59.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:05:59.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-05-30T04:05:59.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:05:59.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:05:59.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:05:59.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-05-30T04:06: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-05-30T04:06:04.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:06:04.306 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:06:04.306 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:06:04.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:06:04.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:06:04.331 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:06:04.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:06:04.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:06:04.333 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:06:04.333 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:06:04.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:06:04.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:06:04.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:06:04.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:06:04.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:06:04.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:06:04.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:06:04.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:06:04.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:06:04.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:06:04.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:06:04.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:06:04.731 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:05:42
2026-05-30T04:06:04.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73696, datetime.datetime(2026, 5, 30, 4, 5, 42), datetime.datetime(2026, 5, 30, 4, 5, 42), 'salt', 11.05, 47.31, None, 16.13, 355.35, 10.79, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:06:04.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:06:04.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:06:04.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:05:42, diff=22.740168s, valid=True
2026-05-30T04:06:04.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:06:04.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:06:04.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:06:12, diff=-7.256399s, valid=True
2026-05-30T04:06:04.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:06:04.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:06:04.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:05:37, diff=27.751919s, valid=True
2026-05-30T04:06:04.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:06:04.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:06:04.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:06:04.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:06:04.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:06:04.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:06:04.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:06:12, diff=-7.244329s, valid=True
2026-05-30T04:06:04.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:06:04.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:06:04.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:06:04.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039406.756502s, valid=True
2026-05-30T04:06:04.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:06:04.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:06:04.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:06:04.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:06:04.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:06:04.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:06:04.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:06:04.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:06:04.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:06:04.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:06:04.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:06:04.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:06:05.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:06:05.081 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:06:05.298 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:06:05.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:06:05.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:06:05.781 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:06:05.782 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:06:06.701 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:06:06.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:06:36.713 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:06:36.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:06:36.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:06:37.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:06:37.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:06:37.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:06:37.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-05-30T04:06:37.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:06:37.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-05-30T04:06:37.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:06:37.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:06:37.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:06:37.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-05-30T04:06:41.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-05-30T04:06:41.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:06:41.676 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:06:41.676 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:06:41.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:06:41.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:06:41.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:06:41.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:06:41.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:06:41.701 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:06:41.701 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:06:41.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:06:41.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:06:41.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:06:41.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:06:41.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:06:41.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:06:41.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:06:42.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:06:42.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:06:42.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:06:42.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:06:42.011 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:06:42.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:06:12
2026-05-30T04:06:42.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73697, datetime.datetime(2026, 5, 30, 4, 6, 12), datetime.datetime(2026, 5, 30, 4, 6, 12), 'salt', 11.15, 47.18, None, 17.26, 338.64, 10.84, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:06:42.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:06:42.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:06:42.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:06:12, diff=30.080934s, valid=True
2026-05-30T04:06:42.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:06:42.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:06:42.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:06:12, diff=30.084309s, valid=True
2026-05-30T04:06:42.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:06:42.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:06:42.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:06:08, diff=34.092355s, valid=True
2026-05-30T04:06:42.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:06:42.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:06:42.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:06:42.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:06:42.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:06:42.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:06:42.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:06:12, diff=30.09599s, valid=True
2026-05-30T04:06:42.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:06:42.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:06:42.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:06:42.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039444.096797s, valid=True
2026-05-30T04:06:42.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:06:42.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:06:42.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:06:42.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:06:42.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:06:42.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:06:42.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:06:42.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:06:42.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:06:42.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:06:42.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:06:42.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:06:42.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:06:42.486 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:06:42.700 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:06:43.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:06:43.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:06:43.145 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:06:43.145 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:06:43.402 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:06:43.402 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:07:13.431 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:07:13.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:07:13.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:07:13.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:07:13.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:07:13.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:07:13.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-05-30T04:07:13.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:07:13.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-05-30T04:07:13.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:07:13.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:07:13.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:07:13.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T04:07:19.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-05-30T04:07:19.077 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:07:19.078 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:07:19.078 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:07:19.088 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:07:19.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:07:19.101 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:07:19.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:07:19.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:07:19.103 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:07:19.103 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:07:19.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:07:19.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:07:19.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:07:19.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:07:19.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:07:19.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:07:19.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:07:19.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:07:19.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:07:19.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:07:19.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:07:19.435 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:07:19.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:07:13
2026-05-30T04:07:19.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73699, datetime.datetime(2026, 5, 30, 4, 7, 13), datetime.datetime(2026, 5, 30, 4, 7, 12), 'salt', 11.15, 47.44, None, 16.97, 333.28, 10.76, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:07:19.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:07:19.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:07:19.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:07:12, diff=7.507257s, valid=True
2026-05-30T04:07:19.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:07:19.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:07:19.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:07:12, diff=7.51045s, valid=True
2026-05-30T04:07:19.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:07:19.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:07:19.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:07:11, diff=8.518249s, valid=True
2026-05-30T04:07:19.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:07:19.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:07:19.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:07:19.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:07:19.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:07:19.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:07:19.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:07:12, diff=7.521689s, valid=True
2026-05-30T04:07:19.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:07:19.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:07:19.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:07:19.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039481.522432s, valid=True
2026-05-30T04:07:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:07:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:07:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:07:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:07:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:07:19.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:07:19.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:07:19.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:07:19.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:07:19.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:07:19.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:07:19.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:07:19.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:07:19.845 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:07:20.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:07:20.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:07:20.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:07:20.522 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:07:20.523 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:07:20.693 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:07:20.693 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:07:50.723 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:07:50.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:07:50.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:07:51.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:07:51.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:07:51.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:07:51.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-05-30T04:07:51.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:07: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-05-30T04:07:51.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:07:51.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:07:51.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:07:51.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-05-30T04:07:53.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-05-30T04:07:53.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:07:53.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:07:53.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:07:53.654 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:07:53.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:07:53.667 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:07:53.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:07:53.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:07:53.668 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:07:53.668 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:07:53.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:07:53.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:07:53.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:07:53.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:07:53.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:07:53.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:07:53.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:07:54.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:07:54.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:07:54.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:07:54.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:07:54.005 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:07:54.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:07:43
2026-05-30T04:07:54.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73700, datetime.datetime(2026, 5, 30, 4, 7, 43), datetime.datetime(2026, 5, 30, 4, 7, 43), 'salt', 11.08, 47.51, None, 16.3, 341.8, 10.73, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:07:54.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:07:54.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:07:54.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:07:43, diff=11.077276s, valid=True
2026-05-30T04:07:54.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:07:54.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:07:54.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:08:12, diff=-17.919452s, valid=True
2026-05-30T04:07:54.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:07:54.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:07:54.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:07:34, diff=20.088192s, valid=True
2026-05-30T04:07:54.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:07:54.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:07:54.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:07:54.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:07:54.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:07:54.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:07:54.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:08:12, diff=-17.908325s, valid=True
2026-05-30T04:07:54.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:07:54.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:07:54.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:07:54.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039516.092418s, valid=True
2026-05-30T04:07:54.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:07:54.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:07:54.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:07:54.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:07:54.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:07:54.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:07:54.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:07:54.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:07:54.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:07:54.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:07:54.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:07:54.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:07:54.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:07:54.417 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:07:54.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:07:54.981 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:07:55.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:07:55.083 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:07:55.083 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:07:55.334 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:07:55.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:08:25.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:08:25.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:08:25.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:08:25.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:08:25.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:08:25.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:08:25.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-05-30T04:08:25.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:08:25.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-05-30T04:08:25.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:08:25.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:08:25.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:08:25.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-05-30T04:08:29.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-05-30T04:08:29.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:08:29.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:08:29.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:08:29.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:08:29.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:08:29.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:08:29.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:08:29.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:08:29.107 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:08:29.107 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:08:29.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:08:29.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:08:29.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:08:29.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:08:29.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:08:29.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:08:29.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:08:29.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:08:29.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:08:29.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:08:29.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:08:29.428 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:08:29.493 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:08:13
2026-05-30T04:08:29.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73701, datetime.datetime(2026, 5, 30, 4, 8, 13), datetime.datetime(2026, 5, 30, 4, 8, 13), 'salt', 11.08, 47.68, None, 16.87, 331.85, 10.68, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:08:29.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:08:29.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:08:29.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:08:13, diff=16.500519s, valid=True
2026-05-30T04:08:29.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:08:29.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:08:29.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:08:12, diff=17.50394s, valid=True
2026-05-30T04:08:29.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:08:29.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:08:29.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:08:04, diff=25.512085s, valid=True
2026-05-30T04:08:29.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:08:29.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:08:29.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:08:29.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:08:29.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:08:29.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:08:29.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:08:12, diff=17.516111s, valid=True
2026-05-30T04:08:29.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:08:29.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:08:29.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:08:29.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039551.517031s, valid=True
2026-05-30T04:08:29.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:08:29.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:08:29.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:08:29.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:08:29.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:08:29.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:08:29.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:08:29.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:08:29.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:08:29.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:08:29.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:08:29.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:08:29.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:08:29.840 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:08:30.067 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:08:30.472 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:08:30.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:08:30.572 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:08:30.572 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:08:31.686 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:08:31.686 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:09:01.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:09:01.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:09:01.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:09:02.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:09:02.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:09:02.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:09:02.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-05-30T04:09:02.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:09:02.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-05-30T04:09:02.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:09:02.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:09:02.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:09:02.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T04:09:04.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-05-30T04:09:04.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:09:04.754 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:09:04.754 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:09:04.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:09:04.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:09:04.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:09:04.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:09:04.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:09:04.776 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:09:04.776 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:09:04.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:09:04.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:09:04.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:09:04.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:09:04.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:09:04.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:09:04.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:09:05.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:09:05.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:09:05.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:09:05.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:09:05.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:09:05.095 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:08:43
2026-05-30T04:09:05.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73702, datetime.datetime(2026, 5, 30, 4, 8, 43), datetime.datetime(2026, 5, 30, 4, 8, 43), 'salt', 11.01, 47.84, None, 17.33, 334.08, 10.62, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:09:05.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:09:05.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:09:05.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:08:43, diff=22.101901s, valid=True
2026-05-30T04:09:05.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:09:05.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:09:05.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:09:12, diff=-6.8952s, valid=True
2026-05-30T04:09:05.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:09:05.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:09:05.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:08:35, diff=30.11161s, valid=True
2026-05-30T04:09:05.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:09:05.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:09:05.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:09:05.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:09:05.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:09:05.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:09:05.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:09:12, diff=-6.885289s, valid=True
2026-05-30T04:09:05.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:09:05.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:09:05.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:09:05.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039587.115367s, valid=True
2026-05-30T04:09:05.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:09:05.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:09:05.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:09:05.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:09:05.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:09:05.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:09:05.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:09:05.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:09:05.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:09:05.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:09:05.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:09:05.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:09:05.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:09:05.449 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:09:05.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:09:06.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:09:06.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:09:06.115 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:09:06.115 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:09:06.300 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:09:06.301 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:09:36.313 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:09:36.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:09:36.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:09:36.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:09:36.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:09:36.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:09:36.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-05-30T04:09:36.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:09:36.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-05-30T04:09:36.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:09:36.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:09:36.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:09:36.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-05-30T04:10:07.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-05-30T04:10:07.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:10:07.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:10:07.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:10:07.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:10:07.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:10:08.000 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:10:08.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:10:08.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:10:08.001 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:10:08.001 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:10:08.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:10:08.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:10:08.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:10:08.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:10:08.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:10:08.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:10:08.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:10:08.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:10:08.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:10:08.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:10:08.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:10:08.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:10:08.390 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:09:44
2026-05-30T04:10:08.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73704, datetime.datetime(2026, 5, 30, 4, 9, 44), datetime.datetime(2026, 5, 30, 4, 9, 43), 'salt', 11.01, 48.11, None, 14.75, 339.11, 10.55, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:10:08.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:10:08.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:10:08.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:09:43, diff=25.402426s, valid=True
2026-05-30T04:10:08.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:10:08.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:10:08.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:10:12, diff=-3.593955s, valid=True
2026-05-30T04:10:08.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:10:08.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:10:08.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:09:38, diff=30.414512s, valid=True
2026-05-30T04:10:08.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:10:08.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:10:08.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:10:08.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:10:08.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:10:08.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:10:08.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:10:12, diff=-3.581679s, valid=True
2026-05-30T04:10:08.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:10:08.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:10:08.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:10:08.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039650.419157s, valid=True
2026-05-30T04:10:08.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:10:08.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:10:08.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:10:08.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:10:08.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:10:08.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:10:08.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:10:08.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:10:08.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:10:08.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:10:08.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:10:08.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:10:08.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:10:08.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:10:09.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:10:10.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:10:10.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:10:10.682 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:10:10.682 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:10:12.546 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:10:12.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:10:42.570 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:10:42.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:10:42.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:10:42.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:10:42.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:10:42.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:10:42.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-05-30T04:10:42.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:10:42.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-05-30T04:10:42.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:10:42.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:10:42.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:10:42.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-05-30T04:10:45.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-05-30T04:10:45.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:10:45.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:10:45.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:10:45.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:10:45.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:10:45.477 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:10:45.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:10:45.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:10:45.477 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:10:45.477 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:10:45.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:10:45.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:10:45.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:10:45.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:10:45.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:10:45.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T04:10:45.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:10:45.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T04:10:45.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:10:45.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:10:45.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:10:45.732 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:10:45.791 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:10:44
2026-05-30T04:10:45.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73706, datetime.datetime(2026, 5, 30, 4, 10, 44), datetime.datetime(2026, 5, 30, 4, 10, 44), 'salt', 10.91, 48.14, None, 13.41, 331.05, 10.53, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:10:45.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:10:45.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:10:45.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:10:44, diff=1.798085s, valid=True
2026-05-30T04:10:45.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:10:45.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T04:10:45.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:11:12, diff=-26.198793s, valid=True
2026-05-30T04:10:45.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:10:45.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:10:45.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:10:41, diff=4.80844s, valid=True
2026-05-30T04:10:45.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:10:45.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:10:45.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:10:45.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:10:45.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:10:45.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T04:10:45.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:11:12, diff=-26.188223s, valid=True
2026-05-30T04:10:45.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:10:45.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:10:45.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:10:45.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039687.812517s, valid=True
2026-05-30T04:10:45.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:10:45.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:10:45.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:10:45.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:10:45.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:10:45.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:10:45.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:10:45.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:10:45.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:10:45.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:10:46.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:10:46.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:10:46.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:10:46.144 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:10:46.357 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:10:46.701 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:10:46.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:10:46.801 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:10:46.801 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:10:47.055 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:10:47.055 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:11:17.056 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:11:17.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:11:17.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:11:17.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:11:17.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:11:17.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:11:17.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-05-30T04:11:17.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:11:17.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-05-30T04:11:17.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:11:17.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:11:17.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:11:17.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-05-30T04:11:20.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T04:11:20.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:11:20.048 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:11:20.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:11:20.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:11:20.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:11:20.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:11:20.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:11:20.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:11:20.074 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:11:20.074 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:11:20.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:11:20.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:11:20.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:11:20.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:11:20.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:11:20.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:11:20.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:11:20.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:11:20.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:11:20.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:11:20.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:11:20.356 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:11:20.416 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:11:15
2026-05-30T04:11:20.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73707, datetime.datetime(2026, 5, 30, 4, 11, 15), datetime.datetime(2026, 5, 30, 4, 11, 14), 'salt', 10.91, 48.24, None, 13.94, 1.42, 10.5, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:11:20.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:11:20.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:11:20.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:11:14, diff=6.42332s, valid=True
2026-05-30T04:11:20.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:11:20.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:11:20.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:11:12, diff=8.426486s, valid=True
2026-05-30T04:11:20.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:11:20.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:11:20.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:11:13, diff=7.434122s, valid=True
2026-05-30T04:11:20.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:11:20.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:11:20.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:11:20.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:11:20.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:11:20.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:11:20.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:11:12, diff=8.43758s, valid=True
2026-05-30T04:11:20.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:11:20.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:11:20.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:11:20.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039722.438352s, valid=True
2026-05-30T04:11:20.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:11:20.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:11:20.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:11:20.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:11:20.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:11:20.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:11:20.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:11:20.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:11:20.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:11:20.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:11:20.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:11:20.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:11:20.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:11:20.829 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:11:21.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:11:21.394 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:11:21.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:11:21.496 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:11:21.496 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:11:21.735 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:11:21.735 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:11:51.766 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:11:51.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:11:51.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:11:52.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:11:52.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:11:52.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:11:52.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-05-30T04:11:52.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:11:52.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-05-30T04:11:52.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:11:52.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:11:52.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:11:52.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-05-30T04:11:54.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-05-30T04:11:54.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:11:54.893 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:11:54.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:11:54.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:11:54.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:11:54.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:11:54.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:11:54.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:11:54.918 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:11:54.918 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:11:54.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:11:55.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:11:55.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:11:55.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:11:55.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:11:55.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:11:55.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:11:55.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:11:55.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:11:55.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:11:55.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:11:55.235 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:11:55.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:11:45
2026-05-30T04:11:55.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73708, datetime.datetime(2026, 5, 30, 4, 11, 45), datetime.datetime(2026, 5, 30, 4, 11, 45), 'salt', 10.88, 48.31, None, 13.02, 337.44, 10.48, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:11:55.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:11:55.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:11:55.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:11:45, diff=10.302739s, valid=True
2026-05-30T04:11:55.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:11:55.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:11:55.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:12:12, diff=-16.693728s, valid=True
2026-05-30T04:11:55.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:11:55.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:11:55.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:11:44, diff=11.314629s, valid=True
2026-05-30T04:11:55.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:11:55.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:11:55.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:11:55.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:11:55.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:11:55.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:11:55.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:12:12, diff=-16.681515s, valid=True
2026-05-30T04:11:55.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:11:55.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:11:55.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:11:55.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039757.31932s, valid=True
2026-05-30T04:11:55.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:11:55.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:11:55.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:11:55.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:11:55.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:11:55.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:11:55.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:11:55.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:11:55.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:11:55.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:11:55.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:11:55.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:11:55.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:11:55.641 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:11:55.855 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:11:56.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:11:56.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:11:56.298 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:11:56.298 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:11:56.553 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:11:56.553 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:12:26.558 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:12:26.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:12:26.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:12:27.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:12:27.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:12:27.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:12:27.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-05-30T04:12:27.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:12:27.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-05-30T04:12:27.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:12:27.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:12:27.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:12:27.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-05-30T04:12:31.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-05-30T04:12:31.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:12:31.459 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:12:31.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:12:31.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:12:31.478 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:12:31.478 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:12:31.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:12:31.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:12:31.479 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:12:31.479 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:12:31.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:12:31.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:12:31.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:12:31.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:12:31.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:12:31.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:12:31.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:12:31.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:12:31.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:12:31.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:12:31.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:12:31.735 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:12:31.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:12:15
2026-05-30T04:12:31.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73709, datetime.datetime(2026, 5, 30, 4, 12, 15), datetime.datetime(2026, 5, 30, 4, 12, 15), 'salt', 10.85, 48.74, None, 14.33, 334.69, 10.36, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:12:31.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:12:31.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:12:31.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:12:15, diff=16.800864s, valid=True
2026-05-30T04:12:31.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:12:31.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:12:31.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:12:12, diff=19.803702s, valid=True
2026-05-30T04:12:31.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:12:31.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:12:31.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:12:06, diff=25.810405s, valid=True
2026-05-30T04:12:31.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:12:31.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:12:31.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:12:31.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:12:31.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:12:31.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:12:31.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:12:12, diff=19.81342s, valid=True
2026-05-30T04:12:31.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:12:31.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:12:31.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:12:31.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039793.8141s, valid=True
2026-05-30T04:12:31.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:12:31.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:12:31.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:12:31.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:12:31.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:12:31.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:12:31.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:12:31.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:12:31.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:12:31.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:12:32.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:12:32.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:12:32.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:12:32.304 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:12:32.545 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:12:32.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:12:32.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:12:32.989 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:12:32.990 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:12:33.255 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:12:33.255 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:13:03.262 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:13:03.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:13:03.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:13:03.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:13:03.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:13:03.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:13:03.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-05-30T04:13:03.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:13:03.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-05-30T04:13:03.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:13:03.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:13:03.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:13:03.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-05-30T04:13:30.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-05-30T04:13:30.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:13:30.089 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:13:30.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:13:30.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:13:30.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:13:30.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:13:30.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:13:30.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:13:30.111 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:13:30.111 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:13:30.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:13:30.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:13:30.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:13:30.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:13:30.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:13:30.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:13:30.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:13:30.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:13:30.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:13:30.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:13:30.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:13:30.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:13:30.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:13:16
2026-05-30T04:13:30.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73711, datetime.datetime(2026, 5, 30, 4, 13, 16), datetime.datetime(2026, 5, 30, 4, 13, 15), 'salt', 10.68, 48.87, None, 10.83, 338.89, 10.31, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:13:30.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:13:30.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:13:30.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:13:15, diff=15.474253s, valid=True
2026-05-30T04:13:30.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:13:30.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:13:30.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:13:12, diff=18.477539s, valid=True
2026-05-30T04:13:30.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:13:30.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:13:30.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:13:08, diff=22.48519s, valid=True
2026-05-30T04:13:30.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:13:30.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:13:30.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:13:30.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:13:30.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:13:30.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:13:30.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:13:12, diff=18.488697s, valid=True
2026-05-30T04:13:30.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:13:30.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:13:30.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:13:30.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039852.489449s, valid=True
2026-05-30T04:13:30.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:13:30.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:13:30.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:13:30.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:13:30.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:13:30.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:13:30.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:13:30.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:13:30.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:13:30.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:13:30.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:13:30.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:13:30.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:13:30.808 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:13:31.021 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:13:31.364 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:13:31.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:13:31.464 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:13:31.465 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:13:31.696 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:13:31.696 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:14:01.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:14:01.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:14:01.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:14:02.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:14:02.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:14:02.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:14:02.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-05-30T04:14:02.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:14:02.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-05-30T04:14:02.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:14:02.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:14:02.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:14:02.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-05-30T04:14:22.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-05-30T04:14:22.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:14:22.668 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:14:22.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:14:22.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:14:22.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:14:22.693 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:14:22.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:14:22.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:14:22.694 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:14:22.694 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:14:22.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:14:22.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:14:22.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:14:22.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:14:22.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:14:22.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:14:22.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:14:23.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:14:23.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:14:23.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:14:23.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:14:23.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:14:23.080 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:14:16
2026-05-30T04:14:23.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73713, datetime.datetime(2026, 5, 30, 4, 14, 16), datetime.datetime(2026, 5, 30, 4, 14, 16), 'salt', 10.61, 49.13, None, 12.0, 327.32, 10.22, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:14:23.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:14:23.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:14:23.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:14:16, diff=7.088043s, valid=True
2026-05-30T04:14:23.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:14:23.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:14:23.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:14:12, diff=11.091447s, valid=True
2026-05-30T04:14:23.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:14:23.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:14:23.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:14:11, diff=12.099906s, valid=True
2026-05-30T04:14:23.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:14:23.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:14:23.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:14:23.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:14:23.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:14:23.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:14:23.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:14:12, diff=11.103687s, valid=True
2026-05-30T04:14:23.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:14:23.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:14:23.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:14:23.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039905.10454s, valid=True
2026-05-30T04:14:23.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:14:23.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:14:23.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:14:23.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:14:23.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:14:23.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:14:23.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:14:23.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:14:23.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:14:23.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:14:23.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:14:23.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:14:23.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:14:23.506 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:14:23.727 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:14:24.079 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:14:24.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:14:24.183 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:14:24.183 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:14:24.452 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:14:24.452 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:14:54.483 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:14:54.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:14:54.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:14:54.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:14:54.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:14:55.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:14:55.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-05-30T04:14:55.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:14:55.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-05-30T04:14:55.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:14:55.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:14:55.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:14:55.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-05-30T04:15:20.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T04:15:20.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:15:20.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:15:20.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:15:20.425 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:15:20.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:15:20.439 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:15:20.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:15:20.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:15:20.440 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:15:20.440 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:15:20.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:15:20.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:15:20.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:15:20.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:15:20.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:15:20.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:15:20.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:15:20.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:15:20.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:15:20.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:15:20.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:15:20.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:15:20.846 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:15:17
2026-05-30T04:15:20.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73715, datetime.datetime(2026, 5, 30, 4, 15, 17), datetime.datetime(2026, 5, 30, 4, 15, 16), 'salt', 10.61, 49.2, None, 14.47, 331.15, 10.2, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:15:20.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:15:20.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:15:20.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:15:16, diff=4.854107s, valid=True
2026-05-30T04:15:20.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:15:20.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:15:20.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:15:12, diff=8.857654s, valid=True
2026-05-30T04:15:20.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:15:20.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:15:20.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:15:13, diff=7.865978s, valid=True
2026-05-30T04:15:20.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:15:20.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:15:20.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:15:20.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:15:20.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:15:20.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:15:20.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:15:12, diff=8.869683s, valid=True
2026-05-30T04:15:20.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:15:20.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:15:20.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:15:20.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039962.870503s, valid=True
2026-05-30T04:15:20.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:15:20.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:15:20.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:15:20.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:15:20.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:15:20.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:15:20.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:15:20.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:15:20.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:15:21.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:15:21.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:15:21.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:15:21.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:15:21.190 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:15:21.402 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:15:21.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:15:21.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:15:21.848 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:15:21.849 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:15:22.086 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:15:22.087 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:15:52.105 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:15:52.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:15:52.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:15:52.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:15:52.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:15:52.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:15: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-05-30T04:15:52.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:15:52.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-05-30T04:15:52.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:15:52.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:15:52.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:15:52.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-05-30T04:15:55.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-05-30T04:15:55.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:15:55.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:15:55.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:15:55.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:15:55.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:15:55.057 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:15:55.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:15:55.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:15:55.059 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:15:55.059 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:15:55.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:15:55.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:15:55.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:15:55.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:15:55.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:15:55.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T04:15:55.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:15:55.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T04:15:55.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:15:55.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:15:55.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:15:55.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:15:55.456 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:15:47
2026-05-30T04:15:55.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73716, datetime.datetime(2026, 5, 30, 4, 15, 47), datetime.datetime(2026, 5, 30, 4, 15, 47), 'salt', 10.55, 49.4, None, 13.3, 336.78, 10.15, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:15:55.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:15:55.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:15:55.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:15:47, diff=8.464465s, valid=True
2026-05-30T04:15:55.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:15:55.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T04:15:55.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:16:12, diff=-16.532025s, valid=True
2026-05-30T04:15:55.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:15:55.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:15:55.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:15:45, diff=10.476189s, valid=True
2026-05-30T04:15:55.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:15:55.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:15:55.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:15:55.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:15:55.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:15:55.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T04:15:55.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:16:12, diff=-16.516329s, valid=True
2026-05-30T04:15:55.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:15:55.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:15:55.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:15:55.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1039997.485313s, valid=True
2026-05-30T04:15:55.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:15:55.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:15:55.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:15:55.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:15:55.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:15:55.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:15:55.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:15:55.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:15:55.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:15:55.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:15:55.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:15:55.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:15:55.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:15:55.807 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:15:56.020 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:15:56.365 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:15:56.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:15:56.464 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:15:56.465 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:15:56.708 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:15:56.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:16:26.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:16:26.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:16:26.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:16:26.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:16:26.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:16:27.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:16:27.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T04:16:27.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:16:27.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-05-30T04:16:27.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:16:27.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:16:27.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:16:27.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-05-30T04:16:29.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-05-30T04:16:29.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:16:29.491 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:16:29.491 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:16:29.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:16:29.514 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:16:29.514 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:16:29.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:16:29.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:16:29.516 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:16:29.516 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:16:29.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:16:29.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:16:29.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:16:29.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:16:29.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:16:29.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:16:29.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:16:29.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:16:29.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:16:29.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:16:29.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:16:29.848 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:16:29.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:16:17
2026-05-30T04:16:29.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73717, datetime.datetime(2026, 5, 30, 4, 16, 17), datetime.datetime(2026, 5, 30, 4, 16, 17), 'salt', 10.58, 49.2, None, 13.83, 338.92, 10.2, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:16:29.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:16:29.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:16:29.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:16:17, diff=12.919674s, valid=True
2026-05-30T04:16:29.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:16:29.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:16:29.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:16:12, diff=17.922981s, valid=True
2026-05-30T04:16:29.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:16:29.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:16:29.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:16:16, diff=13.930403s, valid=True
2026-05-30T04:16:29.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:16:29.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:16:29.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:16:29.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:16:29.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:16:29.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:16:29.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:16:12, diff=17.933642s, valid=True
2026-05-30T04:16:29.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:16:29.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:16:29.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:16:29.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040031.93437s, valid=True
2026-05-30T04:16:29.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:16:29.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:16:29.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:16:29.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:16:29.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:16:29.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:16:29.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:16:29.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:16:30.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:16:30.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:16:30.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:16:30.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:16:30.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:16:30.270 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:16:30.489 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:16:30.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:16:31.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:16:31.006 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:16:31.006 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:16:31.253 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:16:31.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:17:01.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:17:01.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:17:01.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:17:01.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:17:01.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:17:01.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:17:01.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-05-30T04:17:01.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:17:01.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T04:17:01.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:17:01.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:17:01.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:17:01.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-05-30T04:17:04.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-05-30T04:17:04.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:17:04.177 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:17:04.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:17:04.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:17:04.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:17:04.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:17:04.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:17:04.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:17:04.203 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:17:04.203 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:17:04.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:17:04.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:17:04.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:17:04.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:17:04.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:17:04.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:17:04.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:17:04.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:17:04.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:17:04.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:17:04.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:17:04.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:17:04.592 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:16:48
2026-05-30T04:17:04.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73718, datetime.datetime(2026, 5, 30, 4, 16, 48), datetime.datetime(2026, 5, 30, 4, 16, 47), 'salt', 10.58, 49.27, None, 14.22, 331.38, 10.19, 831.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:17:04.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:17:04.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:17:04.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:16:47, diff=17.600525s, valid=True
2026-05-30T04:17:04.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:17:04.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:17:04.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:17:12, diff=-7.395944s, valid=True
2026-05-30T04:17:04.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:17:04.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:17:04.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:16:39, diff=25.612536s, valid=True
2026-05-30T04:17:04.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:17:04.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:17:04.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:17:04.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:17:04.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:17:04.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:17:04.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:17:12, diff=-7.383561s, valid=True
2026-05-30T04:17:04.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:17:04.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:17:04.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:17:04.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040066.617301s, valid=True
2026-05-30T04:17:04.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:17:04.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:17:04.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:17:04.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:17:04.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:17:04.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:17:04.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:17:04.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:17:04.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:17:04.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:17:04.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:17:04.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:17:04.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:17:04.937 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:17:05.152 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:17:05.502 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:17:05.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:17:05.604 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:17:05.604 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:17:05.801 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:17:05.801 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:17:35.829 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:17:35.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:17:35.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:17:36.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:17:36.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:17:36.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:17:36.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-05-30T04:17:36.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:17:36.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T04:17:36.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:17:36.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:17:36.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:17:36.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-05-30T04:17:39.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-05-30T04:17:39.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:17:39.325 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:17:39.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:17:39.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:17:39.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:17:39.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:17:39.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:17:39.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:17:39.350 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:17:39.350 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:17:39.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:17:39.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:17:39.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:17:39.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:17:39.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:17:39.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:17:39.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:17:39.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:17:39.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:17:39.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:17:39.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:17:39.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:17:39.733 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:17:18
2026-05-30T04:17:39.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73719, datetime.datetime(2026, 5, 30, 4, 17, 18), datetime.datetime(2026, 5, 30, 4, 17, 18), 'salt', 10.58, 49.17, None, 12.92, 327.49, 10.21, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:17:39.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:17:39.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:17:39.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:17:18, diff=21.741017s, valid=True
2026-05-30T04:17:39.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:17:39.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:17:39.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:17:12, diff=27.744447s, valid=True
2026-05-30T04:17:39.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:17:39.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:17:39.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:17:09, diff=30.752556s, valid=True
2026-05-30T04:17:39.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:17:39.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:17:39.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:17:39.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:17:39.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:17:39.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:17:39.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:17:12, diff=27.756195s, valid=True
2026-05-30T04:17:39.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:17:39.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:17:39.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:17:39.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040101.756988s, valid=True
2026-05-30T04:17:39.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:17:39.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:17:39.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:17:39.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:17:39.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:17:39.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:17:39.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:17:39.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:17:39.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:17:39.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:17:39.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:17:40.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:17:40.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:17:40.105 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:17:40.391 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:17:40.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:17:40.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:17:40.834 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:17:40.834 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:17:40.929 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:17:40.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:18:10.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:18:10.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:18:10.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:18:11.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:18:11.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:18:11.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:18:11.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-05-30T04:18:11.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:18:11.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-05-30T04:18:11.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:18:11.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:18:11.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:18: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-05-30T04:18:17.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-05-30T04:18:17.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:18:17.479 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:18:17.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:18:17.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:18:17.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:18:17.504 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:18:17.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:18:17.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:18:17.505 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:18:17.506 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:18:17.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:18:17.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:18:17.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:18:17.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:18:17.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:18:17.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:18:17.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:18:17.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:18:17.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:18:17.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:18:17.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:18:17.822 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:18:17.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:17:48
2026-05-30T04:18:17.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73720, datetime.datetime(2026, 5, 30, 4, 17, 48), datetime.datetime(2026, 5, 30, 4, 17, 48), 'salt', 10.65, 49.2, None, 14.93, 327.93, 10.21, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:18:17.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:18:17.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:18:17.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:17:48, diff=29.890359s, valid=True
2026-05-30T04:18:17.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:18:17.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:18:17.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:18:12, diff=5.893681s, valid=True
2026-05-30T04:18:17.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:18:17.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:18:17.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:17:40, diff=37.901464s, valid=True
2026-05-30T04:18:17.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:18:17.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:18:17.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:18:17.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:18:17.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:18:17.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:18:17.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:18:12, diff=5.904992s, valid=True
2026-05-30T04:18:17.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:18:17.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:18:17.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:18:17.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040139.905771s, valid=True
2026-05-30T04:18:17.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:18:17.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:18:17.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:18:17.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:18:17.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:18:17.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:18:17.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:18:17.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:18:17.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:18:18.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:18:18.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:18:18.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:18:18.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:18:18.230 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:18:18.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:18:18.802 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:18:18.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:18:18.903 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:18:18.903 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:18:19.151 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:18:19.151 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:18:49.169 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:18:49.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:18:49.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:18:49.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:18:49.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:18:49.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:18:49.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-05-30T04:18:49.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:18:49.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-05-30T04:18:49.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:18:49.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:18:49.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:18:49.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-05-30T04:19:52.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-05-30T04:19:52.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:19:52.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:19:52.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:19:52.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:19:52.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:19:52.866 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:19:52.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:19:52.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:19:52.867 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:19:52.867 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:19:52.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:19:53.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:19:53.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:19:53.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:19:53.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:19:53.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T04:19:53.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:19:53.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T04:19:53.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:19:53.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:19:53.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:19:53.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:19:53.248 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:19:49
2026-05-30T04:19:53.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73724, datetime.datetime(2026, 5, 30, 4, 19, 49), datetime.datetime(2026, 5, 30, 4, 19, 49), 'salt', 10.61, 49.0, None, 14.72, 335.14, 10.26, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:19:53.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:19:53.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:19:53.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:19:49, diff=4.256464s, valid=True
2026-05-30T04:19:53.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:19:53.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T04:19:53.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:20:12, diff=-18.739959s, valid=True
2026-05-30T04:19:53.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:19:53.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:19:53.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:19:46, diff=7.26828s, valid=True
2026-05-30T04:19:53.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:19:53.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:19:53.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:19:53.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:19:53.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:19:53.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T04:19:53.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:20:12, diff=-18.727933s, valid=True
2026-05-30T04:19:53.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:19:53.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:19:53.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:19:53.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040235.272899s, valid=True
2026-05-30T04:19:53.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:19:53.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:19:53.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:19:53.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:19:53.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:19:53.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:19:53.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:19:53.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:19:53.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:19:53.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:19:53.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:19:53.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:19:53.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:19:53.670 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:19:53.881 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:19:54.227 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:19:54.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:19:54.328 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:19:54.328 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:19:54.580 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:19:54.580 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:20:24.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:20:24.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:20:24.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:20:25.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:20:25.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:20:25.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:20:25.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-05-30T04:20:25.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:20:25.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-05-30T04:20:25.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:20:25.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:20:25.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:20:25.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-05-30T04:20:27.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-05-30T04:20:27.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:20:27.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:20:27.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:20:27.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:20:27.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:20:27.789 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:20:27.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:20:27.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:20:27.790 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:20:27.790 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:20:27.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:20:27.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:20:27.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:20:28.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:20:28.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:20:28.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:20:28.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:20:28.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:20:28.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:20:28.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:20:28.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:20:28.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:20:28.175 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:20:19
2026-05-30T04:20:28.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73725, datetime.datetime(2026, 5, 30, 4, 20, 19), datetime.datetime(2026, 5, 30, 4, 20, 19), 'salt', 10.61, 49.0, None, 15.67, 329.51, 10.26, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:20:28.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:20:28.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:20:28.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:20:19, diff=9.183339s, valid=True
2026-05-30T04:20:28.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:20:28.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:20:28.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:20:12, diff=16.186756s, valid=True
2026-05-30T04:20:28.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:20:28.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:20:28.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:20:17, diff=11.194747s, valid=True
2026-05-30T04:20:28.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:20:28.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:20:28.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:20:28.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:20:28.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:20:28.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:20:28.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:20:12, diff=16.198613s, valid=True
2026-05-30T04:20:28.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:20:28.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:20:28.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:20:28.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040270.199443s, valid=True
2026-05-30T04:20:28.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:20:28.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:20:28.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:20:28.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:20:28.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:20:28.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:20:28.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:20:28.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:20:28.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:20:28.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:20:28.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:20:28.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:20:28.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:20:28.522 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:20:28.733 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:20:29.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:20:29.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:20:29.179 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:20:29.179 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:20:29.403 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:20:29.403 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:20:59.412 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:20:59.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:20:59.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:20:59.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:20:59.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:20:59.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:20:59.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-05-30T04:20:59.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:20:59.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T04:20:59.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:20:59.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:20:59.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:20:59.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-05-30T04:21:27.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-05-30T04:21:27.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:21:27.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:21:27.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:21:27.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:21:27.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:21:27.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:21:27.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:21:27.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:21:27.593 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:21:27.593 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:21:27.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:21:27.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:21:27.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:21:27.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:21:27.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:21:27.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:21:27.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:21:27.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:21:27.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:21:27.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:21:27.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:21:27.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:21:27.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:21:20
2026-05-30T04:21:27.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73727, datetime.datetime(2026, 5, 30, 4, 21, 20), datetime.datetime(2026, 5, 30, 4, 21, 20), 'salt', 10.55, 49.04, None, 14.86, 322.25, 10.25, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:21:27.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:21:27.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:21:27.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:21:20, diff=7.999815s, valid=True
2026-05-30T04:21:27.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:21:28.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:21:28.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:21:12, diff=16.00335s, valid=True
2026-05-30T04:21:28.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:21:28.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:21:28.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:21:11, diff=17.011515s, valid=True
2026-05-30T04:21:28.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:21:28.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:21:28.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:21:28.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:21:28.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:21:28.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:21:28.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:21:12, diff=16.015289s, valid=True
2026-05-30T04:21:28.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:21:28.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:21:28.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:21:28.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040330.016124s, valid=True
2026-05-30T04:21:28.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:21:28.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:21:28.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:21:28.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:21:28.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:21:28.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:21:28.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:21:28.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:21:28.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:21:28.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:21:28.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:21:28.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:21:28.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:21:28.410 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:21:28.622 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:21:28.969 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:21:29.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:21:29.070 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:21:29.070 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:21:29.321 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:21:29.321 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:21:59.325 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:21:59.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:21:59.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:21:59.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:21:59.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:22:00.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:22:00.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-05-30T04:22:00.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:22:00.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-05-30T04:22:00.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:22:00.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:22:00.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:22:00.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-05-30T04:22:28.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-05-30T04:22:28.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:22:28.372 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:22:28.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:22:28.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:22:28.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:22:28.398 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:22:28.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:22:28.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:22:28.399 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:22:28.399 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:22:28.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:22:28.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:22:28.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:22:28.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:22:28.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:22:28.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:22:28.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:22:28.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:22:28.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:22:28.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:22:28.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:22:28.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:22:28.792 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:22:20
2026-05-30T04:22:28.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73729, datetime.datetime(2026, 5, 30, 4, 22, 20), datetime.datetime(2026, 5, 30, 4, 22, 20), 'salt', 10.55, 49.27, None, 15.28, 328.69, 10.19, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:22:28.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:22:28.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:22:28.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:22:20, diff=8.799551s, valid=True
2026-05-30T04:22:28.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:22:28.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:22:28.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:22:12, diff=16.80309s, valid=True
2026-05-30T04:22:28.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:22:28.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:22:28.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:22:12, diff=16.811435s, valid=True
2026-05-30T04:22:28.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:22:28.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:22:28.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:22:28.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:22:28.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:22:28.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:22:28.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:22:12, diff=16.815255s, valid=True
2026-05-30T04:22:28.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:22:28.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:22:28.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:22:28.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040390.816104s, valid=True
2026-05-30T04:22:28.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:22:28.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:22:28.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:22:28.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:22:28.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:22:28.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:22:28.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:22:28.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:22:28.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:22:28.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:22:29.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:22:29.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:22:29.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:22:29.142 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:22:29.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:22:29.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:22:29.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:22:29.809 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:22:29.809 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:22:30.021 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:22:30.021 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:23:00.051 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:23:00.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:23:00.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:23:00.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:23:00.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:23:00.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:23:00.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-05-30T04:23:00.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:23:00.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-05-30T04:23:00.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:23:00.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:23:00.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:23:00.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-05-30T04:23:44.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-05-30T04:23:44.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:23:44.484 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:23:44.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:23:44.492 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:23:44.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:23:44.504 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:23:44.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:23:44.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:23:44.505 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:23:44.505 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:23:44.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:23:44.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:23:44.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:23:44.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:23:44.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:23:44.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:23:44.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:23:44.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:23:44.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:23:44.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:23:44.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:23:44.820 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:23:44.880 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:23:21
2026-05-30T04:23:44.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73731, datetime.datetime(2026, 5, 30, 4, 23, 21), datetime.datetime(2026, 5, 30, 4, 23, 21), 'salt', 10.55, 49.3, None, 15.1, 321.6, 10.18, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:23:44.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:23:44.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:23:44.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:23:21, diff=23.887689s, valid=True
2026-05-30T04:23:44.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:23:44.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:23:44.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:23:12, diff=32.89117s, valid=True
2026-05-30T04:23:44.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:23:44.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:23:44.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:23:15, diff=29.89916s, valid=True
2026-05-30T04:23:44.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:23:44.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:23:44.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:23:44.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:23:44.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:23:44.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:23:44.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:23:12, diff=32.902802s, valid=True
2026-05-30T04:23:44.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:23:44.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:23:44.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:23:44.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040466.903593s, valid=True
2026-05-30T04:23:44.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:23:44.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:23:44.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:23:44.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:23:44.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:23:44.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:23:44.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:23:44.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:23:44.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:23:45.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:23:45.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:23:45.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:23:45.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:23:45.306 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:23:45.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:23:45.873 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:23:45.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:23:45.974 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:23:45.974 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:23:46.135 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:23:46.136 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:24:16.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:24:16.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:24:16.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:24:16.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:24:16.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:24:16.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:24:16.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-05-30T04:24:16.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:24:16.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T04:24:16.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:24:16.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:24:16.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:24:16.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-05-30T04:24:19.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-05-30T04:24:19.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:24:19.072 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:24:19.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:24:19.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:24:19.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:24:19.096 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:24:19.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:24:19.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:24:19.097 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:24:19.097 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:24:19.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:24:19.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:24:19.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:24:19.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:24:19.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:24:19.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:24:19.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:24:19.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:24:19.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:24:19.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:24:19.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:24:19.421 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:24:19.484 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:23:51
2026-05-30T04:24:19.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73732, datetime.datetime(2026, 5, 30, 4, 23, 51), datetime.datetime(2026, 5, 30, 4, 23, 51), 'salt', 10.58, 49.37, None, 14.12, 327.04, 10.16, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:24:19.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:24:19.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:24:19.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:23:51, diff=28.491565s, valid=True
2026-05-30T04:24:19.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:24:19.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:24:19.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:24:12, diff=7.495096s, valid=True
2026-05-30T04:24:19.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:24:19.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:24:19.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:23:47, diff=32.503473s, valid=True
2026-05-30T04:24:19.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:24:19.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:24:19.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:24:19.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:24:19.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:24:19.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:24:19.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:24:12, diff=7.507251s, valid=True
2026-05-30T04:24:19.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:24:19.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:24:19.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:24:19.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040501.508083s, valid=True
2026-05-30T04:24:19.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:24:19.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:24:19.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:24:19.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:24:19.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:24:19.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:24:19.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:24:19.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:24:19.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:24:19.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:24:19.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:24:19.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:24:19.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:24:19.835 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:24:20.093 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:24:20.450 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:24:20.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:24:20.551 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:24:20.551 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:24:20.802 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:24:20.803 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:24:50.832 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:24:50.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:24:50.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:24:51.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:24:51.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:24:51.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:24:51.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-05-30T04:24:51.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:24:51.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-05-30T04:24:51.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:24:51.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:24:51.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:24:51.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-05-30T04:24:53.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-05-30T04:24:53.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:24:53.893 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:24:53.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:24:53.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:24:53.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:24:53.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:24:53.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:24:53.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:24:53.918 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:24:53.918 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:24:53.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:24:54.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:24:54.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:24:54.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:24:54.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:24:54.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T04:24:54.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:24:54.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T04:24:54.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:24:54.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:24:54.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:24:54.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:24:54.293 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:24:52
2026-05-30T04:24:54.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73734, datetime.datetime(2026, 5, 30, 4, 24, 52), datetime.datetime(2026, 5, 30, 4, 24, 51), 'salt', 10.58, 49.23, None, 15.17, 329.5, 10.19, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:24:54.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:24:54.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:24:54.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:24:51, diff=3.301129s, valid=True
2026-05-30T04:24:54.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:24:54.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T04:24:54.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:25:12, diff=-17.695498s, valid=True
2026-05-30T04:24:54.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:24:54.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:24:54.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:24:50, diff=4.312418s, valid=True
2026-05-30T04:24:54.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:24:54.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:24:54.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:24:54.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:24:54.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:24:54.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T04:24:54.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:25:12, diff=-17.683957s, valid=True
2026-05-30T04:24:54.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:24:54.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:24:54.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:24:54.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040536.316836s, valid=True
2026-05-30T04:24:54.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:24:54.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:24:54.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:24:54.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:24:54.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:24:54.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:24:54.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:24:54.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:24:54.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:24:54.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:24:54.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:24:54.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:24:54.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:24:54.638 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:24:54.850 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:24:55.194 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:24:55.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:24: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-05-30T04:24: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-05-30T04:24:55.542 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:24:55.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:25:25.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:25:25.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:25:25.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:25:25.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:25:25.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:25:26.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:25:26.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-05-30T04:25:26.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:25:26.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-05-30T04:25:26.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:25:26.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:25:26.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:25:26.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-05-30T04:25:28.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-05-30T04:25:28.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:25:28.450 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:25:28.450 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:25:28.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:25:28.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:25:28.474 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:25:28.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:25:28.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:25:28.475 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:25:28.475 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:25:28.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:25:28.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:25:28.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:25:28.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:25:28.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:25:28.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:25:28.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:25:28.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:25:28.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:25:28.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:25:28.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:25:28.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:25:28.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:25:22
2026-05-30T04:25:28.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73735, datetime.datetime(2026, 5, 30, 4, 25, 22), datetime.datetime(2026, 5, 30, 4, 25, 21), 'salt', 10.48, 49.17, None, 14.36, 319.9, 10.21, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:25:28.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:25:28.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:25:28.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:25:21, diff=7.844074s, valid=True
2026-05-30T04:25:28.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:25:28.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:25:28.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:25:12, diff=16.847312s, valid=True
2026-05-30T04:25:28.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:25:28.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:25:28.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:25:21, diff=7.855012s, valid=True
2026-05-30T04:25:28.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:25:28.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:25:28.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:25:28.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:25:28.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:25:28.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:25:28.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:25:12, diff=16.858509s, valid=True
2026-05-30T04:25:28.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:25:28.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:25:28.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:25:28.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040570.85938s, valid=True
2026-05-30T04:25:28.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:25:28.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:25:28.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:25:28.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:25:28.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:25:28.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:25:28.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:25:28.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:25:28.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:25:29.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:25:29.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:25:29.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:25:29.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:25:29.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:25:29.420 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:25:29.829 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:25:29.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:25:29.945 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:25:29.945 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:25:30.122 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:25:30.122 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:26:00.151 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:26:00.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:26:00.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:26:00.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:26:00.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:26:00.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:26:00.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-05-30T04:26:00.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:26:00.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-05-30T04:26:00.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:26:00.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:26:00.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:26:00.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-05-30T04:26:32.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-05-30T04:26:32.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:26:32.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:26:32.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:26:32.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:26:32.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:26:32.412 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:26:32.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:26:32.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:26:32.413 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:26:32.414 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:26:32.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:26:32.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:26:32.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:26:32.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:26:32.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:26:32.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:26:32.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:26:32.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:26:32.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:26:32.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:26:32.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:26:32.741 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:26:32.804 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:26:23
2026-05-30T04:26:32.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73737, datetime.datetime(2026, 5, 30, 4, 26, 23), datetime.datetime(2026, 5, 30, 4, 26, 22), 'salt', 10.55, 49.23, None, 13.13, 344.22, 10.2, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:26:32.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:26:32.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:26:32.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:26:22, diff=10.811804s, valid=True
2026-05-30T04:26:32.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:26:32.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:26:32.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:26:12, diff=20.815303s, valid=True
2026-05-30T04:26:32.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:26:32.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:26:32.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:26:14, diff=18.82357s, valid=True
2026-05-30T04:26:32.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:26:32.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:26:32.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:26:32.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:26:32.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:26:32.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:26:32.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:26:12, diff=20.827353s, valid=True
2026-05-30T04:26:32.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:26:32.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:26:32.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:26:32.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040634.828189s, valid=True
2026-05-30T04:26:32.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:26:32.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:26:32.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:26:32.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:26:32.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:26:32.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:26:32.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:26:32.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:26:32.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:26:32.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:26:33.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:26:33.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:26:33.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:26:33.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:26:33.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:26:33.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:26:33.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:26:33.810 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:26:33.811 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:26:33.966 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:26:33.966 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:27:03.992 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:27:03.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:27:03.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:27:04.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:27:04.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:27:04.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:27:04.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-05-30T04:27:04.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:27:04.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-05-30T04:27:04.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:27:04.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:27:04.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:27:04.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-05-30T04:27:07.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-05-30T04:27:07.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:27:07.542 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:27:07.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:27:07.553 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:27:07.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:27:07.566 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:27:07.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:27:07.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:27:07.567 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:27:07.567 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:27:07.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:27:07.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:27:07.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:27:07.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:27:07.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:27:07.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:27:07.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:27:07.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:27:07.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:27:07.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:27:07.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:27:07.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:27:07.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:26:53
2026-05-30T04:27:07.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73738, datetime.datetime(2026, 5, 30, 4, 26, 53), datetime.datetime(2026, 5, 30, 4, 26, 52), 'salt', 10.58, 49.3, None, 14.86, 328.82, 10.18, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:27:07.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:27:07.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:27:07.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:26:52, diff=15.965383s, valid=True
2026-05-30T04:27:07.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:27:07.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:27:07.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:27:12, diff=-4.03118s, valid=True
2026-05-30T04:27:07.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:27:07.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:27:07.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:26:45, diff=22.97713s, valid=True
2026-05-30T04:27:07.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:27:07.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:27:07.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:27:07.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:27:07.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:27:07.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:27:07.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:27:12, diff=-4.019178s, valid=True
2026-05-30T04:27:07.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:27:07.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:27:07.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:27:07.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040669.981642s, valid=True
2026-05-30T04:27:07.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:27:07.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:27:07.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:27:07.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:27:07.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:27:08.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:27:08.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:27:08.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:27:08.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:27:08.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:27:08.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:27:08.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:27:08.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:27:08.305 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:27:08.603 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:27:08.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:27:09.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:27:09.044 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:27:09.044 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:27:09.232 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:27:09.233 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:27:39.259 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:27:39.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:27:39.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:27:39.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:27:39.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:27:39.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:27:39.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-05-30T04:27:39.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:27:39.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-05-30T04:27:39.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:27:39.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:27:39.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:27:39.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T04:27:42.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-05-30T04:27:42.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:27:42.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:27:42.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:27:42.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:27:42.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:27:42.458 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:27:42.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:27:42.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:27:42.459 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:27:42.459 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:27:42.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:27:42.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:27:42.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:27:42.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:27:42.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:27:42.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:27:42.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:27:42.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:27:42.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:27:42.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:27:42.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:27:42.802 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:27:42.865 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:27:23
2026-05-30T04:27:42.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73739, datetime.datetime(2026, 5, 30, 4, 27, 23), datetime.datetime(2026, 5, 30, 4, 27, 23), 'salt', 10.55, 49.33, None, 16.02, 330.37, 10.17, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:27:42.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:27:42.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:27:42.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:27:23, diff=19.872924s, valid=True
2026-05-30T04:27:42.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:27:42.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:27:42.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:27:12, diff=30.876404s, valid=True
2026-05-30T04:27:42.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:27:42.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:27:42.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:27:16, diff=26.884592s, valid=True
2026-05-30T04:27:42.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:27:42.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:27:42.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:27:42.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:27:42.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:27:42.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:27:42.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:27:12, diff=30.888503s, valid=True
2026-05-30T04:27:42.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:27:42.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:27:42.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:27:42.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040704.88936s, valid=True
2026-05-30T04:27:42.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:27:42.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:27:42.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:27:42.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:27:42.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:27:42.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:27:42.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:27:42.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:27:42.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:27:43.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:27:43.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:27:43.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:27:43.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:27:43.212 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:27:43.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:27:43.769 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:27:43.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:27:43.870 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:27:43.870 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:27:44.033 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:27:44.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:28:14.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:28:14.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:28:14.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:28:14.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:28:14.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:28:14.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:28:14.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-05-30T04:28:14.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:28:14.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-05-30T04:28:14.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:28:14.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:28:14.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:28:14.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-05-30T04:28:17.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-05-30T04:28:17.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:28:17.529 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:28:17.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:28:17.539 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:28:17.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:28:17.552 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:28:17.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:28:17.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:28:17.553 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:28:17.553 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:28:17.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:28:17.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:28:17.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:28:17.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:28:17.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:28:17.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:28:17.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:28:17.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:28:17.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:28:17.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:28:17.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:28:17.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:28:17.950 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:27:53
2026-05-30T04:28:17.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73740, datetime.datetime(2026, 5, 30, 4, 27, 53), datetime.datetime(2026, 5, 30, 4, 27, 53), 'salt', 10.58, 49.5, None, 13.48, 326.2, 10.12, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:28:17.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:28:17.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:28:17.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:27:53, diff=24.958259s, valid=True
2026-05-30T04:28:17.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:28:17.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:28:17.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:28:12, diff=5.961803s, valid=True
2026-05-30T04:28:17.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:28:17.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:28:17.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:27:48, diff=29.970038s, valid=True
2026-05-30T04:28:17.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:28:17.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:28:17.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:28:17.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:28:17.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:28:17.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:28:17.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:28:12, diff=5.973836s, valid=True
2026-05-30T04:28:17.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:28:17.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:28:17.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:28:17.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040739.974694s, valid=True
2026-05-30T04:28:17.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:28:17.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:28:17.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:28:17.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:28:17.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:28:18.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:28:18.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:28:18.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:28:18.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:28:18.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:28:18.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:28:18.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:28:18.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:28:18.369 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:28:18.580 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:28:18.926 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:28:19.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:28:19.028 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:28:19.028 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:28:19.235 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:28:19.235 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:28:49.265 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:28:49.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:28:49.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:28:49.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:28:49.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:28:49.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:28:49.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-05-30T04:28:49.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:28:49.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-05-30T04:28:49.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:28:49.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:28:49.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:28:49.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-05-30T04:29:11.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-05-30T04:29:11.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:29:11.675 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:29:11.676 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:29:11.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:29:11.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:29:11.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:29:11.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:29:11.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:29:11.702 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:29:11.703 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:29:11.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:29:11.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:29:11.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:29:11.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:29:11.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:29:11.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:29:11.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:29:12.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:29:12.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:29:12.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:29:12.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:29:12.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:29:12.094 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:28:54
2026-05-30T04:29:12.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73742, datetime.datetime(2026, 5, 30, 4, 28, 54), datetime.datetime(2026, 5, 30, 4, 28, 53), 'salt', 10.51, 49.47, None, 14.19, 342.46, 10.12, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:29:12.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:29:12.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:29:12.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:28:53, diff=19.102006s, valid=True
2026-05-30T04:29:12.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:29:12.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:29:12.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:29:12, diff=0.105937s, valid=True
2026-05-30T04:29:12.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:29:12.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:29:12.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:28:51, diff=21.115642s, valid=True
2026-05-30T04:29:12.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:29:12.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:29:12.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:29:12.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:29:12.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:29:12.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:29:12.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:29:12, diff=0.11992s, valid=True
2026-05-30T04:29:12.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:29:12.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:29:12.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:29:12.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040794.120861s, valid=True
2026-05-30T04:29:12.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:29:12.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:29:12.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:29:12.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:29:12.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:29:12.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:29:12.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:29:12.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:29:12.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:29:12.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:29:12.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:29:12.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:29:12.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:29:12.451 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:29:12.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:29:13.009 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:29:13.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:29:13.110 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:29:13.110 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:29:14.246 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:29:14.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:29:44.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:29:44.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:29:44.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:29:44.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:29:44.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:29:44.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:29:44.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T04:29:44.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:29:44.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-05-30T04:29:44.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:29:44.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:29:44.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:29:44.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-05-30T04:29:47.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-05-30T04:29:47.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:29:47.207 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:29:47.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:29:47.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:29:47.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:29:47.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:29:47.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:29:47.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:29:47.230 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:29:47.230 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:29:47.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:29:47.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:29:47.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:29:47.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:29:47.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:29:47.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:29:47.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:29:47.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:29:47.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:29:47.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:29:47.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:29:47.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:29:47.605 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:29:24
2026-05-30T04:29:47.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73743, datetime.datetime(2026, 5, 30, 4, 29, 24), datetime.datetime(2026, 5, 30, 4, 29, 24), 'salt', 10.51, 49.5, None, 13.8, 334.36, 10.11, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:29:47.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:29:47.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:29:47.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:29:24, diff=23.612938s, valid=True
2026-05-30T04:29:47.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:29:47.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:29:47.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:29:12, diff=35.616502s, valid=True
2026-05-30T04:29:47.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:29:47.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:29:47.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:29:22, diff=25.624845s, valid=True
2026-05-30T04:29:47.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:29:47.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:29:47.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:29:47.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:29:47.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:29:47.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:29:47.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:29:12, diff=35.628588s, valid=True
2026-05-30T04:29:47.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:29:47.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:29:47.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:29:47.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040829.629411s, valid=True
2026-05-30T04:29:47.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:29:47.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:29:47.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:29:47.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:29:47.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:29:47.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:29:47.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:29:47.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:29:47.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:29:47.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:29:47.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:29:47.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:29:47.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:29:48.016 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:29:48.226 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:29:48.568 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:29:48.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:29:48.667 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:29:48.667 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:29:48.899 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:29:48.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:30:18.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:30:18.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:30:18.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:30:19.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:30:19.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:30:19.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:30:19.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-05-30T04:30:19.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:30:19.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-05-30T04:30:19.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:30:19.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:30:19.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:30:19.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-05-30T04:30:21.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-05-30T04:30:21.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:30:21.831 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:30:21.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:30:21.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:30:21.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:30:21.855 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:30:21.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:30:21.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:30:21.856 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:30:21.856 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:30:21.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:30:21.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:30:21.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:30:22.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:30:22.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:30:22.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:30:22.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:30:22.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:30:22.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:30:22.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:30:22.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:30:22.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:30:22.190 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:29:55
2026-05-30T04:30:22.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73744, datetime.datetime(2026, 5, 30, 4, 29, 55), datetime.datetime(2026, 5, 30, 4, 29, 54), 'salt', 10.45, 49.57, None, 14.89, 342.41, 10.09, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:30:22.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:30:22.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:30:22.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:29:54, diff=28.197496s, valid=True
2026-05-30T04:30:22.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:30:22.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:30:22.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:30:12, diff=10.200635s, valid=True
2026-05-30T04:30:22.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:30:22.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:30:22.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:29:53, diff=29.208095s, valid=True
2026-05-30T04:30:22.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:30:22.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:30:22.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:30:22.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:30:22.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:30:22.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:30:22.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:30:12, diff=10.211442s, valid=True
2026-05-30T04:30:22.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:30:22.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:30:22.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:30:22.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040864.212189s, valid=True
2026-05-30T04:30:22.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:30:22.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:30:22.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:30:22.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:30:22.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:30:22.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:30:22.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:30:22.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:30:22.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:30:22.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:30:22.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:30:22.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:30:22.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:30:22.531 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:30:22.741 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:30:23.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:30:23.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:30:23.185 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:30:23.185 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:30:23.456 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:30:23.457 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:30:53.486 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:30:53.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:30:53.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:30:53.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:30:55.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:30:55.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:30:55.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-05-30T04:30:55.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:30:55.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-05-30T04:30:55.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:30:55.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:30:55.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:30:55.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-05-30T04:31:19.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-05-30T04:31:19.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:31:19.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:31:19.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:31:19.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:31:19.078 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:31:19.079 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:31:19.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:31:19.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:31:19.080 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:31:19.080 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:31:19.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:31:19.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:31:19.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:31:19.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:31:19.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:31:19.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:31:19.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:31:19.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:31:19.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:31:19.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:31:19.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:31:19.398 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:31:19.460 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:30:55
2026-05-30T04:31:19.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73746, datetime.datetime(2026, 5, 30, 4, 30, 55), datetime.datetime(2026, 5, 30, 4, 30, 55), 'salt', 10.48, 49.7, None, 12.7, 330.82, 10.06, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:31:19.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:31:19.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:31:19.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:30:55, diff=24.467568s, valid=True
2026-05-30T04:31:19.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:31:19.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:31:19.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:31:12, diff=7.470949s, valid=True
2026-05-30T04:31:19.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:31:19.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:31:19.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:30:46, diff=33.478965s, valid=True
2026-05-30T04:31:19.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:31:19.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:31:19.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:31:19.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:31:19.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:31:19.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:31:19.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:31:12, diff=7.482627s, valid=True
2026-05-30T04:31:19.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:31:19.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:31:19.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:31:19.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040921.48342s, valid=True
2026-05-30T04:31:19.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:31:19.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:31:19.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:31:19.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:31:19.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:31:19.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:31:19.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:31:19.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:31:19.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:31:19.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:31:19.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:31:19.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:31:19.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:31:19.872 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:31:20.093 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:31:20.441 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:31:20.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:31:20.541 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:31:20.541 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:31:20.736 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:31:20.736 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:31:50.767 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:31:50.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:31:50.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:31:51.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:31:51.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:31:51.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:31:51.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-05-30T04:31:51.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:31:51.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-05-30T04:31:51.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:31:51.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:31:51.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:31:51.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-05-30T04:31:53.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-05-30T04:31:53.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:31:53.746 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:31:53.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:31:53.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:31:53.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:31:53.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:31:53.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:31:53.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:31:53.777 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:31:53.777 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:31:53.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:31:53.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:31:53.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:31:54.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:31:54.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:31:54.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:31:54.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:31:54.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:31:54.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:31:54.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:31:54.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:31:54.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:31:54.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:31:25
2026-05-30T04:31:54.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73747, datetime.datetime(2026, 5, 30, 4, 31, 25), datetime.datetime(2026, 5, 30, 4, 31, 25), 'salt', 10.42, 49.7, None, 16.55, 324.04, 10.06, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:31:54.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:31:54.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:31:54.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:31:25, diff=29.179201s, valid=True
2026-05-30T04:31:54.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:31:54.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:31:54.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:31:12, diff=42.182646s, valid=True
2026-05-30T04:31:54.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:31:54.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:31:54.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:31:18, diff=36.190647s, valid=True
2026-05-30T04:31:54.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:31:54.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:31:54.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:31:54.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:31:54.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:31:54.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:31:54.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:31:12, diff=42.194314s, valid=True
2026-05-30T04:31:54.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:31:54.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:31:54.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:31:54.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040956.19513s, valid=True
2026-05-30T04:31:54.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:31:54.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:31:54.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:31:54.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:31:54.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:31:54.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:31:54.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:31:54.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:31:54.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:31:54.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:31:54.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:31:54.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:31:54.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:31:54.516 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:31:54.726 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:31:55.069 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:31:55.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:31:55.169 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:31:55.169 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:31:55.363 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:31:55.363 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:32:25.394 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:32:25.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:32:25.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:32:26.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:32:26.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:32:26.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:32:26.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-05-30T04:32:26.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:32:26.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-05-30T04:32:26.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:32:26.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:32:26.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:32:26.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-05-30T04:32:28.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-05-30T04:32:28.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:32:28.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:32:28.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:32:28.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:32:28.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:32:28.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:32:28.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:32:28.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:32:28.895 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:32:28.896 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:32:28.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:32:29.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:32:29.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:32:29.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:32:29.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:32:29.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:32:29.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:32:29.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:32:29.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:32:29.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:32:29.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:32:29.216 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:32:29.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:32:26
2026-05-30T04:32:29.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73749, datetime.datetime(2026, 5, 30, 4, 32, 26), datetime.datetime(2026, 5, 30, 4, 32, 26), 'salt', 10.48, 49.37, None, 13.37, 321.29, 10.15, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:32:29.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:32:29.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:32:29.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:32:26, diff=3.287456s, valid=True
2026-05-30T04:32:29.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:32:29.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:32:29.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:32:12, diff=17.290808s, valid=True
2026-05-30T04:32:29.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:32:29.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:32:29.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:32:20, diff=9.298698s, valid=True
2026-05-30T04:32:29.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:32:29.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:32:29.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:32:29.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:32:29.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:32:29.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:32:29.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:32:12, diff=17.302259s, valid=True
2026-05-30T04:32:29.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:32:29.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:32:29.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:32:29.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1040991.30303s, valid=True
2026-05-30T04:32:29.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:32:29.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:32:29.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:32:29.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:32:29.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:32:29.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:32:29.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:32:29.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:32:29.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:32:29.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:32:29.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:32:29.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:32:29.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:32:29.626 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:32:29.845 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:32:30.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:32:30.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:32:30.318 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:32:30.319 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:32:30.586 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:32:30.586 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:33:00.616 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:33:00.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:33:00.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:33:01.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:33:01.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:33:01.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:33:01.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-05-30T04:33:01.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:33:01.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T04:33:01.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:33:01.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:33:01.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:33:01.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-05-30T04:33:04.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-05-30T04:33:04.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:33:04.251 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:33:04.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:33:04.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:33:04.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:33:04.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:33:04.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:33:04.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:33:04.278 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:33:04.278 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:33:04.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:33:04.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:33:04.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:33:04.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:33:04.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:33:04.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:33:04.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:33:04.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:33:04.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:33:04.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:33:04.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:33:04.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:33:04.678 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:32:56
2026-05-30T04:33:04.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73750, datetime.datetime(2026, 5, 30, 4, 32, 56), datetime.datetime(2026, 5, 30, 4, 32, 56), 'salt', 10.38, 49.23, None, 12.46, 330.47, 10.18, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:33:04.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:33:04.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:33:04.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:32:56, diff=8.685446s, valid=True
2026-05-30T04:33:04.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:33:04.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:33:04.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:33:12, diff=-7.311025s, valid=True
2026-05-30T04:33:04.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:33:04.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:33:04.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:32:52, diff=12.697975s, valid=True
2026-05-30T04:33:04.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:33:04.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:33:04.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:33:04.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:33:04.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:33:04.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:33:04.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:33:12, diff=-7.298108s, valid=True
2026-05-30T04:33:04.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:33:04.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:33:04.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:33:04.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041026.702797s, valid=True
2026-05-30T04:33:04.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:33:04.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:33:04.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:33:04.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:33:04.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:33:04.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:33:04.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:33:04.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:33:04.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:33:04.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:33:04.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:33:04.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:33:04.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:33:05.053 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:33:05.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:33:05.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:33:05.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:33:05.789 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:33:05.789 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:33:06.046 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:33:06.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:33:36.077 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:33:36.077 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:33:36.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:33:36.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:33:36.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:33:36.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:33: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-05-30T04:33:36.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:33:36.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-05-30T04:33:36.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:33:36.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:33:36.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:33:36.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-05-30T04:33: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-05-30T04:33:58.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:33:58.423 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:33:58.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:33:58.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:33:58.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:33:58.447 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:33:58.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:33:58.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:33:58.449 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:33:58.449 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:33:58.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:33:58.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:33:58.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:33:58.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:33:58.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:33:58.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T04:33:58.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:33:58.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T04:33:58.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:33:58.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:33:58.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:33:58.772 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:33:58.835 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:33:57
2026-05-30T04:33:58.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73752, datetime.datetime(2026, 5, 30, 4, 33, 57), datetime.datetime(2026, 5, 30, 4, 33, 56), 'salt', 10.58, 48.77, None, 13.8, 339.67, 10.33, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:33:58.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:33:58.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:33:58.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:33:56, diff=2.842998s, valid=True
2026-05-30T04:33:58.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:33:58.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T04:33:58.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:34:12, diff=-13.153466s, valid=True
2026-05-30T04:33:58.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:33:58.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:33:58.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:33:55, diff=3.854944s, valid=True
2026-05-30T04:33:58.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:33:58.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:33:58.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:33:58.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:33:58.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:33:58.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T04:33:58.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:34:12, diff=-13.141254s, valid=True
2026-05-30T04:33:58.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:33:58.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:33:58.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:33:58.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041080.859569s, valid=True
2026-05-30T04:33:58.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:33:58.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:33:58.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:33:58.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:33:58.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:33:58.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:33:58.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:33:58.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:33:58.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:33:58.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:33:59.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:33:59.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:33:59.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:33:59.180 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:33:59.389 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:33:59.731 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:33:59.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:33: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-05-30T04:33: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-05-30T04:34:00.081 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:34:00.081 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:34:30.111 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:34:30.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:34:30.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:34:30.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:34:30.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:34:30.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:34:30.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-05-30T04:34:30.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:34:30.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-05-30T04:34:30.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:34:30.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:34:30.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:34:30.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-05-30T04:34:33.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-05-30T04:34:33.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:34:33.338 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:34:33.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:34:33.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:34:33.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:34:33.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:34:33.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:34:33.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:34:33.362 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:34:33.362 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:34:33.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:34:33.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:34:33.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:34:33.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:34:33.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:34:33.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:34:33.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:34:33.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:34:33.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:34:33.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:34:33.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:34:33.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:34:33.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:34:27
2026-05-30T04:34:33.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73753, datetime.datetime(2026, 5, 30, 4, 34, 27), datetime.datetime(2026, 5, 30, 4, 34, 27), 'salt', 10.55, 48.7, None, 16.02, 313.64, 10.34, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:34:33.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:34:33.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:34:33.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:34:27, diff=6.751929s, valid=True
2026-05-30T04:34:33.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:34:33.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:34:33.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:34:12, diff=21.755345s, valid=True
2026-05-30T04:34:33.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:34:33.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:34:33.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:34:27, diff=6.763406s, valid=True
2026-05-30T04:34:33.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:34:33.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:34:33.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:34:33.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:34:33.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:34:33.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:34:33.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:34:12, diff=21.767065s, valid=True
2026-05-30T04:34:33.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:34:33.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:34:33.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:34:33.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041115.767878s, valid=True
2026-05-30T04:34:33.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:34:33.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:34:33.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:34:33.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:34:33.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:34:33.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:34:33.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:34:33.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:34:33.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:34:33.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:34:33.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:34:33.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:34:34.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:34:34.088 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:34:34.373 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:34:34.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:34:34.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:34:34.819 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:34:34.819 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:34:34.987 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:34:34.987 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:35:05.016 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:35:05.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:35:05.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:35:05.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:35:05.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:35:05.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:35:05.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-05-30T04:35:05.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:35:05.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-05-30T04:35:05.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:35:05.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:35:05.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:35:05.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-05-30T04:35:42.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-05-30T04:35:42.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:35:42.025 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:35:42.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:35:42.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:35:42.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:35:42.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:35:42.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:35:42.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:35:42.051 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:35:42.051 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:35:42.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:35:42.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:35:42.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:35:42.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:35:42.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:35:42.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:35:42.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:35:42.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:35:42.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:35:42.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:35:42.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:35:42.371 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:35:42.433 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:35:28
2026-05-30T04:35:42.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73755, datetime.datetime(2026, 5, 30, 4, 35, 28), datetime.datetime(2026, 5, 30, 4, 35, 27), 'salt', 10.61, 48.74, None, 17.15, 340.89, 10.33, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:35:42.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:35:42.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:35:42.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:35:27, diff=15.441067s, valid=True
2026-05-30T04:35:42.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:35:42.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:35:42.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:35:12, diff=30.44457s, valid=True
2026-05-30T04:35:42.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:35:42.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:35:42.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:35:19, diff=23.452848s, valid=True
2026-05-30T04:35:42.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:35:42.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:35:42.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:35:42.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:35:42.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:35:42.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:35:42.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:35:12, diff=30.456657s, valid=True
2026-05-30T04:35:42.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:35:42.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:35:42.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:35:42.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041184.45749s, valid=True
2026-05-30T04:35:42.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:35:42.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:35:42.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:35:42.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:35:42.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:35:42.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:35:42.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:35:42.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:35:42.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:35:42.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:35:42.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:35:42.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:35:42.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:35:42.781 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:35:42.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:35:43.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:35:43.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:35:43.435 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:35:43.435 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:35:43.651 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:35:43.651 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:36:13.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:36:13.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:36:13.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:36:14.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:36:14.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:36:14.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:36:14.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-05-30T04:36:14.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:36:14.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-05-30T04:36:14.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:36:14.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:36:14.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:36:14.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-05-30T04:36:46.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T04:36:46.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:36:46.971 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:36:46.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:36:46.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:36:46.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:36:46.994 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:36:46.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:36:46.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:36:46.995 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:36:46.996 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:36:47.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:36:47.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:36:47.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:36:47.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:36:47.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:36:47.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:36:47.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:36:47.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:36:47.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:36:47.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:36:47.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:36:47.316 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:36:47.382 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:36:28
2026-05-30T04:36:47.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73757, datetime.datetime(2026, 5, 30, 4, 36, 28), datetime.datetime(2026, 5, 30, 4, 36, 28), 'salt', 10.52, 48.77, None, 15.63, 336.62, 10.33, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:36:47.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:36:47.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:36:47.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:36:28, diff=19.390073s, valid=True
2026-05-30T04:36:47.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:36:47.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:36:47.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:36:12, diff=35.393561s, valid=True
2026-05-30T04:36:47.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:36:47.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:36:47.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:36:22, diff=25.401902s, valid=True
2026-05-30T04:36:47.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:36:47.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:36:47.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:36:47.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:36:47.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:36:47.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:36:47.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:36:12, diff=35.40569s, valid=True
2026-05-30T04:36:47.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:36:47.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:36:47.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:36:47.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041249.406518s, valid=True
2026-05-30T04:36:47.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:36:47.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:36:47.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:36:47.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:36:47.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:36:47.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:36:47.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:36:47.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:36:47.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:36:47.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:36:47.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:36:47.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:36:47.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:36:47.797 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:36:48.009 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:36:48.357 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:36:48.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:36:48.458 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:36:48.458 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:36:48.652 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:36:48.652 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:37:18.682 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:37:18.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:37:18.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:37:18.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:37:18.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:37:19.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:37:19.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-05-30T04:37:19.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:37:19.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-05-30T04:37:19.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:37:19.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:37:19.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:37:19.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-05-30T04:37:28.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-05-30T04:37:28.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:37:28.341 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:37:28.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:37:28.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:37:28.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:37:28.366 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:37:28.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:37:28.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:37:28.367 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:37:28.367 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:37:28.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:37:28.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:37:28.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:37:28.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:37:28.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:37:28.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:37:28.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:37:28.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:37:28.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:37:28.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:37:28.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:37:28.685 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:37:28.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:36:58
2026-05-30T04:37:28.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73758, datetime.datetime(2026, 5, 30, 4, 36, 58), datetime.datetime(2026, 5, 30, 4, 36, 58), 'salt', 10.48, 48.94, None, 15.46, 342.46, 10.27, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:37:28.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:37:28.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:37:28.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:36:58, diff=30.756936s, valid=True
2026-05-30T04:37:28.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:37:28.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:37:28.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:37:12, diff=16.76035s, valid=True
2026-05-30T04:37:28.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:37:28.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:37:28.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:36:53, diff=35.768239s, valid=True
2026-05-30T04:37:28.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:37:28.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:37:28.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:37:28.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:37:28.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:37:28.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:37:28.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:37:12, diff=16.771909s, valid=True
2026-05-30T04:37:28.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:37:28.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:37:28.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:37:28.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041290.772707s, valid=True
2026-05-30T04:37:28.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:37:28.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:37:28.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:37:28.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:37:28.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:37:28.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:37:28.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:37:28.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:37:28.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:37:28.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:37:28.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:37:29.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:37:29.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:37:29.095 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:37:29.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:37:29.677 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:37:29.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:37:29.776 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:37:29.776 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:37:30.046 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:37:30.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:38:00.076 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:38:00.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:38:00.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:38:00.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:38:00.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:38:00.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:38:00.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T04:38:00.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:38:00.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-05-30T04:38:00.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:38:00.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:38:00.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:38:00.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-05-30T04:38:43.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-05-30T04:38:43.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:38:43.163 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:38:43.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:38:43.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:38:43.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:38:43.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:38:43.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:38:43.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:38:43.188 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:38:43.188 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:38:43.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:38:43.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:38:43.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:38:43.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:38:43.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:38:43.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:38:43.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:38:43.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:38:43.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:38:43.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:38:43.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:38:43.515 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:38:43.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:38:30
2026-05-30T04:38:43.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73761, datetime.datetime(2026, 5, 30, 4, 38, 30), datetime.datetime(2026, 5, 30, 4, 38, 29), 'salt', 10.71, 48.17, None, 13.06, 331.22, 10.5, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:38:43.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:38:43.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:38:43.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:38:29, diff=14.585805s, valid=True
2026-05-30T04:38:43.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:38:43.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:38:43.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:38:12, diff=31.58932s, valid=True
2026-05-30T04:38:43.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:38:43.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:38:43.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:38:28, diff=15.597368s, valid=True
2026-05-30T04:38:43.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:38:43.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:38:43.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:38:43.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:38:43.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:38:43.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:38:43.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:38:12, diff=31.600986s, valid=True
2026-05-30T04:38:43.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:38:43.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:38:43.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:38:43.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041365.601779s, valid=True
2026-05-30T04:38:43.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:38:43.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:38:43.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:38:43.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:38:43.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:38:43.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:38:43.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:38:43.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:38:43.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:38:43.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:38:43.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:38:43.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:38:43.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:38:43.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:38:44.210 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:38:44.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:38:44.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:38:44.642 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:38:44.642 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:38:44.912 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:38:44.912 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:39:14.941 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:39:14.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:39:14.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:39:15.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:39:15.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:39:15.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:39:15.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-05-30T04:39:15.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:39:15.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-05-30T04:39:15.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:39:15.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:39:15.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:39:15.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T04:39:18.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-05-30T04:39:18.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:39:18.068 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:39:18.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:39:18.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:39:18.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:39:18.093 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:39:18.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:39:18.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:39:18.094 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:39:18.094 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:39:18.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:39:18.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:39:18.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:39:18.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:39:18.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:39:18.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:39:18.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:39:18.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:39:18.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:39:18.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:39:18.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:39:18.423 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:39:18.486 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:39:00
2026-05-30T04:39:18.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73762, datetime.datetime(2026, 5, 30, 4, 39), datetime.datetime(2026, 5, 30, 4, 38, 59), 'salt', 10.71, 48.34, None, 12.46, 320.59, 10.46, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:39:18.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:39:18.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:39:18.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:38:59, diff=19.493517s, valid=True
2026-05-30T04:39:18.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:39:18.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:39:18.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:39:12, diff=6.496916s, valid=True
2026-05-30T04:39:18.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:39:18.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:39:18.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:38:59, diff=19.504981s, valid=True
2026-05-30T04:39:18.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:39:18.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:39:18.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:39:18.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:39:18.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:39:18.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:39:18.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:39:12, diff=6.508594s, valid=True
2026-05-30T04:39:18.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:39:18.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:39:18.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:39:18.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041400.509391s, valid=True
2026-05-30T04:39:18.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:39:18.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:39:18.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:39:18.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:39:18.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:39:18.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:39:18.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:39:18.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:39:18.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:39:18.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:39:18.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:39:18.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:39:18.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:39:18.830 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:39:19.032 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:39:19.366 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:39:19.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:39:19.464 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:39:19.465 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:39:19.698 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:39:19.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:39:49.708 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:39:49.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:39:49.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:39:49.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:39:50.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:39:50.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:39:50.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-05-30T04:39:50.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:39:50.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-05-30T04:39:50.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:39:50.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:39:50.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:39:50.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T04:40:00.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-05-30T04:40:00.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:40:00.060 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:40:00.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:40:00.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:40:00.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:40:00.081 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:40:00.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:40:00.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:40:00.082 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:40:00.082 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:40:00.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:40:00.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:40:00.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:40:00.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:40:00.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:40:00.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:40:00.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:40:00.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:40:00.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:40:00.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:40:00.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:40:00.382 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:40:00.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:39:30
2026-05-30T04:40:00.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73763, datetime.datetime(2026, 5, 30, 4, 39, 30), datetime.datetime(2026, 5, 30, 4, 39, 30), 'salt', 10.68, 48.31, None, 14.08, 350.75, 10.47, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:40:00.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:40:00.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:40:00.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:39:30, diff=30.452409s, valid=True
2026-05-30T04:40:00.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:40:00.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:40:00.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:39:12, diff=48.455743s, valid=True
2026-05-30T04:40:00.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:40:00.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:40:00.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:39:21, diff=39.463595s, valid=True
2026-05-30T04:40:00.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:40:00.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:40:00.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:40:00.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:40:00.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:40:00.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:40:00.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:39:12, diff=48.467141s, valid=True
2026-05-30T04:40:00.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:40:00.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:40:00.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:40:00.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041442.46792s, valid=True
2026-05-30T04:40:00.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:40:00.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:40:00.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:40:00.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:40:00.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:40:00.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:40:00.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:40:00.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:40:00.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:40:00.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:40:00.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:40:00.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:40:00.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:40:00.856 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:40:01.062 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:40:01.399 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:40:01.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:40:01.510 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:40:01.510 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:40:01.770 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:40:01.770 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:40:31.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:40:31.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:40:31.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:40:32.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:40:32.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:40:32.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:40:32.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-05-30T04:40:32.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:40:32.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-05-30T04:40:32.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:40:32.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:40:32.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:40:32.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T04:40:34.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-05-30T04:40:34.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:40:34.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:40:34.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:40:34.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:40:34.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:40:34.933 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:40:34.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:40:34.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:40:34.934 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:40:34.934 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:40:34.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:40:35.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:40:35.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:40:35.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:40:35.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:40:35.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:40:35.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:40:35.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:40:35.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:40:35.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:40:35.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:40:35.259 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:40:35.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:40:31
2026-05-30T04:40:35.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73765, datetime.datetime(2026, 5, 30, 4, 40, 31), datetime.datetime(2026, 5, 30, 4, 40, 30), 'salt', 10.68, 48.17, None, 14.54, 339.81, 10.5, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:40:35.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:40:35.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:40:35.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:40:30, diff=5.330312s, valid=True
2026-05-30T04:40:35.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:40:35.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:40:35.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:40:12, diff=23.333817s, valid=True
2026-05-30T04:40:35.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:40:35.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:40:35.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:40:23, diff=12.34202s, valid=True
2026-05-30T04:40:35.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:40:35.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:40:35.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:40:35.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:40:35.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:40:35.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:40:35.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:40:12, diff=23.345802s, valid=True
2026-05-30T04:40:35.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:40:35.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:40:35.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:40:35.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041477.346614s, valid=True
2026-05-30T04:40:35.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:40:35.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:40:35.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:40:35.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:40:35.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:40:35.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:40:35.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:40:35.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:40:35.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:40:35.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:40:35.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:40:35.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:40:35.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:40:35.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:40:35.878 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:40:36.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:40:36.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:40:36.319 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:40:36.320 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:40:37.151 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:40:37.151 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:41:07.181 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:41:07.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:41:07.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:41:07.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:41:07.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:41:07.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:41:07.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-05-30T04:41:07.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:41:07.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-05-30T04:41:07.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:41:07.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:41:07.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:41:07.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-05-30T04:41:10.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-05-30T04:41:10.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:41:10.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:41:10.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:41:10.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:41:10.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:41:10.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:41:10.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:41:10.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:41:10.300 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:41:10.300 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:41:10.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:41:10.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:41:10.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:41:10.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:41:10.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:41:10.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:41:10.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:41:10.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:41:10.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:41:10.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:41:10.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:41:10.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:41:10.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:41:01
2026-05-30T04:41:10.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73766, datetime.datetime(2026, 5, 30, 4, 41, 1), datetime.datetime(2026, 5, 30, 4, 41), 'salt', 10.71, 48.37, None, 13.27, 327.23, 10.45, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:41:10.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:41:10.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:41:10.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:41:00, diff=10.688143s, valid=True
2026-05-30T04:41:10.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:41:10.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:41:10.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:41:12, diff=-1.30849s, valid=True
2026-05-30T04:41:10.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:41:10.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:41:10.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:40:54, diff=16.699377s, valid=True
2026-05-30T04:41:10.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:41:10.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:41:10.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:41:10.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:41:10.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:41:10.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:41:10.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:41:12, diff=-1.296979s, valid=True
2026-05-30T04:41:10.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:41:10.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:41:10.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:41:10.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041512.703814s, valid=True
2026-05-30T04:41:10.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:41:10.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:41:10.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:41:10.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:41:10.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:41:10.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:41:10.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:41:10.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:41:10.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:41:10.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:41:10.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:41:10.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:41:10.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:41:11.024 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:41:11.227 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:41:11.560 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:41:11.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:41:11.662 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:41:11.662 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:41:11.902 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:41:11.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:41:41.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:41:41.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:41:41.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:41:42.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:41:42.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:41:42.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:41:42.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-05-30T04:41:42.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:41:42.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-05-30T04:41:42.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:41:42.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:41:42.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:41:42.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-05-30T04:41:44.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-05-30T04:41:44.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:41:44.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:41:44.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:41:44.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:41:44.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:41:44.956 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:41:44.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:41:44.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:41:44.957 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:41:44.957 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:41:44.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:41:45.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:41:45.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:41:45.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:41:45.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:41:45.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:41:45.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:41:45.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:41:45.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:41:45.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:41:45.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:41:45.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:41:45.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:41:31
2026-05-30T04:41:45.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73767, datetime.datetime(2026, 5, 30, 4, 41, 31), datetime.datetime(2026, 5, 30, 4, 41, 31), 'salt', 10.68, 48.34, None, 16.73, 326.41, 10.46, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:41:45.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:41:45.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:41:45.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:41:31, diff=14.342324s, valid=True
2026-05-30T04:41:45.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:41:45.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:41:45.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:41:12, diff=33.345728s, valid=True
2026-05-30T04:41:45.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:41:45.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:41:45.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:41:26, diff=19.353688s, valid=True
2026-05-30T04:41:45.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:41:45.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:41:45.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:41:45.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:41:45.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:41:45.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:41:45.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:41:12, diff=33.357305s, valid=True
2026-05-30T04:41:45.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:41:45.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:41:45.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:41:45.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041547.358112s, valid=True
2026-05-30T04:41:45.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:41:45.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:41:45.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:41:45.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:41:45.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:41:45.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:41:45.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:41:45.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:41:45.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:41:45.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:41:45.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:41:45.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:41:45.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:41:45.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:41:45.881 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:41:46.214 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:41:46.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:41:46.371 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:41:46.371 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:41:46.614 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:41:46.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:42:16.640 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:42:16.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:42:16.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:42:16.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:42:16.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:42:17.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:42:17.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-05-30T04:42:17.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:42:17.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-05-30T04:42:17.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:42:17.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:42:17.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:42:17.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-05-30T04:43:02.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T04:43:02.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:43:02.362 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:43:02.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:43:02.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:43:02.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:43:02.385 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:43:02.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:43:02.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:43:02.386 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:43:02.387 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:43:02.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:43:02.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:43:02.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:43:02.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:43:02.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:43:02.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:43:02.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:43:02.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:43:02.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:43:02.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:43:02.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:43:02.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:43:02.782 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:43:02
2026-05-30T04:43:02.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73770, datetime.datetime(2026, 5, 30, 4, 43, 2), datetime.datetime(2026, 5, 30, 4, 43, 1), 'salt', 10.68, 48.57, None, 11.89, 325.42, 10.39, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:43:02.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:43:02.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:43:02.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:43:01, diff=1.790111s, valid=True
2026-05-30T04:43:02.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:43:02.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:43:02.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:41:12, diff=110.793728s, valid=True
2026-05-30T04:43:02.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:43:02.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:43:02.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:43:00, diff=2.802247s, valid=True
2026-05-30T04:43:02.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:43:02.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:43:02.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:43:02.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:43:02.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:43:02.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:43:02.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:41:12, diff=110.806152s, valid=True
2026-05-30T04:43:02.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:43:02.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:43:02.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:43:02.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041624.807022s, valid=True
2026-05-30T04:43:02.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:43:02.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:43:02.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:43:02.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:43:02.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:43:02.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:43:02.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:43:02.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:43:02.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:43:02.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:43:03.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:43:03.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:43:03.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:43:03.129 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:43:03.330 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:43:03.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:43:03.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:43:03.761 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:43:03.761 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:43:04.009 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:43:04.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:43:34.039 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:43:34.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:43:34.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:43:34.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:43:34.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:43:34.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:43:34.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-05-30T04:43:34.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:43:34.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T04:43:34.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:43:34.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:43:34.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:43:34.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-05-30T04:43:37.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-05-30T04:43:37.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:43:37.046 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:43:37.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:43:37.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:43:37.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:43:37.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:43:37.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:43:37.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:43:37.070 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:43:37.070 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:43:37.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:43:37.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:43:37.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:43:37.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:43:37.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:43:37.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T04:43:37.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:43:37.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T04:43:37.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:43:37.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:43:37.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:43:37.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:43:37.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:43:32
2026-05-30T04:43:37.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73771, datetime.datetime(2026, 5, 30, 4, 43, 32), datetime.datetime(2026, 5, 30, 4, 43, 32), 'salt', 10.65, 48.57, None, 15.63, 337.13, 10.39, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:43:37.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:43:37.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:43:37.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:43:32, diff=5.455295s, valid=True
2026-05-30T04:43:37.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:43:37.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T04:43:37.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:41:12, diff=145.458769s, valid=True
2026-05-30T04:43:37.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:43:37.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:43:37.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:43:31, diff=6.467065s, valid=True
2026-05-30T04:43:37.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:43:37.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:43:37.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:43:37.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:43:37.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:43:37.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T04:43:37.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:41:12, diff=145.47078s, valid=True
2026-05-30T04:43:37.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:43:37.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:43:37.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:43:37.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041659.471593s, valid=True
2026-05-30T04:43:37.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:43:37.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:43:37.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:43:37.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:43:37.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:43:37.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:43:37.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:43:37.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:43:37.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:43:37.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:43:37.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:43:37.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:43:37.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:43:37.795 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:43:38.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:43:38.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:43:38.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:43:38.516 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:43:38.516 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:43:38.733 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:43:38.733 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:44:08.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:44:08.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:44:08.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:44:09.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:44:09.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:44:09.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:44:09.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-05-30T04:44:09.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:44:09.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-05-30T04:44:09.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:44:09.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:44:09.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:44:09.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-05-30T04:44:31.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-05-30T04:44:31.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:44:31.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:44:31.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:44:31.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:44:31.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:44:31.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:44:31.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:44:31.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:44:31.735 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:44:31.735 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:44:31.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:44:31.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:44:31.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:44:31.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:44:31.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:44:31.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T04:44:31.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:44:32.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T04:44:32.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:44:32.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:44:32.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:44:32.005 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:44:32.067 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:44:03
2026-05-30T04:44:32.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73772, datetime.datetime(2026, 5, 30, 4, 44, 3), datetime.datetime(2026, 5, 30, 4, 44, 2), 'salt', 10.61, 48.64, None, 16.73, 344.9, 10.36, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:44:32.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:44:32.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:44:32.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:44:02, diff=30.074664s, valid=True
2026-05-30T04:44:32.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:44:32.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T04:44:32.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:41:12, diff=200.077796s, valid=True
2026-05-30T04:44:32.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:44:32.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:44:32.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:43:53, diff=39.08525s, valid=True
2026-05-30T04:44:32.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:44:32.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:44:32.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:44:32.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:44:32.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:44:32.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T04:44:32.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:41:12, diff=200.088575s, valid=True
2026-05-30T04:44:32.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:44:32.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:44:32.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:44:32.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041714.08932s, valid=True
2026-05-30T04:44:32.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:44:32.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:44:32.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:44:32.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:44:32.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:44:32.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:44:32.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:44:32.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:44:32.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:44:32.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:44:32.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:44:32.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:44:32.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:44:32.529 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:44:32.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:44:33.063 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:44:33.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:44: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-05-30T04:44: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-05-30T04:44:33.321 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:44:33.321 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:45:03.352 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:45:03.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:45:03.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:45:03.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:45:03.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:45:03.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:45:03.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-05-30T04:45:03.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:45:03.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-05-30T04:45:03.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:45:03.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:45:03.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:45:03.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-05-30T04:45:06.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T04:45:06.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:45:06.261 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:45:06.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:45:06.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:45:06.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:45:06.285 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:45:06.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:45:06.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:45:06.286 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:45:06.286 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:45:06.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:45:06.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:45:06.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:45:06.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:45:06.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:45:06.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T04:45:06.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:45:06.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T04:45:06.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:45:06.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:45:06.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:45:06.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:45:06.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:45:04
2026-05-30T04:45:06.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73774, datetime.datetime(2026, 5, 30, 4, 45, 4), datetime.datetime(2026, 5, 30, 4, 45, 4), 'salt', 10.65, 48.44, None, 16.44, 331.1, 10.43, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:45:06.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:45:06.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:45:06.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:45:04, diff=2.662922s, valid=True
2026-05-30T04:45:06.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:45:06.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T04:45:06.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:45:12, diff=-5.334153s, valid=True
2026-05-30T04:45:06.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:45:06.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:45:06.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:44:55, diff=11.672606s, valid=True
2026-05-30T04:45:06.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:45:06.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:45:06.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:45:06.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:45:06.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:45:06.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T04:45:06.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:45:12, diff=-5.324291s, valid=True
2026-05-30T04:45:06.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:45:06.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:45:06.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:45:06.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041748.67637s, valid=True
2026-05-30T04:45:06.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:45:06.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:45:06.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:45:06.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:45:06.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:45:06.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:45:06.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:45:06.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:45:06.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:45:06.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:45:07.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:45:07.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:45:07.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:45:07.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:45:07.403 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:45:07.738 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:45:07.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:45:07.836 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:45:07.836 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:45:08.049 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:45:08.050 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:45:38.075 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:45:38.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:45:38.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:45:38.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:45:38.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:45:38.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:45:38.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-05-30T04:45:38.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:45:38.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-05-30T04:45:38.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:45:38.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:45:38.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:45:38.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-05-30T04:46:14.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-05-30T04:46:14.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:46:14.400 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:46:14.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:46:14.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:46:14.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:46:14.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:46:14.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:46:14.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:46:14.425 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:46:14.425 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:46:14.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:46:14.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:46:14.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:46:14.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:46:14.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:46:14.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T04:46:14.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:46:14.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T04:46:14.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:46:14.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:46:14.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:46:14.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:46:14.818 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:46:04
2026-05-30T04:46:14.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73776, datetime.datetime(2026, 5, 30, 4, 46, 4), datetime.datetime(2026, 5, 30, 4, 46, 4), 'salt', 10.65, 48.77, None, 12.67, 337.11, 10.33, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:46:14.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:46:14.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:46:14.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:46:04, diff=10.825583s, valid=True
2026-05-30T04:46:14.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:46:14.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T04:46:14.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:46:12, diff=2.82907s, valid=True
2026-05-30T04:46:14.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:46:14.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:46:14.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:46:04, diff=10.837255s, valid=True
2026-05-30T04:46:14.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:46:14.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:46:14.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:46:14.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:46:14.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:46:14.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T04:46:14.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:46:12, diff=2.841995s, valid=True
2026-05-30T04:46:14.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:46:14.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:46:14.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:46:14.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041816.842896s, valid=True
2026-05-30T04:46:14.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:46:14.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:46:14.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:46:14.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:46:14.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:46:14.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:46:14.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:46:14.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:46:14.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:46:14.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:46:15.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:46:15.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:46:15.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:46:15.165 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:46:15.365 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:46:15.697 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:46:15.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:46:15.795 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:46:15.795 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:46:15.964 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:46:15.965 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:46:45.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:46:45.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:46:45.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:46:46.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:46:46.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:46:46.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:46: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-05-30T04:46:46.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:46:46.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T04:46:46.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:46:46.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:46:46.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:46:46.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-05-30T04:47:07.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-05-30T04:47:07.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:47:07.640 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:47:07.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:47:07.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:47:07.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:47:07.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:47:07.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:47:07.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:47:07.673 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:47:07.673 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:47:07.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:47:07.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:47:07.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:47:07.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:47:07.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:47:07.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T04:47:07.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:47:07.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T04:47:07.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:47:08.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:47:08.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:47:08.002 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:47:08.064 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:47:06
2026-05-30T04:47:08.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73778, datetime.datetime(2026, 5, 30, 4, 47, 6), datetime.datetime(2026, 5, 30, 4, 47, 5), 'salt', 10.61, 48.5, None, 12.07, 334.51, 10.4, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:47:08.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:47:08.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:47:08.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:47:05, diff=3.071952s, valid=True
2026-05-30T04:47:08.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:47:08.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T04:47:08.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:47:12, diff=-3.924559s, valid=True
2026-05-30T04:47:08.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:47:08.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:47:08.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:47:05, diff=3.083595s, valid=True
2026-05-30T04:47:08.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:47:08.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:47:08.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:47:08.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:47:08.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:47:08.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T04:47:08.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:47:12, diff=-3.911636s, valid=True
2026-05-30T04:47:08.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:47:08.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:47:08.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:47:08.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041870.089263s, valid=True
2026-05-30T04:47:08.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:47:08.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:47:08.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:47:08.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:47:08.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:47:08.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:47:08.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:47:08.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:47:08.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:47:08.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:47:08.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:47:08.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:47:08.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:47:08.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:47:08.679 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:47:09.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:47:09.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:47:09.110 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:47:09.110 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:47:09.366 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:47:09.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:47:39.396 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:47:39.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:47:39.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:47:39.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:47:39.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:47:39.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:47:39.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-05-30T04:47:39.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:47:39.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-05-30T04:47:39.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:47:39.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:47:39.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:47:39.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-05-30T04:47:46.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-05-30T04:47:46.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:47:46.251 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:47:46.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:47:46.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:47:46.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:47:46.278 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:47:46.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:47:46.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:47:46.279 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:47:46.279 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:47:46.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:47:46.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:47:46.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:47:46.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:47:46.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:47:46.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:47:46.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:47:46.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:47:46.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:47:46.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:47:46.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:47:46.607 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:47:46.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:47:36
2026-05-30T04:47:46.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73779, datetime.datetime(2026, 5, 30, 4, 47, 36), datetime.datetime(2026, 5, 30, 4, 47, 36), 'salt', 10.61, 48.47, None, 13.52, 330.84, 10.41, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:47:46.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:47:46.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:47:46.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:47:36, diff=10.679977s, valid=True
2026-05-30T04:47:46.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:47:46.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:47:46.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:48:12, diff=-25.316514s, valid=True
2026-05-30T04:47:46.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:47:46.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:47:46.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:47:35, diff=11.691856s, valid=True
2026-05-30T04:47:46.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:47:46.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:47:46.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:47:46.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:47:46.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:47:46.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:47:46.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:48:12, diff=-25.304364s, valid=True
2026-05-30T04:47:46.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:47:46.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:47:46.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:47:46.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041908.696467s, valid=True
2026-05-30T04:47:46.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:47:46.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:47:46.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:47:46.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:47:46.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:47:46.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:47:46.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:47:46.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:47:46.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:47:46.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:47:46.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:47:46.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:47:46.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:47:47.021 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:47:47.221 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:47:47.554 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:47:47.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:47:47.652 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:47:47.652 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:47:47.808 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:47:47.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:48:17.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:48:17.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:48:17.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:48:17.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:48:17.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:48:18.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:48:18.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-05-30T04:48:18.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:48:18.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-05-30T04:48:18.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:48:18.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:48:18.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:48: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-05-30T04:48:20.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-05-30T04:48:20.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:48:20.687 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:48:20.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:48:20.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:48:20.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:48:20.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:48:20.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:48:20.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:48:20.712 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:48:20.712 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:48:20.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:48:20.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:48:20.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:48:20.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:48:20.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:48:21.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:48:21.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:48:21.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:48:21.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:48:21.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:48:21.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:48:21.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:48:21.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:48:07
2026-05-30T04:48:21.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73780, datetime.datetime(2026, 5, 30, 4, 48, 7), datetime.datetime(2026, 5, 30, 4, 48, 6), 'salt', 10.68, 48.31, None, 13.52, 324.48, 10.47, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:48:21.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:48:21.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:48:21.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:48:06, diff=15.122849s, valid=True
2026-05-30T04:48:21.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:48:21.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:48:21.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:48:12, diff=9.125784s, valid=True
2026-05-30T04:48:21.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:48:21.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:48:21.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:48:05, diff=16.132577s, valid=True
2026-05-30T04:48:21.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:48:21.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:48:21.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:48:21.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:48:21.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:48:21.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:48:21.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:48:12, diff=9.135668s, valid=True
2026-05-30T04:48:21.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:48:21.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:48:21.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:48:21.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041943.136329s, valid=True
2026-05-30T04:48:21.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:48:21.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:48:21.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:48:21.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:48:21.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:48:21.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:48:21.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:48:21.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:48:21.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:48:21.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:48:21.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:48:21.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:48:21.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:48:21.544 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:48:21.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:48:22.083 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:48:22.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:48:22.182 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:48:22.182 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:48:22.391 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:48:22.392 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:48:52.400 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:48:52.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:48:52.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:48:52.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:48:52.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:48:52.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:48: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-05-30T04:48:52.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:48:52.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-05-30T04:48:52.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:48:52.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:48:52.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:48:52.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-05-30T04:48:55.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-05-30T04:48:55.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:48:55.211 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:48:55.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:48:55.221 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:48:55.234 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:48:55.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:48:55.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:48:55.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:48:55.236 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:48:55.236 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:48:55.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:48:55.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:48:55.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:48:55.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:48:55.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:48:55.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:48:55.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:48:55.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:48:55.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:48:55.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:48:55.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:48:55.563 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:48:55.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:48:37
2026-05-30T04:48:55.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73781, datetime.datetime(2026, 5, 30, 4, 48, 37), datetime.datetime(2026, 5, 30, 4, 48, 36), 'salt', 10.65, 48.37, None, 17.22, 339.58, 10.45, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:48:55.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:48:55.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:48:55.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:48:36, diff=19.634731s, valid=True
2026-05-30T04:48:55.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:48:55.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:48:55.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:49:12, diff=-16.361772s, valid=True
2026-05-30T04:48:55.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:48:55.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:48:55.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:48:35, diff=20.646507s, valid=True
2026-05-30T04:48:55.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:48:55.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:48:55.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:48:55.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:48:55.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:48:55.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:48:55.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:49:12, diff=-16.349705s, valid=True
2026-05-30T04:48:55.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:48:55.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:48:55.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:48:55.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1041977.651118s, valid=True
2026-05-30T04:48:55.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:48:55.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:48:55.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:48:55.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:48:55.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:48:55.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:48:55.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:48:55.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:48:55.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:48:55.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:48:55.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:48:55.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:48:55.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:48:55.973 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:48:56.174 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:48:56.508 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:48:56.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:48:56.607 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:48:56.608 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:48:56.819 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:48:56.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:49:26.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:49:26.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:49:26.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:49:26.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:49:26.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:49:27.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:49:27.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-05-30T04:49:27.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:49:27.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-05-30T04:49:27.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:49:27.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:49:27.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:49:27.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-05-30T04:49:29.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-05-30T04:49:29.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:49:29.579 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:49:29.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:49:29.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:49:29.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:49:29.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:49:29.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:49:29.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:49:29.610 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:49:29.610 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:49:29.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:49:29.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:49:29.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:49:29.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:49:29.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:49:29.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:49:29.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:49:29.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:49:29.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:49:29.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:49:29.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:49:29.930 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:49:29.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:49:07
2026-05-30T04:49:29.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73782, datetime.datetime(2026, 5, 30, 4, 49, 7), datetime.datetime(2026, 5, 30, 4, 49, 6), 'salt', 10.65, 48.6, None, 15.99, 335.02, 10.38, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:49:29.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:49:29.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:49:29.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:49:06, diff=23.999098s, valid=True
2026-05-30T04:49:29.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:49:29.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:49:30.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:49:12, diff=18.002058s, valid=True
2026-05-30T04:49:30.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:49:30.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:49:30.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:49:07, diff=23.008799s, valid=True
2026-05-30T04:49:30.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:49:30.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:49:30.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:49:30.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:49:30.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:49:30.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:49:30.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:49:12, diff=18.01186s, valid=True
2026-05-30T04:49:30.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:49:30.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:49:30.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:49:30.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042012.012527s, valid=True
2026-05-30T04:49:30.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:49:30.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:49:30.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:49:30.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:49:30.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:49:30.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:49:30.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:49:30.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:49:30.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:49:30.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:49:30.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:49:30.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:49:30.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:49:30.344 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:49:30.545 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:49:30.878 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:49:30.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:49:30.978 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:49:30.978 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:49:31.139 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:49:31.139 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:50:01.143 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:50:01.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:50:01.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:50:01.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:50:01.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:50:01.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:50:01.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-05-30T04:50:01.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:50:01.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T04:50:01.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:50:01.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:50:01.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:50:01.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-05-30T04:50:33.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-05-30T04:50:33.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:50:33.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:50:33.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:50:33.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:50:33.619 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:50:33.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:50:33.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:50:33.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:50:33.621 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:50:33.622 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:50:33.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:50:33.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:50:33.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:50:33.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:50:33.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:50:33.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:50:33.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:50:33.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:50:33.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:50:33.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:50:33.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:50:33.950 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:50:34.016 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:50:08
2026-05-30T04:50:34.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73784, datetime.datetime(2026, 5, 30, 4, 50, 8), datetime.datetime(2026, 5, 30, 4, 50, 7), 'salt', 10.58, 48.44, None, 17.08, 336.69, 10.42, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:50:34.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:50:34.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:50:34.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:50:07, diff=27.024237s, valid=True
2026-05-30T04:50:34.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:50:34.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:50:34.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:50:12, diff=22.027572s, valid=True
2026-05-30T04:50:34.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:50:34.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:50:34.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:50:06, diff=28.035581s, valid=True
2026-05-30T04:50:34.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:50:34.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:50:34.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:50:34.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:50:34.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:50:34.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:50:34.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:50:12, diff=22.039153s, valid=True
2026-05-30T04:50:34.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:50:34.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:50:34.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:50:34.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042076.03995s, valid=True
2026-05-30T04:50:34.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:50:34.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:50:34.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:50:34.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:50:34.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:50:34.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:50:34.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:50:34.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:50:34.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:50:34.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:50:34.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:50:34.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:50:34.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:50:34.361 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:50:34.570 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:50:34.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:50:35.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:50:35.071 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:50:35.071 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:50:35.316 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:50:35.316 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:51:05.319 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:51:05.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:51:05.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:51:05.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:51:05.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:51:05.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:51:05.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-05-30T04:51:05.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:51: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-05-30T04:51:05.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:51:05.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:51:05.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:51:05.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-05-30T04:51:26.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T04:51:26.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:51:26.854 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:51:26.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:51:26.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:51:26.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:51:26.878 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:51:26.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:51:26.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:51:26.879 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:51:26.880 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:51:26.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:51:27.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:51:27.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:51:27.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:51:27.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:51:27.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:51:27.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:51:27.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:51:27.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:51:27.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:51:27.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:51:27.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:51:27.252 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:51:08
2026-05-30T04:51:27.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73786, datetime.datetime(2026, 5, 30, 4, 51, 8), datetime.datetime(2026, 5, 30, 4, 51, 8), 'salt', 10.58, 48.64, None, 15.28, 354.72, 10.36, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:51:27.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:51:27.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:51:27.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:51:08, diff=19.258408s, valid=True
2026-05-30T04:51:27.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:51:27.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:51:27.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:51:12, diff=15.261225s, valid=True
2026-05-30T04:51:27.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:51:27.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:51:27.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:51:06, diff=21.268079s, valid=True
2026-05-30T04:51:27.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:51:27.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:51:27.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:51:27.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:51:27.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:51:27.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:51:27.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:51:12, diff=15.2711s, valid=True
2026-05-30T04:51:27.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:51:27.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:51:27.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:51:27.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042129.271759s, valid=True
2026-05-30T04:51:27.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:51:27.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:51:27.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:51:27.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:51:27.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:51:27.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:51:27.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:51:27.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:51:27.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:51:27.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:51:27.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:51:27.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:51:27.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:51:27.588 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:51:27.799 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:51:28.147 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:51:28.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:51:28.247 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:51:28.247 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:51:28.533 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:51:28.533 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:51:58.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:51:58.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:51:58.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:51:58.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:51:58.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:51:58.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:51: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-05-30T04:51:58.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:51:58.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-05-30T04:51:58.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:51:58.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:51:58.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:51:58.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-05-30T04:53:07.027 [ERROR] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] processing LCO all-sky image: HTTPSConnectionPool(host='s3.us-west-2.amazonaws.com', port=443): Read timed out.
2026-05-30T04:53:07.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:53:07.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:53:07.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:53:07.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:53:07.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:53:07.058 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:53:07.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:53:07.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:53:07.059 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:53:07.059 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:53:07.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:53:07.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:53:07.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:53:07.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:53:07.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:53:07.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:53:07.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:53:07.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:53:07.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:53:07.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:53:07.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:53:07.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:53:07.455 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:52:39
2026-05-30T04:53:07.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73789, datetime.datetime(2026, 5, 30, 4, 52, 39), datetime.datetime(2026, 5, 30, 4, 52, 38), 'salt', 10.58, 48.8, None, 16.06, 334.7, 10.32, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:53:07.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:53:07.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:53:07.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:52:38, diff=29.463501s, valid=True
2026-05-30T04:53:07.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:53:07.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:53:07.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:53:12, diff=-4.532959s, valid=True
2026-05-30T04:53:07.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:53:07.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:53:07.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:52:37, diff=30.475308s, valid=True
2026-05-30T04:53:07.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:53:07.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:53:07.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:53:07.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:53:07.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:53:07.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:53:07.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:53:12, diff=-4.520952s, valid=True
2026-05-30T04:53:07.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:53:07.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:53:07.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:53:07.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042229.479884s, valid=True
2026-05-30T04:53:07.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:53:07.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:53:07.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:53:07.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:53:07.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:53:07.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:53:07.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:53:07.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:53:07.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:53:07.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:53:07.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:53:07.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:53:07.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:53:07.799 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:53:08.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:53:08.431 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:53:08.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:53:08.531 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:53:08.531 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:53:08.726 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:53:08.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:53:38.739 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:53:38.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:53:38.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:53:39.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:53:39.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:53:39.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:53: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-05-30T04:53:39.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:53:39.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-05-30T04:53:39.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:53:39.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:53:39.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:53:39.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-05-30T04:53:42.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-05-30T04:53:42.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:53:42.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:53:42.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:53:42.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:53:42.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:53:42.336 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:53:42.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:53:42.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:53:42.337 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:53:42.338 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:53:42.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:53:42.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T04:53:42.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:53:42.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T04:53:42.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:53:42.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:53:42.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:53:42.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T04:53:42.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:53:42.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:53:42.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:53:42.666 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:53:42.727 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:53:39
2026-05-30T04:53:42.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73791, datetime.datetime(2026, 5, 30, 4, 53, 39), datetime.datetime(2026, 5, 30, 4, 53, 39), 'salt', 10.61, 48.6, None, 12.85, 324.39, 10.37, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:53:42.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:53:42.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T04:53:42.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:53:39, diff=3.734538s, valid=True
2026-05-30T04:53:42.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:53:42.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:53:42.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:54:12, diff=-29.262038s, valid=True
2026-05-30T04:53:42.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:53:42.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T04:53:42.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:53:39, diff=3.746069s, valid=True
2026-05-30T04:53:42.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:53:42.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:53:42.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:53:42.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:53:42.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:53:42.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T04:53:42.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:54:12, diff=-29.250315s, valid=True
2026-05-30T04:53:42.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:53:42.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:53:42.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:53:42.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042264.75048s, valid=True
2026-05-30T04:53:42.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:53:42.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:53:42.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:53:42.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:53:42.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:53:42.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:53:42.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:53:42.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:53:42.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:53:42.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:53:42.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:53:42.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:53:43.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:53:43.070 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:53:43.281 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:53:43.624 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:53:43.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:53:43.723 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:53:43.723 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:53:43.928 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:53:43.928 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:54:13.936 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:54:13.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:54:13.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:54:14.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:54:14.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:54:14.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:54:14.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-05-30T04:54:14.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:54:14.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-05-30T04:54:14.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:54:14.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:54:14.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:54:14.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-05-30T04:54:16.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-05-30T04:54:16.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:54:16.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:54:16.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:54:16.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:54:16.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:54:16.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:54:16.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:54:16.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:54:16.966 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:54:16.966 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:54:16.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:54:17.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:54:17.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:54:17.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:54:17.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:54:17.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:54:17.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:54:17.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:54:17.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:54:17.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:54:17.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:54:17.302 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:54:17.361 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:54:10
2026-05-30T04:54:17.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73792, datetime.datetime(2026, 5, 30, 4, 54, 10), datetime.datetime(2026, 5, 30, 4, 54, 9), 'salt', 10.55, 48.9, None, 14.19, 333.73, 10.29, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:54:17.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:54:17.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:54:17.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:54:09, diff=8.369372s, valid=True
2026-05-30T04:54:17.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:54:17.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:54:17.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:54:12, diff=5.372928s, valid=True
2026-05-30T04:54:17.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:54:17.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:54:17.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:54:08, diff=9.381542s, valid=True
2026-05-30T04:54:17.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:54:17.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:54:17.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:54:17.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:54:17.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:54:17.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:54:17.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:54:12, diff=5.385382s, valid=True
2026-05-30T04:54:17.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:54:17.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:54:17.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:54:17.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042299.386233s, valid=True
2026-05-30T04:54:17.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:54:17.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:54:17.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:54:17.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:54:17.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:54:17.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:54:17.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:54:17.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:54:17.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:54:17.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:54:17.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:54:17.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:54:17.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:54:17.780 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:54:17.990 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:54:18.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:54:18.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:54:18.437 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:54:18.437 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:54:18.629 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:54:18.629 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:54:48.659 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:54:48.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:54:48.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:54:48.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:54:48.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:54:49.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:54:49.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-05-30T04:54:49.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:54:49.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-05-30T04:54:49.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:54:49.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:54:49.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:54:49.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-05-30T04:54:51.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T04:54:51.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:54:51.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:54:51.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:54:51.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:54:51.656 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:54:51.657 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:54:51.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:54:51.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:54:51.658 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:54:51.658 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:54:51.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:54:51.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:54:51.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:54:51.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:54:51.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:54:51.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:54:51.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:54:51.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:54:51.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:54:51.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:54:51.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:54:51.969 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:54:52.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:54:40
2026-05-30T04:54:52.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73793, datetime.datetime(2026, 5, 30, 4, 54, 40), datetime.datetime(2026, 5, 30, 4, 54, 40), 'salt', 10.52, 49.07, None, 15.91, 319.56, 10.24, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:54:52.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:54:52.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:54:52.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:54:40, diff=12.042121s, valid=True
2026-05-30T04:54:52.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:54:52.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:54:52.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:55:12, diff=-19.954969s, valid=True
2026-05-30T04:54:52.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:54:52.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:54:52.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:54:38, diff=14.05188s, valid=True
2026-05-30T04:54:52.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:54:52.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:54:52.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:54:52.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:54:52.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:54:52.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:54:52.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:55:12, diff=-19.945055s, valid=True
2026-05-30T04:54:52.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:54:52.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:54:52.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:54:52.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042334.055603s, valid=True
2026-05-30T04:54:52.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:54:52.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:54:52.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:54:52.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:54:52.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:54:52.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:54:52.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:54:52.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:54:52.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:54:52.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:54:52.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:54:52.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:54:52.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:54:52.493 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:54:52.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:54:53.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:54:53.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:54:53.146 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:54:53.146 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:54:53.293 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:54:53.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:55:23.299 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:55:23.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:55:23.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:55:23.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:55:23.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:55:24.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:55:24.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T04:55:24.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:55:24.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-05-30T04:55:24.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:55:24.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:55:24.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:55:24.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-05-30T04:55:28.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-05-30T04:55:28.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:55:28.489 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:55:28.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:55:28.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:55:28.514 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:55:28.515 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:55:28.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:55:28.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:55:28.516 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:55:28.516 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:55:28.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:55:28.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:55:28.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:55:28.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:55:28.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:55:28.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:55:28.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:55:28.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:55:28.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:55:28.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:55:28.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:55:28.841 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:55:28.902 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:55:11
2026-05-30T04:55:28.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73794, datetime.datetime(2026, 5, 30, 4, 55, 11), datetime.datetime(2026, 5, 30, 4, 55, 11), 'salt', 10.45, 49.1, None, 11.68, 328.6, 10.22, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:55:28.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:55:28.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:55:28.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:55:11, diff=17.910456s, valid=True
2026-05-30T04:55:28.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:55:28.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:55:28.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:55:12, diff=16.91398s, valid=True
2026-05-30T04:55:28.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:55:28.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:55:28.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:55:08, diff=20.92233s, valid=True
2026-05-30T04:55:28.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:55:28.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:55:28.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:55:28.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:55:28.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:55:28.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:55:28.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:55:12, diff=16.92608s, valid=True
2026-05-30T04:55:28.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:55:28.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:55:28.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:55:28.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042370.926912s, valid=True
2026-05-30T04:55:28.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:55:28.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:55:28.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:55:28.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:55:28.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:55:28.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:55:28.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:55:28.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:55:29.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:55:29.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:55:29.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:55:29.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:55:29.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:55:29.317 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:55:29.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:55:29.880 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:55:29.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:55:29.992 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:55:29.992 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:55:30.210 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:55:30.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:56:00.240 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:56:00.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:56:00.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:56:00.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:56:00.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:56:00.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:56:00.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-05-30T04:56:00.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:56:00.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-05-30T04:56:00.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:56:00.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:56:00.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:56:00.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-05-30T04:56:04.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-05-30T04:56:04.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:56:04.662 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:56:04.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:56:04.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:56:04.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:56:04.684 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:56:04.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:56:04.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:56:04.685 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:56:04.685 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:56:04.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:56:04.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:56:04.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:56:04.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:56:04.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:56:04.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:56:04.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:56:04.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:56:04.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:56:04.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:56:04.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:56:04.949 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:56:05.009 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:55:41
2026-05-30T04:56:05.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73795, datetime.datetime(2026, 5, 30, 4, 55, 41), datetime.datetime(2026, 5, 30, 4, 55, 41), 'salt', 10.45, 49.17, None, 14.75, 338.48, 10.2, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:56:05.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:56:05.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:56:05.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:55:41, diff=24.016067s, valid=True
2026-05-30T04:56:05.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:56:05.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:56:05.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:56:12, diff=-6.980757s, valid=True
2026-05-30T04:56:05.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:56:05.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:56:05.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:55:38, diff=27.026731s, valid=True
2026-05-30T04:56:05.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:56:05.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:56:05.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:56:05.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:56:05.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:56:05.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:56:05.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:56:12, diff=-6.969867s, valid=True
2026-05-30T04:56:05.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:56:05.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:56:05.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:56:05.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042407.030877s, valid=True
2026-05-30T04:56:05.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:56:05.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:56:05.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:56:05.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:56:05.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:56:05.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:56:05.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:56:05.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:56:05.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:56:05.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:56:05.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:56:05.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:56:05.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:56:05.352 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:56:05.562 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:56:05.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:56:06.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:56:06.003 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:56:06.003 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:56:06.270 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:56:06.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:56:36.300 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:56:36.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:56:36.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:56:36.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:56:36.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:56:37.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:56:37.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-05-30T04:56:37.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:56:37.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-05-30T04:56:37.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:56:37.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:56:37.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:56:37.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T04:56:39.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-05-30T04:56:39.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:56:39.481 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:56:39.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:56:39.491 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:56:39.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:56:39.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:56:39.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:56:39.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:56:39.506 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:56:39.506 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:56:39.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:56:39.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:56:39.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:56:39.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:56:39.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:56:39.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:56:39.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:56:39.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:56:39.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:56:39.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:56:39.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:56:39.827 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:56:39.888 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:56:12
2026-05-30T04:56:39.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73796, datetime.datetime(2026, 5, 30, 4, 56, 12), datetime.datetime(2026, 5, 30, 4, 56, 11), 'salt', 10.45, 49.33, None, 14.5, 323.99, 10.16, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:56:39.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:56:39.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:56:39.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:56:11, diff=28.895415s, valid=True
2026-05-30T04:56:39.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:56:39.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:56:39.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:56:12, diff=27.899349s, valid=True
2026-05-30T04:56:39.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:56:39.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:56:39.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:56:09, diff=30.906361s, valid=True
2026-05-30T04:56:39.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:56:39.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:56:39.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:56:39.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:56:39.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:56:39.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:56:39.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:56:12, diff=27.90953s, valid=True
2026-05-30T04:56:39.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:56:39.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:56:39.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:56:39.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042441.910273s, valid=True
2026-05-30T04:56:39.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:56:39.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:56:39.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:56:39.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:56:39.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:56:39.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:56:39.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:56:39.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:56:40.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:56:40.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:56:40.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:56:40.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:56:40.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:56:40.314 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:56:40.524 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:56:40.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:56:40.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:56:40.966 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:56:40.966 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:56:41.058 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:56:41.059 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:57:11.089 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:57:11.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:57:11.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:57:11.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:57:11.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:57:11.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:57:11.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T04:57:11.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:57:11.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-05-30T04:57:11.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:57:11.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:57:11.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:57:11.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-05-30T04:57:21.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-05-30T04:57:21.339 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:57:21.339 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:57:21.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:57:21.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:57:21.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:57:21.363 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:57:21.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:57:21.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:57:21.364 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:57:21.365 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:57:21.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:57:21.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:57:21.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:57:21.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:57:21.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:57:21.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:57:21.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:57:21.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:57:21.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:57:21.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:57:21.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:57:21.690 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:57:21.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:57:12
2026-05-30T04:57:21.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73798, datetime.datetime(2026, 5, 30, 4, 57, 12), datetime.datetime(2026, 5, 30, 4, 57, 12), 'salt', 10.48, 49.2, None, 16.59, 339.77, 10.2, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:57:21.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:57:21.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:57:21.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:57:12, diff=9.756807s, valid=True
2026-05-30T04:57:21.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:57:21.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:57:21.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:57:12, diff=9.760206s, valid=True
2026-05-30T04:57:21.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:57:21.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:57:21.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:57:09, diff=12.768366s, valid=True
2026-05-30T04:57:21.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:57:21.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:57:21.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:57:21.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:57:21.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:57:21.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:57:21.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:57:12, diff=9.771978s, valid=True
2026-05-30T04:57:21.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:57:21.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:57:21.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:57:21.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042483.772776s, valid=True
2026-05-30T04:57:21.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:57:21.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:57:21.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:57:21.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:57:21.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:57:21.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:57:21.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:57:21.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:57:21.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:57:21.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:57:21.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:57:22.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:57:22.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:57:22.094 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:57:22.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:57:22.644 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:57:22.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:57: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-05-30T04:57: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-05-30T04:57:22.932 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:57:22.932 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:57:52.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:57:52.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:57:52.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:57:53.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:57:53.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:57:53.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:57:53.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-05-30T04:57:53.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:57:53.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-05-30T04:57:53.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:57:53.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:57:53.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:57:53.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-05-30T04:57:56.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T04:57:56.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:57:56.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:57:56.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:57:56.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:57:56.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:57:56.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:57:56.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:57:56.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:57:56.295 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:57:56.295 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:57:56.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:57:56.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:57:56.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:57:56.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:57:56.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:57:56.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:57:56.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:57:56.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:57:56.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:57:56.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:57:56.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:57:56.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:57:56.678 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:57:42
2026-05-30T04:57:56.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73799, datetime.datetime(2026, 5, 30, 4, 57, 42), datetime.datetime(2026, 5, 30, 4, 57, 41), 'salt', 10.52, 48.87, None, 14.12, 341.41, 10.3, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:57:56.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:57:56.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:57:56.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:57:41, diff=15.685789s, valid=True
2026-05-30T04:57:56.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:57:56.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:57:56.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:58:12, diff=-15.310745s, valid=True
2026-05-30T04:57:56.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:57:56.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:57:56.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:57:40, diff=16.697564s, valid=True
2026-05-30T04:57:56.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:57:56.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:57:56.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:57:56.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:57:56.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:57:56.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:57:56.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:58:12, diff=-15.298658s, valid=True
2026-05-30T04:57:56.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:57:56.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:57:56.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:57:56.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042518.702179s, valid=True
2026-05-30T04:57:56.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:57:56.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:57:56.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:57:56.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:57:56.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:57:56.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:57:56.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:57:56.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:57:56.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:57:56.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:57:56.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:57:56.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:57:56.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:57:57.022 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:57:57.234 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:57:57.577 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:57:57.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:57:57.677 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:57:57.677 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:57:57.876 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:57:57.876 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:58:27.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:58:27.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:58:27.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:58:28.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:58:28.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:58:28.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:58:28.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-05-30T04:58:28.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:58:28.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-05-30T04:58:28.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:58:28.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:58:28.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:58:28.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-05-30T04:58:30.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-05-30T04:58:30.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:58:30.956 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:58:30.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:58:30.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:58:30.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:58:30.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:58:30.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:58:30.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:58:30.981 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:58:30.981 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:58:30.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:58:31.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:58:31.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:58:31.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:58:31.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:58:31.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:58:31.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:58:31.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:58:31.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:58:31.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:58:31.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:58:31.299 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:58:31.361 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:58:13
2026-05-30T04:58:31.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73800, datetime.datetime(2026, 5, 30, 4, 58, 13), datetime.datetime(2026, 5, 30, 4, 58, 12), 'salt', 10.61, 48.54, None, 15.67, 348.29, 10.39, 831.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:58:31.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:58:31.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:58:31.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:58:12, diff=19.369131s, valid=True
2026-05-30T04:58:31.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:58:31.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:58:31.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:58:12, diff=19.372651s, valid=True
2026-05-30T04:58:31.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:58:31.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:58:31.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:58:11, diff=20.38088s, valid=True
2026-05-30T04:58:31.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:58:31.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:58:31.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:58:31.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:58:31.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:58:31.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:58:31.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:58:12, diff=19.384813s, valid=True
2026-05-30T04:58:31.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:58:31.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:58:31.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:58:31.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042553.385662s, valid=True
2026-05-30T04:58:31.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:58:31.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:58:31.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:58:31.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:58:31.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:58:31.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:58:31.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:58:31.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:58:31.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:58:31.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:58:31.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:58:31.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:58:31.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:58:31.712 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:58:31.927 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:58:32.286 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:58:32.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:58:32.452 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:58:32.452 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:58:32.718 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:58:32.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:59:02.748 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:59:02.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:59:02.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:59:03.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:59:03.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:59:03.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:59:03.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-05-30T04:59:03.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:59:03.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-05-30T04:59:03.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:59:03.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:59:03.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:59:03.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-05-30T04:59:05.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-05-30T04:59:05.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:59:05.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:59:05.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:59:05.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:59:05.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:59:05.626 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:59:05.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:59:05.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:59:05.627 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:59:05.628 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:59:05.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:59:05.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:59:05.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:59:05.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:59:05.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:59:05.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:59:05.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:59:05.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:59:05.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:59:05.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:59:05.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:59:05.948 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:59:06.009 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:58:43
2026-05-30T04:59:06.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73801, datetime.datetime(2026, 5, 30, 4, 58, 43), datetime.datetime(2026, 5, 30, 4, 58, 42), 'salt', 10.58, 48.34, None, 15.0, 335.4, 10.45, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:59:06.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:59:06.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:59:06.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:58:42, diff=24.016806s, valid=True
2026-05-30T04:59:06.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:59:06.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:59:06.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:59:12, diff=-5.979705s, valid=True
2026-05-30T04:59:06.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:59:06.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:59:06.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:58:40, diff=26.028524s, valid=True
2026-05-30T04:59:06.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:59:06.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:59:06.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:59:06.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:59:06.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:59:06.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:59:06.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:59:12, diff=-5.967724s, valid=True
2026-05-30T04:59:06.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:59:06.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:59:06.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:59:06.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042588.033115s, valid=True
2026-05-30T04:59:06.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:59:06.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:59:06.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:59:06.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:59:06.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:59:06.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:59:06.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:59:06.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:59:06.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:59:06.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:59:06.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:59:06.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:59:06.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:59:06.356 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:59:06.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:59:06.909 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:59:07.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:59:07.008 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:59:07.008 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:59:07.260 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:59:07.260 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T04:59:37.263 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T04:59:37.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T04:59:37.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T04:59:37.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T04:59:37.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T04:59:37.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T04:59:37.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T04:59:37.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T04:59:37.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T04:59:37.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T04:59:37.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T04:59:37.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T04:59:37.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-05-30T04:59:40.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-05-30T04:59:40.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T04:59:40.236 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T04:59:40.236 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T04:59:40.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T04:59:40.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T04:59:40.260 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T04:59:40.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T04:59:40.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T04:59:40.261 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T04:59:40.261 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T04:59:40.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T04:59:40.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T04:59:40.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T04:59:40.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T04:59:40.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:59:40.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:59:40.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T04:59:40.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T04:59:40.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T04:59:40.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T04:59:40.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T04:59:40.606 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T04:59:40.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 04:59:13
2026-05-30T04:59:40.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73802, datetime.datetime(2026, 5, 30, 4, 59, 13), datetime.datetime(2026, 5, 30, 4, 59, 13), 'salt', 10.68, 48.37, None, 15.63, 331.34, 10.45, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T04:59:40.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T04:59:40.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T04:59:40.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:59:13, diff=27.679901s, valid=True
2026-05-30T04:59:40.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T04:59:40.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:59:40.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:59:12, diff=28.68289s, valid=True
2026-05-30T04:59:40.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T04:59:40.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T04:59:40.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:59:12, diff=28.689704s, valid=True
2026-05-30T04:59:40.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T04:59:40.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:59:40.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T04:59:40.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T04:59:40.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T04:59:40.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T04:59:40.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 04:59:12, diff=28.692899s, valid=True
2026-05-30T04:59:40.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T04:59:40.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T04:59:40.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T04:59:40.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042622.693567s, valid=True
2026-05-30T04:59:40.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T04:59:40.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T04:59:40.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T04:59:40.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T04:59:40.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T04:59:40.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T04:59:40.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T04:59:40.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T04:59:40.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T04:59:40.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T04:59:40.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T04:59:40.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T04:59:40.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T04:59:41.017 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T04:59:41.306 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:59:41.651 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T04:59:41.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T04:59:41.752 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T04:59:41.752 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T04:59:41.960 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T04:59:41.960 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:00:11.978 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:00:11.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:00:11.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:00:12.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:00:12.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:00:12.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:00:12.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-05-30T05:00:12.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:00:12.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-05-30T05:00:12.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:00:12.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:00:12.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:00:12.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-05-30T05:00:14.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-05-30T05:00:14.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:00:14.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:00:14.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:00:14.983 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:00:14.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:00:14.997 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:00:14.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:00:14.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:00:14.998 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:00:14.998 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:00:15.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:00:15.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T05:00:15.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:00:15.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T05:00:15.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:00:15.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:00:15.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:00:15.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:00:15.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:00:15.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:00:15.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:00:15.272 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:00:15.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:00:14
2026-05-30T05:00:15.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73804, datetime.datetime(2026, 5, 30, 5, 0, 14), datetime.datetime(2026, 5, 30, 5, 0, 14), 'salt', 10.65, 48.24, None, 17.5, 342.21, 10.48, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:00:15.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:00:15.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T05:00:15.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:00:14, diff=1.3404s, valid=True
2026-05-30T05:00:15.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:00:15.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:00:15.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:00:12, diff=3.3437s, valid=True
2026-05-30T05:00:15.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:00:15.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T05:00:15.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:00:11, diff=4.351371s, valid=True
2026-05-30T05:00:15.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:00:15.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:00:15.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:00:15.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:00:15.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:00:15.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:00:15.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:00:12, diff=3.354859s, valid=True
2026-05-30T05:00:15.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:00:15.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:00:15.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:00:15.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042657.355642s, valid=True
2026-05-30T05:00:15.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:00:15.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:00:15.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:00:15.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:00:15.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:00:15.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:00:15.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:00:15.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:00:15.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:00:15.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:00:15.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:00:15.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:00:15.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:00:15.678 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:00:15.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:00:16.236 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:00:16.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:00:16.337 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:00:16.337 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:00:16.603 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:00:16.604 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:00:46.616 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:00:46.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:00:46.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:00:47.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:00:47.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:00:47.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:00:47.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-05-30T05:00:47.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:00:47.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-05-30T05:00:47.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:00:47.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:00:47.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:00:47.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-05-30T05:00:50.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-05-30T05:00:50.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:00:50.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:00:50.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:00:50.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:00:50.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:00:50.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:00:50.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:00:50.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:00:50.642 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:00:50.642 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:00:50.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:00:50.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:00:50.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:00:50.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:00:50.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:00:50.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:00:50.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:00:50.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:00:50.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:00:50.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:00:50.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:00:50.892 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:00:50.955 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:00:44
2026-05-30T05:00:50.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73805, datetime.datetime(2026, 5, 30, 5, 0, 44), datetime.datetime(2026, 5, 30, 5, 0, 44), 'salt', 10.65, 48.14, None, 13.73, 343.48, 10.51, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:00:50.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:00:50.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:00:50.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:00:44, diff=6.96271s, valid=True
2026-05-30T05:00:50.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:00:50.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:00:50.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:01:12, diff=-21.034086s, valid=True
2026-05-30T05:00:50.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:00:50.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:00:50.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:00:41, diff=9.973278s, valid=True
2026-05-30T05:00:50.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:00:50.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:00:50.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:00:50.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:00:50.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:00:50.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:00:50.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:01:12, diff=-21.02335s, valid=True
2026-05-30T05:00:50.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:00:50.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:00:50.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:00:50.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042692.977369s, valid=True
2026-05-30T05:00:50.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:00:50.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:00:50.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:00:50.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:00:50.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:00:51.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:00:51.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:00:51.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:00:51.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:00:51.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:00:51.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:00:51.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:00:51.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:00:51.367 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:00:51.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:00:51.931 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:00:52.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:00:52.032 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:00:52.032 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:00:52.225 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:00:52.225 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:01:22.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:01:22.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:01:22.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:01:22.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:01:22.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:01:22.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:01:22.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-05-30T05:01:22.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:01:22.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-05-30T05:01:22.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:01:22.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:01:22.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:01:22.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-05-30T05:01:26.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-05-30T05:01:26.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:01:26.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:01:26.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:01:26.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:01:26.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:01:26.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:01:26.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:01:26.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:01:26.106 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:01:26.107 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:01:26.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:01:26.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:01:26.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:01:26.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:01:26.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:01:26.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:01:26.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:01:26.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:01:26.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:01:26.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:01:26.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:01:26.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:01:26.456 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:01:15
2026-05-30T05:01:26.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73806, datetime.datetime(2026, 5, 30, 5, 1, 15), datetime.datetime(2026, 5, 30, 5, 1, 14), 'salt', 10.58, 48.21, None, 15.42, 345.57, 10.48, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:01:26.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:01:26.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:01:26.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:01:14, diff=12.463816s, valid=True
2026-05-30T05:01:26.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:01:26.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:01:26.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:01:12, diff=14.467212s, valid=True
2026-05-30T05:01:26.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:01:26.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:01:26.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:01:11, diff=15.475264s, valid=True
2026-05-30T05:01:26.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:01:26.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:01:26.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:01:26.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:01:26.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:01:26.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:01:26.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:01:12, diff=14.478876s, valid=True
2026-05-30T05:01:26.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:01:26.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:01:26.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:01:26.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042728.479656s, valid=True
2026-05-30T05:01:26.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:01:26.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:01:26.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:01:26.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:01:26.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:01:26.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:01:26.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:01:26.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:01:26.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:01:26.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:01:26.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:01:26.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:01:26.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:01:26.804 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:01:27.018 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:01:27.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:01:27.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:01:27.468 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:01:27.468 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:01:27.730 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:01:27.730 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:01:57.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:01:57.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:01:57.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:01:58.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:01:58.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:01:59.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:01: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-05-30T05:01:59.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:01:59.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-05-30T05:01:59.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:01:59.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:01:59.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:01:59.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-05-30T05:02:01.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-05-30T05:02:01.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:02:01.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:02:01.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:02:01.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:02:01.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:02:01.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:02:01.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:02:01.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:02:01.946 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:02:01.946 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:02:01.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:02:02.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:02:02.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:02:02.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:02:02.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:02:02.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:02:02.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:02:02.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:02:02.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:02:02.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:02:02.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:02:02.282 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:02:02.345 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:01:45
2026-05-30T05:02:02.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73807, datetime.datetime(2026, 5, 30, 5, 1, 45), datetime.datetime(2026, 5, 30, 5, 1, 44), 'salt', 10.65, 48.17, None, 15.81, 328.08, 10.5, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:02:02.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:02:02.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:02:02.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:01:44, diff=18.353005s, valid=True
2026-05-30T05:02:02.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:02:02.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:02:02.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:02:12, diff=-9.643897s, valid=True
2026-05-30T05:02:02.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:02:02.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:02:02.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:01:41, diff=21.363932s, valid=True
2026-05-30T05:02:02.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:02:02.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:02:02.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:02:02.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:02:02.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:02:02.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:02:02.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:02:12, diff=-9.631997s, valid=True
2026-05-30T05:02:02.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:02:02.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:02:02.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:02:02.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042764.368825s, valid=True
2026-05-30T05:02:02.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:02:02.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:02:02.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:02:02.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:02:02.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:02:02.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:02:02.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:02:02.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:02:02.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:02:02.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:02:02.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:02:02.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:02:02.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:02:02.755 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:02:02.964 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:02:03.308 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:02:03.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:02:03.408 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:02:03.408 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:02:03.662 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:02:03.663 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:02:33.664 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:02:33.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:02:33.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:02:33.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:02:33.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:02:34.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:02:34.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-05-30T05:02:34.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:02:34.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-05-30T05:02:34.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:02:34.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:02:34.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:02:34.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-05-30T05:02:39.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-05-30T05:02:39.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:02:39.883 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:02:39.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:02:39.890 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:02:39.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:02:39.903 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:02:39.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:02:39.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:02:39.903 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:02:39.903 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:02:39.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:02:40.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:02:40.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:02:40.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:02:40.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:02:40.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:02:40.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:02:40.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:02:40.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:02:40.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:02:40.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:02:40.175 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:02:40.239 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:02:15
2026-05-30T05:02:40.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73808, datetime.datetime(2026, 5, 30, 5, 2, 15), datetime.datetime(2026, 5, 30, 5, 2, 15), 'salt', 10.71, 48.11, None, 13.13, 341.36, 10.52, 831.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:02:40.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:02:40.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:02:40.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:02:15, diff=25.246545s, valid=True
2026-05-30T05:02:40.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:02:40.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:02:40.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:02:12, diff=28.249738s, valid=True
2026-05-30T05:02:40.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:02:40.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:02:40.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:02:12, diff=28.256972s, valid=True
2026-05-30T05:02:40.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:02:40.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:02:40.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:02:40.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:02:40.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:02:40.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:02:40.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:02:12, diff=28.26016s, valid=True
2026-05-30T05:02:40.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:02:40.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:02:40.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:02:40.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042802.26087s, valid=True
2026-05-30T05:02:40.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:02:40.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:02:40.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:02:40.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:02:40.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:02:40.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:02:40.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:02:40.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:02:40.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:02:40.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:02:40.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:02:40.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:02:40.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:02:40.577 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:02:40.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:02:41.131 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:02:41.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:02:41.232 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:02:41.232 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:02:41.500 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:02:41.500 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:03:11.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:03:11.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:03:11.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:03:12.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:03:12.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:03:12.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:03:12.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-05-30T05:03:12.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:03:12.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-05-30T05:03:12.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:03:12.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:03:12.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:03:12.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-05-30T05:03:15.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-05-30T05:03:15.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:03:15.191 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:03:15.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:03:15.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:03:15.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:03:15.213 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:03:15.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:03:15.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:03:15.214 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:03:15.214 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:03:15.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:03:15.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:03:15.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:03:15.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:03:15.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:03:15.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:03:15.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:03:15.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:03:15.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:03:15.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:03:15.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:03:15.536 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:03:15.598 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:02:45
2026-05-30T05:03:15.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73809, datetime.datetime(2026, 5, 30, 5, 2, 45), datetime.datetime(2026, 5, 30, 5, 2, 45), 'salt', 10.62, 48.14, None, 14.33, 331.25, 10.51, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:03:15.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:03:15.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:03:15.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:02:45, diff=30.605808s, valid=True
2026-05-30T05:03:15.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:03:15.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:03:15.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:03:12, diff=3.608995s, valid=True
2026-05-30T05:03:15.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:03:15.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:03:15.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:02:42, diff=33.616496s, valid=True
2026-05-30T05:03:15.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:03:15.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:03:15.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:03:15.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:03:15.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:03:15.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:03:15.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:03:12, diff=3.619844s, valid=True
2026-05-30T05:03:15.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:03:15.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:03:15.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:03:15.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042837.620576s, valid=True
2026-05-30T05:03:15.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:03:15.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:03:15.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:03:15.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:03:15.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:03:15.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:03:15.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:03:15.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:03:15.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:03:15.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:03:15.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:03:15.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:03:15.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:03:16.002 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:03:16.213 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:03:16.554 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:03:16.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05: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-05-30T05:03:16.656 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:03:16.902 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:03:16.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:03:46.906 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:03:46.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:03:46.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:03:47.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:03:47.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:03:47.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:03:47.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-05-30T05:03:47.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:03:47.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-05-30T05:03:47.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:03:47.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:03:47.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:03:47.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-05-30T05:03:50.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-05-30T05:03:50.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:03:50.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:03:50.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:03:50.131 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:03:50.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:03:50.206 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:03:50.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:03:50.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:03:50.208 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:03:50.208 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:03:50.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:03:50.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:03:50.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:03:50.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:03:50.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:03:50.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:03:50.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:03:50.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:03:50.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:03:50.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:03:50.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:03:50.526 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:03:50.588 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:03:46
2026-05-30T05:03:50.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73811, datetime.datetime(2026, 5, 30, 5, 3, 46), datetime.datetime(2026, 5, 30, 5, 3, 45), 'salt', 10.52, 48.6, None, 15.46, 332.51, 10.37, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:03:50.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:03:50.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:03:50.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:03:45, diff=5.596138s, valid=True
2026-05-30T05:03:50.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:03:50.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:03:50.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:04:12, diff=-21.40035s, valid=True
2026-05-30T05:03:50.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:03:50.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:03:50.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:03:44, diff=6.60798s, valid=True
2026-05-30T05:03:50.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:03:50.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:03:50.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:03:50.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:03:50.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:03:50.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:03:50.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:04:12, diff=-21.388254s, valid=True
2026-05-30T05:03:50.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:03:50.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:03:50.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:03:50.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042872.612554s, valid=True
2026-05-30T05:03:50.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:03:50.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:03:50.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:03:50.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:03:50.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:03:50.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:03:50.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:03:50.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:03:50.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:03:50.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:03:50.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:03:50.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:03:50.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:03:50.932 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:03:51.152 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:03:51.499 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:03:51.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:03:51.599 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:03:51.599 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:03:51.831 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:03:51.831 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:04:21.861 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:04:21.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:04:21.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:04:22.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:04:22.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:04:22.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:04:22.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-05-30T05:04:22.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:04:22.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-05-30T05:04:22.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:04:22.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:04:22.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:04:22.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-05-30T05:04:26.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-05-30T05:04:26.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:04:26.688 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:04:26.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:04:26.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:04:26.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:04:26.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:04:26.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:04:26.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:04:26.713 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:04:26.713 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:04:26.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:04:26.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:04:26.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:04:26.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:04:26.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:04:26.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:04:26.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:04:27.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:04:27.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:04:27.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:04:27.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:04:27.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:04:27.098 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:04:17
2026-05-30T05:04:27.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73812, datetime.datetime(2026, 5, 30, 5, 4, 17), datetime.datetime(2026, 5, 30, 5, 4, 16), 'salt', 10.52, 48.9, None, 14.29, 334.56, 10.29, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:04:27.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:04:27.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:04:27.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:04:16, diff=11.1056s, valid=True
2026-05-30T05:04:27.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:04:27.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:04:27.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:04:12, diff=15.108983s, valid=True
2026-05-30T05:04:27.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:04:27.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:04:27.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:04:15, diff=12.116789s, valid=True
2026-05-30T05:04:27.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:04:27.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:04:27.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:04:27.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:04:27.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:04:27.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:04:27.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:04:12, diff=15.120346s, valid=True
2026-05-30T05:04:27.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:04:27.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:04:27.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:04:27.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042909.121134s, valid=True
2026-05-30T05:04:27.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:04:27.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:04:27.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:04:27.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:04:27.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:04:27.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:04:27.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:04:27.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:04:27.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:04:27.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:04:27.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:04:27.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:04:27.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:04:27.442 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:04:27.655 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:04:28.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:04:28.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:04:28.104 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:04:28.104 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:04:28.361 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:04:28.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:04:58.365 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:04:58.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:04:58.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:04:58.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:04:58.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:04:59.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:04:59.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-05-30T05:04:59.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:04:59.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-05-30T05:04:59.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:04:59.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:04:59.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:04:59.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-05-30T05:05:23.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-05-30T05:05:23.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:05:23.597 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:05:23.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:05:23.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:05:23.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:05:23.623 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:05:23.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:05:23.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:05:23.624 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:05:23.625 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:05:23.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:05:23.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:05:23.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:05:23.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:05:23.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:05:23.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:05:23.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:05:23.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:05:23.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:05:23.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:05:23.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:05:23.955 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:05:24.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:05:17
2026-05-30T05:05:24.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73814, datetime.datetime(2026, 5, 30, 5, 5, 17), datetime.datetime(2026, 5, 30, 5, 5, 17), 'salt', 10.45, 48.57, None, 16.27, 333.15, 10.37, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:05:24.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:05:24.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:05:24.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:05:17, diff=7.022645s, valid=True
2026-05-30T05:05:24.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:05:24.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:05:24.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:05:12, diff=12.026183s, valid=True
2026-05-30T05:05:24.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:05:24.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:05:24.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:05:13, diff=11.034605s, valid=True
2026-05-30T05:05:24.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:05:24.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:05:24.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:05:24.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:05:24.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:05:24.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:05:24.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:05:12, diff=12.038386s, valid=True
2026-05-30T05:05:24.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:05:24.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:05:24.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:05:24.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1042966.039208s, valid=True
2026-05-30T05:05:24.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:05:24.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:05:24.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:05:24.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:05:24.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:05:24.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:05:24.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:05:24.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:05:24.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:05:24.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:05:24.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:05:24.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:05:24.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:05:24.360 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:05:24.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:05:24.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:05:25.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:05:25.069 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:05:25.069 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:05:25.253 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:05:25.254 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:05:55.284 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:05:55.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:05:55.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:05:55.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:05:55.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:05:55.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:05:55.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-05-30T05:05:55.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:05:55.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-05-30T05:05:55.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:05:55.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:05:55.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:05:55.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-05-30T05:05:58.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-05-30T05:05:58.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:05:58.453 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:05:58.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:05:58.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:05:58.483 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:05:58.483 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:05:58.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:05:58.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:05:58.484 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:05:58.484 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:05:58.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:05:58.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:05:58.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:05:58.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:05:58.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:05:58.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:05:58.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:05:58.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:05:58.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:05:58.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:05:58.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:05:58.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:05:58.866 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:05:47
2026-05-30T05:05:58.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73815, datetime.datetime(2026, 5, 30, 5, 5, 47), datetime.datetime(2026, 5, 30, 5, 5, 47), 'salt', 10.52, 48.74, None, 17.29, 326.76, 10.33, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:05:58.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:05:58.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:05:58.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:05:47, diff=11.873637s, valid=True
2026-05-30T05:05:58.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:05:58.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:05:58.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:06:12, diff=-13.122986s, valid=True
2026-05-30T05:05:58.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:05:58.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:05:58.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:05:43, diff=15.885021s, valid=True
2026-05-30T05:05:58.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:05:58.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:05:58.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:05:58.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:05:58.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:05:58.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:05:58.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:06:12, diff=-13.111337s, valid=True
2026-05-30T05:05:58.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:05:58.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:05:58.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:05:58.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043000.889469s, valid=True
2026-05-30T05:05:58.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:05:58.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:05:58.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:05:58.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:05:58.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:05:58.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:05:58.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:05:58.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:05:58.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:05:59.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:05:59.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:05:59.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:05:59.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:05:59.208 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:05:59.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:05:59.756 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:05:59.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:05:59.856 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:05:59.856 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:06:00.036 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:06:00.036 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:06:30.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:06:30.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:06:30.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:06:30.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:06:30.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:06:30.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:06: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-05-30T05:06:30.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:06:30.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-05-30T05:06:30.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:06:30.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:06:30.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:06:30.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-05-30T05:06:33.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-05-30T05:06:33.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:06:33.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:06:33.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:06:33.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:06:34.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:06:34.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:06:34.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:06:34.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:06:34.012 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:06:34.012 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:06:34.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:06:34.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:06:34.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:06:34.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:06:34.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:06:34.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:06:34.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:06:34.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:06:34.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:06:34.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:06:34.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:06:34.338 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:06:34.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:06:18
2026-05-30T05:06:34.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73816, datetime.datetime(2026, 5, 30, 5, 6, 18), datetime.datetime(2026, 5, 30, 5, 6, 17), 'salt', 10.45, 48.47, None, 16.97, 343.26, 10.4, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:06:34.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:06:34.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:06:34.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:06:17, diff=17.406964s, valid=True
2026-05-30T05:06:34.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:06:34.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:06:34.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:06:12, diff=22.410475s, valid=True
2026-05-30T05:06:34.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:06:34.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:06:34.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:06:13, diff=21.419256s, valid=True
2026-05-30T05:06:34.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:06:34.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:06:34.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:06:34.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:06:34.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:06:34.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:06:34.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:06:12, diff=22.423446s, valid=True
2026-05-30T05:06:34.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:06:34.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:06:34.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:06:34.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043036.424328s, valid=True
2026-05-30T05:06:34.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:06:34.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:06:34.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:06:34.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:06:34.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:06:34.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:06:34.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:06:34.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:06:34.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:06:34.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:06:34.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:06:34.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:06:34.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:06:34.763 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:06:35.048 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:06:35.389 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:06:35.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:06:35.490 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:06:35.490 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:06:35.645 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:06:35.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:07:05.675 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:07:05.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:07:05.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:07:05.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:07:05.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:07:06.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:07:06.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-05-30T05:07:06.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:07:06.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-05-30T05:07:06.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:07:06.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:07:06.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:07:06.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-05-30T05:07:08.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-05-30T05:07:08.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:07:08.509 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:07:08.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:07:08.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:07:08.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:07:08.529 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:07:08.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:07:08.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:07:08.530 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:07:08.530 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:07:08.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:07:08.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:07:08.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:07:08.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:07:08.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:07:08.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:07:08.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:07:08.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:07:08.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:07:08.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:07:08.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:07:08.797 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:07:08.859 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:06:48
2026-05-30T05:07:08.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73817, datetime.datetime(2026, 5, 30, 5, 6, 48), datetime.datetime(2026, 5, 30, 5, 6, 47), 'salt', 10.58, 48.47, None, 16.97, 333.55, 10.41, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:07:08.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:07:08.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:07:08.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:06:47, diff=21.866993s, valid=True
2026-05-30T05:07:08.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:07:08.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:07:08.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:07:12, diff=-3.129731s, valid=True
2026-05-30T05:07:08.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:07:08.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:07:08.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:06:43, diff=25.878051s, valid=True
2026-05-30T05:07:08.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:07:08.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:07:08.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:07:08.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:07:08.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:07:08.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:07:08.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:07:12, diff=-3.118441s, valid=True
2026-05-30T05:07:08.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:07:08.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:07:08.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:07:08.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043070.882326s, valid=True
2026-05-30T05:07:08.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:07:08.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:07:08.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:07:08.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:07:08.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:07:08.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:07:08.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:07:08.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:07:08.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:07:09.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:07:09.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:07:09.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:07:09.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:07:09.202 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:07:09.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:07:09.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:07:09.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:07:09.857 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:07:09.857 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:07:10.039 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:07:10.039 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:07:40.069 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:07:40.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:07:40.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:07:40.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:07:40.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:07:40.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:07:40.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-05-30T05:07:40.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:07:40.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-05-30T05:07:40.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:07:40.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:07:40.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:07:40.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-05-30T05:07:43.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-05-30T05:07:43.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:07:43.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:07:43.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:07:43.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:07:43.097 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:07:43.097 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:07:43.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:07:43.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:07:43.098 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:07:43.098 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:07:43.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:07:43.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:07:43.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:07:43.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:07:43.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:07:43.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:07:43.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:07:43.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:07:43.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:07:43.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:07:43.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:07:43.415 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:07:43.478 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:07:18
2026-05-30T05:07:43.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73818, datetime.datetime(2026, 5, 30, 5, 7, 18), datetime.datetime(2026, 5, 30, 5, 7, 18), 'salt', 10.55, 48.41, None, 16.2, 336.32, 10.43, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:07:43.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:07:43.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:07:43.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:07:18, diff=25.48565s, valid=True
2026-05-30T05:07:43.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:07:43.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:07:43.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:07:12, diff=31.489189s, valid=True
2026-05-30T05:07:43.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:07:43.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:07:43.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:07:14, diff=29.497461s, valid=True
2026-05-30T05:07:43.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:07:43.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:07:43.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:07:43.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:07:43.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:07:43.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:07:43.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:07:12, diff=31.501244s, valid=True
2026-05-30T05:07:43.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:07:43.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:07:43.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:07:43.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043105.502078s, valid=True
2026-05-30T05:07:43.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:07:43.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:07:43.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:07:43.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:07:43.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:07:43.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:07:43.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:07:43.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:07:43.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:07:43.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:07:43.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:07:43.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:07:43.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:07:43.897 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:07:44.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:07:44.468 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:07:44.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:07:44.567 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:07:44.567 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:07:44.813 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:07:44.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:08:14.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:08:14.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:08:14.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:08:15.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:08:15.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:08:15.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:08: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-05-30T05:08:15.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:08:15.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-05-30T05:08:15.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:08:15.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:08:15.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:08:15.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-05-30T05:08:17.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-05-30T05:08:17.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:08:17.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:08:17.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:08:17.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:08:17.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:08:17.986 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:08:17.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:08:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:08:17.987 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:08:17.987 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:08:17.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:08:18.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:08:18.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:08:18.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:08:18.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:08:18.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:08:18.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:08:18.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:08:18.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:08:18.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:08:18.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:08:18.257 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:08:18.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:07:48
2026-05-30T05:08:18.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73819, datetime.datetime(2026, 5, 30, 5, 7, 48), datetime.datetime(2026, 5, 30, 5, 7, 48), 'salt', 10.55, 48.24, None, 14.64, 333.08, 10.48, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:08:18.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:08:18.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:08:18.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:07:48, diff=30.325856s, valid=True
2026-05-30T05:08:18.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:08:18.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:08:18.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:08:12, diff=6.329386s, valid=True
2026-05-30T05:08:18.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:08:18.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:08:18.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:07:45, diff=33.336957s, valid=True
2026-05-30T05:08:18.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:08:18.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:08:18.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:08:18.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:08:18.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:08:18.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:08:18.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:08:12, diff=6.340383s, valid=True
2026-05-30T05:08:18.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:08:18.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:08:18.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:08:18.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043140.341141s, valid=True
2026-05-30T05:08:18.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:08:18.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:08:18.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:08:18.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:08:18.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:08:18.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:08:18.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:08:18.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:08:18.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:08:18.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:08:18.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:08:18.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:08:18.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:08:18.661 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:08:18.887 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:08:19.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:08:19.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:08:19.327 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:08:19.327 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:08:19.574 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:08:19.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:08:49.603 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:08:49.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:08:49.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:08:50.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:08:50.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:08:50.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:08:50.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-05-30T05:08:50.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:08:50.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-05-30T05:08:50.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:08:50.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:08:50.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:08:50.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-05-30T05:09:23.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-05-30T05:09:23.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:09:23.438 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:09:23.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:09:23.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:09:23.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:09:23.463 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:09:23.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:09:23.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:09:23.464 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:09:23.464 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:09:23.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:09:23.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T05:09:23.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:09:23.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T05:09:23.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:09:23.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:09:23.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:09:23.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:09:23.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:09:23.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:09:23.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:09:23.776 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:09:23.837 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:09:20
2026-05-30T05:09:23.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73822, datetime.datetime(2026, 5, 30, 5, 9, 20), datetime.datetime(2026, 5, 30, 5, 9, 19), 'salt', 10.61, 48.27, None, 17.33, 324.16, 10.47, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:09:23.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:09:23.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T05:09:23.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:09:19, diff=4.844664s, valid=True
2026-05-30T05:09:23.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:09:23.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:09:23.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:09:12, diff=11.848142s, valid=True
2026-05-30T05:09:23.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:09:23.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T05:09:23.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:09:19, diff=4.856451s, valid=True
2026-05-30T05:09:23.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:09:23.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:09:23.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:09:23.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:09:23.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:09:23.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:09:23.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:09:12, diff=11.860165s, valid=True
2026-05-30T05:09:23.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:09:23.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:09:23.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:09:23.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043205.860985s, valid=True
2026-05-30T05:09:23.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:09:23.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:09:23.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:09:23.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:09:23.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:09:23.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:09:23.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:09:23.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:09:23.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:09:23.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:09:24.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:09:24.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:09:24.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:09:24.248 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:09:24.458 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:09:24.801 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:09:24.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:09:24.901 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:09:24.901 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:09:25.181 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:09:25.181 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:09:55.211 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:09:55.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:09:55.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:09:55.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:09:55.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:09:55.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:09:55.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-05-30T05:09:55.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:09:55.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-05-30T05:09:55.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:09:55.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:09:55.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:09:55.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-05-30T05:09:58.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-05-30T05:09:58.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:09:58.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:09:58.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:09:58.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:09:58.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:09:58.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:09:58.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:09:58.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:09:58.737 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:09:58.737 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:09:58.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:09:58.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:09:58.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:09:58.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:09:58.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:09:59.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:09:59.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:09:59.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:09:59.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:09:59.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:09:59.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:09:59.065 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:09:59.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:09:50
2026-05-30T05:09:59.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73823, datetime.datetime(2026, 5, 30, 5, 9, 50), datetime.datetime(2026, 5, 30, 5, 9, 49), 'salt', 10.58, 48.14, None, 14.57, 340.4, 10.5, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:09:59.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:09:59.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:09:59.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:09:49, diff=10.135852s, valid=True
2026-05-30T05:09:59.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:09:59.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:09:59.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:10:12, diff=-12.860591s, valid=True
2026-05-30T05:09:59.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:09:59.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:09:59.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:09:45, diff=14.147835s, valid=True
2026-05-30T05:09:59.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:09:59.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:09:59.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:09:59.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:09:59.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:09:59.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:09:59.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:10:12, diff=-12.848386s, valid=True
2026-05-30T05:09:59.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:09:59.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:09:59.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:09:59.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043241.15244s, valid=True
2026-05-30T05:09:59.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:09:59.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:09:59.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:09:59.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:09:59.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:09:59.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:09:59.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:09:59.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:09:59.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:09:59.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:09:59.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:09:59.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:09:59.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:09:59.478 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:09:59.688 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:10:00.040 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:10:00.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:10:00.146 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:10:00.146 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:10:00.331 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:10:00.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:10:30.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:10:30.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:10:30.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:10:30.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:10:30.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:10:30.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:10:30.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-05-30T05:10:30.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:10:30.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-05-30T05:10:30.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:10:30.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:10:30.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:10:30.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-05-30T05:10:33.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-05-30T05:10:33.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:10:33.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:10:33.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:10:33.208 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:10:33.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:10:33.221 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:10:33.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:10:33.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:10:33.222 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:10:33.222 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:10:33.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:10:33.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:10:33.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:10:33.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:10:33.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:10:33.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:10:33.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:10:33.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:10:33.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:10:33.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:10:33.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:10:33.546 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:10:33.609 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:10:20
2026-05-30T05:10:33.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73824, datetime.datetime(2026, 5, 30, 5, 10, 20), datetime.datetime(2026, 5, 30, 5, 10, 20), 'salt', 10.61, 48.01, None, 16.02, 332.82, 10.54, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:10:33.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:10:33.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:10:33.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:10:20, diff=13.617226s, valid=True
2026-05-30T05:10:33.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:10:33.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:10:33.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:10:12, diff=21.620772s, valid=True
2026-05-30T05:10:33.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:10:33.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:10:33.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:10:15, diff=18.629098s, valid=True
2026-05-30T05:10:33.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:10:33.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:10:33.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:10:33.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:10:33.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:10:33.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:10:33.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:10:12, diff=21.632885s, valid=True
2026-05-30T05:10:33.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:10:33.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:10:33.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:10:33.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043275.633731s, valid=True
2026-05-30T05:10:33.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:10:33.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:10:33.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:10:33.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:10:33.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:10:33.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:10:33.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:10:33.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:10:33.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:10:33.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:10:33.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:10:33.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:10:33.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:10:34.018 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:10:34.229 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:10:34.570 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:10:34.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:10:34.671 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:10:34.671 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:10:34.920 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:10:34.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:11:04.951 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:11:04.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:11:04.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:11:05.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:11:05.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:11:05.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:11:05.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-05-30T05:11:05.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:11:05.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T05:11:05.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:11:05.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:11:05.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:11:05.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-05-30T05:11:07.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-05-30T05:11:07.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:11:07.911 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:11:07.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:11:07.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:11:07.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:11:07.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:11:07.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:11:07.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:11:07.937 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:11:07.938 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:11:07.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:11:08.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:11:08.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:11:08.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:11:08.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:11:08.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:11:08.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:11:08.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:11:08.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:11:08.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:11:08.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:11:08.273 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:11:08.340 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:10:50
2026-05-30T05:11:08.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73825, datetime.datetime(2026, 5, 30, 5, 10, 50), datetime.datetime(2026, 5, 30, 5, 10, 50), 'salt', 10.65, 48.11, None, 15.35, 338.66, 10.52, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:11:08.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:11:08.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:11:08.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:10:50, diff=18.348038s, valid=True
2026-05-30T05:11:08.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:11:08.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:11:08.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:11:12, diff=-3.648304s, valid=True
2026-05-30T05:11:08.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:11:08.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:11:08.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:10:45, diff=23.360441s, valid=True
2026-05-30T05:11:08.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:11:08.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:11:08.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:11:08.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:11:08.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:11:08.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:11:08.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:11:12, diff=-3.635654s, valid=True
2026-05-30T05:11:08.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:11:08.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:11:08.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:11:08.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043310.365201s, valid=True
2026-05-30T05:11:08.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:11:08.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:11:08.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:11:08.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:11:08.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:11:08.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:11:08.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:11:08.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:11:08.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:11:08.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:11:08.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:11:08.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:11:08.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:11:08.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:11:08.899 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:11:09.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:11:09.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:11:09.341 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:11:09.341 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:11:09.593 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:11:09.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:11:39.624 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:11:39.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:11:39.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:11:39.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:11:39.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:11:40.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:11:40.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-05-30T05:11:40.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:11:40.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-05-30T05:11:40.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:11:40.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:11:40.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:11:40.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-05-30T05:11:43.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-05-30T05:11:43.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:11:43.174 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:11:43.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:11:43.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:11:43.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:11:43.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:11:43.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:11:43.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:11:43.201 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:11:43.201 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:11:43.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:11:43.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:11:43.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:11:43.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:11:43.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:11:43.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:11:43.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:11:43.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:11:43.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:11:43.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:11:43.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:11:43.526 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:11:43.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:11:21
2026-05-30T05:11:43.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73826, datetime.datetime(2026, 5, 30, 5, 11, 21), datetime.datetime(2026, 5, 30, 5, 11, 20), 'salt', 10.61, 48.11, None, 12.07, 312.49, 10.51, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:11:43.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:11:43.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:11:43.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:11:20, diff=23.596659s, valid=True
2026-05-30T05:11:43.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:11:43.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:11:43.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:11:12, diff=31.60017s, valid=True
2026-05-30T05:11:43.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:11:43.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:11:43.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:11:15, diff=28.608433s, valid=True
2026-05-30T05:11:43.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:11:43.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:11:43.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:11:43.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:11:43.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:11:43.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:11:43.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:11:12, diff=31.612162s, valid=True
2026-05-30T05:11:43.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:11:43.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:11:43.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:11:43.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043345.612985s, valid=True
2026-05-30T05:11:43.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:11:43.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:11:43.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:11:43.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:11:43.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:11:43.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:11:43.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:11:43.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:11:43.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:11:43.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:11:43.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:11:43.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:11:43.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:11:43.938 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:11:44.150 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:11:44.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:11:44.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:11:44.599 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:11:44.599 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:11:44.850 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:11:44.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:12:14.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:12:14.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:12:14.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:12:15.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:12:15.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:12:15.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:12:15.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-05-30T05:12:15.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:12:15.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-05-30T05:12:15.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:12:15.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:12:15.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:12:15.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-05-30T05:12:49.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-05-30T05:12:49.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:12:49.594 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:12:49.595 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:12:49.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:12:49.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:12:49.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:12:49.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:12:49.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:12:49.618 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:12:49.618 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:12:49.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:12:49.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:12:49.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:12:49.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:12:49.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:12:49.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:12:49.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:12:49.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:12:49.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:12:49.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:12:49.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:12:49.947 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:12:50.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:12:21
2026-05-30T05:12:50.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73828, datetime.datetime(2026, 5, 30, 5, 12, 21), datetime.datetime(2026, 5, 30, 5, 12, 21), 'salt', 10.38, 47.58, None, 17.86, 332.02, 10.65, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:12:50.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:12:50.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:12:50.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:12:21, diff=29.013813s, valid=True
2026-05-30T05:12:50.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:12:50.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:12:50.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:12:12, diff=38.016814s, valid=True
2026-05-30T05:12:50.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:12:50.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:12:50.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:12:17, diff=33.023905s, valid=True
2026-05-30T05:12:50.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:12:50.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:12:50.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:12:50.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:12:50.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:12:50.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:12:50.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:12:12, diff=38.027369s, valid=True
2026-05-30T05:12:50.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:12:50.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:12:50.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:12:50.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043412.0281s, valid=True
2026-05-30T05:12:50.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:12:50.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:12:50.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:12:50.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:12:50.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:12:50.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:12:50.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:12:50.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:12:50.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:12:50.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:12:50.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:12:50.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:12:50.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:12:50.467 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:12:50.678 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:12:51.084 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:12:51.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:12:51.189 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:12:51.189 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:12:51.451 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:12:51.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:13:21.482 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:13:21.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:13:21.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:13:21.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:13:21.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:13:22.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:13:22.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-05-30T05:13:22.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:13:22.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-05-30T05:13:22.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:13:22.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:13:22.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:13:22.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-05-30T05:13:24.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-05-30T05:13:24.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:13:24.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:13:24.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:13:24.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:13:24.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:13:24.961 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:13:24.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:13:24.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:13:24.962 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:13:24.962 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:13:24.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:13:25.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T05:13:25.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:13:25.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T05:13:25.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:13:25.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:13:25.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:13:25.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:13:25.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:13:25.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:13:25.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:13:25.273 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:13:25.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:13:22
2026-05-30T05:13:25.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73830, datetime.datetime(2026, 5, 30, 5, 13, 22), datetime.datetime(2026, 5, 30, 5, 13, 21), 'salt', 10.68, 47.18, None, 15.95, 334.61, 10.79, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:13:25.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:13:25.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T05:13:25.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:13:21, diff=4.340749s, valid=True
2026-05-30T05:13:25.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:13:25.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:13:25.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:13:12, diff=13.34424s, valid=True
2026-05-30T05:13:25.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:13:25.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T05:13:25.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:13:20, diff=5.352443s, valid=True
2026-05-30T05:13:25.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:13:25.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:13:25.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:13:25.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:13:25.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:13:25.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:13:25.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:13:12, diff=13.356141s, valid=True
2026-05-30T05:13:25.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:13:25.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:13:25.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:13:25.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043447.356957s, valid=True
2026-05-30T05:13:25.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:13:25.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:13:25.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:13:25.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:13:25.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:13:25.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:13:25.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:13:25.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:13:25.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:13:25.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:13:25.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:13:25.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:13:25.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:13:25.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:13:25.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:13:26.225 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:13:26.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:13:26.325 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:13:26.325 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:13:26.567 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:13:26.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:13:56.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:13:56.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:13:56.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:13:56.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:13:56.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:13:57.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:13:57.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-05-30T05:13:57.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:13:57.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-05-30T05:13:57.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:13:57.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:13:57.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:13:57.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T05:13:59.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-05-30T05:13:59.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:13:59.463 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:13:59.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:13:59.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:13:59.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:13:59.489 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:13:59.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:13:59.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:13:59.490 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:13:59.490 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:13:59.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:13:59.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:13:59.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:13:59.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:13:59.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:13:59.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:13:59.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:13:59.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:13:59.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:13:59.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:13:59.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:13:59.797 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:13:59.857 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:13:52
2026-05-30T05:13:59.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73831, datetime.datetime(2026, 5, 30, 5, 13, 52), datetime.datetime(2026, 5, 30, 5, 13, 51), 'salt', 10.85, 47.01, None, 15.07, 330.15, 10.86, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:13:59.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:13:59.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:13:59.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:13:51, diff=8.864395s, valid=True
2026-05-30T05:13:59.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:13:59.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:13:59.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:14:12, diff=-12.132451s, valid=True
2026-05-30T05:13:59.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:13:59.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:13:59.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:13:51, diff=8.875052s, valid=True
2026-05-30T05:13:59.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:13:59.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:13:59.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:13:59.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:13:59.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:13:59.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:13:59.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:14:12, diff=-12.121755s, valid=True
2026-05-30T05:13:59.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:13:59.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:13:59.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:13:59.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043481.878943s, valid=True
2026-05-30T05:13:59.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:13:59.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:13:59.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:13:59.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:13:59.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:13:59.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:13:59.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:13:59.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:13:59.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:14:00.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:14:00.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:14:00.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:14:00.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:14:00.240 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:14:00.533 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:14:00.877 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:14:00.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:14:00.990 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:14:00.990 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:14:01.100 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:14:01.100 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:14:31.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:14:31.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:14:31.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:14:31.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:14:31.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:14:31.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:14:31.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-05-30T05:14:31.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:14:31.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-05-30T05:14:31.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:14:31.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:14:31.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:14:31.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-05-30T05:15:21.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-05-30T05:15:21.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:15:21.471 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:15:21.471 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:15:21.483 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:15:21.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:15:21.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:15:21.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:15:21.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:15:21.498 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:15:21.498 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:15:21.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:15:21.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:15:21.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:15:21.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:15:21.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:15:21.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:15:21.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:15:21.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:15:21.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:15:21.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:15:21.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:15:21.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:15:21.899 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:14:53
2026-05-30T05:15:21.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73833, datetime.datetime(2026, 5, 30, 5, 14, 53), datetime.datetime(2026, 5, 30, 5, 14, 52), 'salt', 10.85, 47.05, None, 17.08, 331.86, 10.85, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:15:21.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:15:21.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:15:21.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:14:52, diff=29.907455s, valid=True
2026-05-30T05:15:21.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:15:21.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:15:21.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:15:12, diff=9.911037s, valid=True
2026-05-30T05:15:21.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:15:21.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:15:21.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:14:47, diff=34.919528s, valid=True
2026-05-30T05:15:21.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:15:21.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:15:21.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:15:21.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:15:21.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:15:21.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:15:21.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:15:12, diff=9.923327s, valid=True
2026-05-30T05:15:21.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:15:21.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:15:21.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:15:21.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043563.924182s, valid=True
2026-05-30T05:15:21.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:15:21.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:15:21.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:15:21.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:15:21.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:15:21.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:15:21.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:15:21.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:15:22.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:15:22.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:15:22.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:15:22.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:15:22.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:15:22.245 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:15:22.454 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:15:22.796 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:15:22.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:15:22.896 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:15:22.896 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:15:24.447 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:15:24.767 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:15:54.767 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:15:54.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:15:54.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:15:55.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:15:55.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:15:55.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:15:55.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-05-30T05:15:55.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:15:55.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-05-30T05:15:55.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:15:55.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:15:55.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:15:55.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-05-30T05:15: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-05-30T05:15:57.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:15:57.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:15:57.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:15:57.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:15:57.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:15:57.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:15:57.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:15:57.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:15:57.737 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:15:57.737 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:15:57.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:15:57.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T05:15:57.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:15:57.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T05:15:57.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:15:58.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:15:58.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:15:58.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:15:58.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:15:58.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:15:58.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:15:58.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:15:58.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:15:53
2026-05-30T05:15:58.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73835, datetime.datetime(2026, 5, 30, 5, 15, 53), datetime.datetime(2026, 5, 30, 5, 15, 53), 'salt', 10.81, 47.08, None, 13.83, 331.86, 10.83, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:15:58.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:15:58.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T05:15:58.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:15:53, diff=5.126578s, valid=True
2026-05-30T05:15:58.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:15:58.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:15:58.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:16:12, diff=-13.869858s, valid=True
2026-05-30T05:15:58.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:15:58.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T05:15:58.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:15:47, diff=11.138524s, valid=True
2026-05-30T05:15:58.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:15:58.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:15:58.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:15:58.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:15:58.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:15:58.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:15:58.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:16:12, diff=-13.857719s, valid=True
2026-05-30T05:15:58.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:15:58.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:15:58.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:15:58.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043600.143108s, valid=True
2026-05-30T05:15:58.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:15:58.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:15:58.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:15:58.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:15:58.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:15:58.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:15:58.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:15:58.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:15:58.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:15:58.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:15:58.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:15:58.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:15:58.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:15:58.534 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:15:58.743 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:15:59.084 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:15:59.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:15:59.184 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:15:59.184 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:15:59.375 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:15:59.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:16:29.404 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:16:29.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:16:29.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:16:29.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:16:29.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:16:30.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:16:30.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-05-30T05:16:30.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:16:30.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-05-30T05:16:30.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:16:30.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:16:30.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:16:30.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-05-30T05:16: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-05-30T05:16:51.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:16:51.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:16:51.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:16:51.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:16:51.039 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:16:51.039 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:16:51.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:16:51.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:16:51.041 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:16:51.041 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:16:51.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:16:51.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:16:51.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:16:51.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:16:51.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:16:51.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:16:51.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:16:51.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:16:51.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:16:51.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:16:51.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:16:51.367 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:16:51.428 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:16:23
2026-05-30T05:16:51.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73836, datetime.datetime(2026, 5, 30, 5, 16, 23), datetime.datetime(2026, 5, 30, 5, 16, 23), 'salt', 10.75, 46.61, None, 13.73, 334.56, 10.96, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:16:51.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:16:51.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:16:51.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:16:23, diff=28.435967s, valid=True
2026-05-30T05:16:51.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:16:51.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:16:51.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:16:12, diff=39.43967s, valid=True
2026-05-30T05:16:51.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:16:51.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:16:51.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:16:18, diff=33.448306s, valid=True
2026-05-30T05:16:51.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:16:51.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:16:51.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:16:51.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:16:51.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:16:51.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:16:51.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:16:12, diff=39.452196s, valid=True
2026-05-30T05:16:51.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:16:51.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:16:51.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:16:51.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043653.453046s, valid=True
2026-05-30T05:16:51.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:16:51.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:16:51.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:16:51.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:16:51.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:16:51.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:16:51.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:16:51.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:16:51.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:16:51.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:16:51.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:16:51.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:16:51.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:16:51.778 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:16:51.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:16:52.332 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:16:52.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:16:52.432 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:16:52.432 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:16:52.693 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:16:52.693 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:17:22.695 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:17:22.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:17:22.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:17:23.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:17:23.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:17:23.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:17:23.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-05-30T05:17:23.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:17:23.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-05-30T05:17:23.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:17:23.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:17:23.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:17:23.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-05-30T05:17:27.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-05-30T05:17:27.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:17:27.186 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:17:27.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:17:27.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:17:27.209 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:17:27.210 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:17:27.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:17:27.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:17:27.211 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:17:27.211 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:17:27.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:17:27.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T05:17:27.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:17:27.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T05:17:27.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:17:27.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:17:27.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:17:27.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:17:27.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:17:27.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:17:27.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:17:27.541 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:17:27.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:17:24
2026-05-30T05:17:27.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73838, datetime.datetime(2026, 5, 30, 5, 17, 24), datetime.datetime(2026, 5, 30, 5, 17, 23), 'salt', 10.91, 46.58, None, 15.39, 327.68, 10.98, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:17:27.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:17:27.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T05:17:27.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:17:23, diff=4.609818s, valid=True
2026-05-30T05:17:27.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:17:27.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:17:27.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:17:12, diff=15.613324s, valid=True
2026-05-30T05:17:27.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:17:27.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T05:17:27.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:17:21, diff=6.621546s, valid=True
2026-05-30T05:17:27.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:17:27.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:17:27.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:17:27.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:17:27.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:17:27.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:17:27.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:17:12, diff=15.625284s, valid=True
2026-05-30T05:17:27.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:17:27.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:17:27.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:17:27.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043689.626102s, valid=True
2026-05-30T05:17:27.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:17:27.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:17:27.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:17:27.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:17:27.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:17:27.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:17:27.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:17:27.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:17:27.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:17:27.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:17:27.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:17:27.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:17:28.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:17:28.044 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:17:28.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:17:28.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:17:28.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:17:28.698 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:17:28.698 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:17:28.974 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:17:28.975 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:17:58.997 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:17:58.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:17:58.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:17:59.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:17:59.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:17:59.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:17:59.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-05-30T05:17:59.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:17: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-05-30T05:17:59.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:17:59.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:17:59.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:17:59.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-05-30T05:18:01.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-05-30T05:18:01.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:18:01.842 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:18:01.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:18:01.853 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:18:01.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:18:01.867 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:18:01.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:18:01.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:18:01.868 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:18:01.868 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:18:01.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:18:02.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:18:02.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:18:02.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:18:02.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:18:02.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:18:02.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:18:02.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:18:02.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:18:02.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:18:02.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:18:02.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:18:02.241 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:17:54
2026-05-30T05:18:02.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73839, datetime.datetime(2026, 5, 30, 5, 17, 54), datetime.datetime(2026, 5, 30, 5, 17, 54), 'salt', 10.95, 46.38, None, 15.63, 337.66, 11.05, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:18:02.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:18:02.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:18:02.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:17:54, diff=8.248263s, valid=True
2026-05-30T05:18:02.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:18:02.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:18:02.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:18:12, diff=-9.74875s, valid=True
2026-05-30T05:18:02.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:18:02.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:18:02.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:17:52, diff=10.258464s, valid=True
2026-05-30T05:18:02.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:18:02.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:18:02.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:18:02.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:18:02.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:18:02.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:18:02.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:18:12, diff=-9.738344s, valid=True
2026-05-30T05:18:02.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:18:02.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:18:02.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:18:02.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043724.262355s, valid=True
2026-05-30T05:18:02.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:18:02.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:18:02.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:18:02.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:18:02.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:18:02.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:18:02.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:18:02.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:18:02.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:18:02.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:18:02.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:18:02.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:18:02.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:18:02.581 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:18:02.815 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:18:03.161 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:18:03.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:18:03.262 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:18:03.262 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:18:03.532 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:18:03.532 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:18:33.533 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:18:33.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:18:33.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:18:33.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:18:33.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:18:34.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:18:34.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-05-30T05:18:34.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:18:34.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-05-30T05:18:34.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:18:34.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:18:34.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:18:34.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-05-30T05:19:09.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-05-30T05:19:09.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:19:09.802 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:19:09.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:19:09.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:19:09.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:19:09.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:19:09.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:19:09.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:19:09.823 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:19:09.823 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:19:09.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:19:09.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:19:09.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:19:09.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:19:09.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:19:10.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:19:10.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:19:10.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:19:10.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:19:10.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:19:10.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:19:10.084 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:19:10.145 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:18:55
2026-05-30T05:19:10.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73841, datetime.datetime(2026, 5, 30, 5, 18, 55), datetime.datetime(2026, 5, 30, 5, 18, 54), 'salt', 10.88, 45.75, None, 14.57, 333.36, 11.23, 831.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:19:10.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:19:10.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:19:10.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:18:54, diff=16.152154s, valid=True
2026-05-30T05:19:10.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:19:10.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:19:10.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:19:12, diff=-1.844656s, valid=True
2026-05-30T05:19:10.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:19:10.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:19:10.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:18:49, diff=21.162933s, valid=True
2026-05-30T05:19:10.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:19:10.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:19:10.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:19:10.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:19:10.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:19:10.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:19:10.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:19:12, diff=-1.833668s, valid=True
2026-05-30T05:19:10.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:19:10.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:19:10.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:19:10.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043792.167103s, valid=True
2026-05-30T05:19:10.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:19:10.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:19:10.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:19:10.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:19:10.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:19:10.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:19:10.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:19:10.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:19:10.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:19:10.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:19:10.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:19:10.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:19:10.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:19:10.560 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:19:10.768 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:19:11.108 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:19:11.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:19:11.208 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:19:11.208 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:19:11.499 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:19:11.499 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:19:41.510 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:19:41.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:19:41.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:19:41.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:19:41.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:19:42.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:19:42.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-05-30T05:19:42.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:19:42.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-05-30T05:19:42.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:19:42.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:19:42.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:19:42.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T05:19:44.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-05-30T05:19:44.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:19:44.536 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:19:44.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:19:44.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:19:44.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:19:44.561 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:19:44.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:19:44.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:19:44.562 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:19:44.562 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:19:44.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:19:44.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:19:44.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:19:44.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:19:44.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:19:44.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:19:44.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:19:44.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:19:44.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:19:44.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:19:44.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:19:44.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:19:44.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:19:25
2026-05-30T05:19:44.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73842, datetime.datetime(2026, 5, 30, 5, 19, 25), datetime.datetime(2026, 5, 30, 5, 19, 24), 'salt', 11.01, 46.08, None, 11.72, 334.02, 11.14, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:19:44.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:19:44.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:19:45.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:19:24, diff=21.00266s, valid=True
2026-05-30T05:19:45.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:19:45.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:19:45.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:19:12, diff=33.006165s, valid=True
2026-05-30T05:19:45.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:19:45.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:19:45.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:19:19, diff=26.014431s, valid=True
2026-05-30T05:19:45.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:19:45.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:19:45.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:19:45.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:19:45.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:19:45.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:19:45.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:19:12, diff=33.018239s, valid=True
2026-05-30T05:19:45.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:19:45.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:19:45.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:19:45.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043827.01908s, valid=True
2026-05-30T05:19:45.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:19:45.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:19:45.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:19:45.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:19:45.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:19:45.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:19:45.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:19:45.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:19:45.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:19:45.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:19:45.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:19:45.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:19:45.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:19:45.341 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:19:45.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:19:45.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:19:45.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:19:45.988 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:19:45.989 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:19:46.147 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:19:46.148 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:20:16.151 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:20:16.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:20:16.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:20:16.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:20:16.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:20:16.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:20:16.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T05:20:16.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:20:16.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-05-30T05:20:16.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:20:16.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:20:16.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:20:16.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T05:20:19.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-05-30T05:20:19.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:20:19.175 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:20:19.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:20:19.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:20:19.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:20:19.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:20:19.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:20:19.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:20:19.201 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:20:19.201 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:20:19.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:20:19.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:20:19.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:20:19.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:20:19.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:20:19.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:20:19.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:20:19.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:20:19.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:20:19.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:20:19.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:20:19.533 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:20:19.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:19:55
2026-05-30T05:20:19.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73843, datetime.datetime(2026, 5, 30, 5, 19, 55), datetime.datetime(2026, 5, 30, 5, 19, 55), 'salt', 10.91, 45.98, None, 10.59, 326.51, 11.16, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:20:19.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:20:19.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:20:19.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:19:55, diff=24.602721s, valid=True
2026-05-30T05:20:19.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:20:19.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:20:19.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:20:12, diff=7.606203s, valid=True
2026-05-30T05:20:19.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:20:19.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:20:19.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:19:49, diff=30.614315s, valid=True
2026-05-30T05:20:19.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:20:19.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:20:19.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:20:19.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:20:19.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:20:19.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:20:19.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:20:12, diff=7.618035s, valid=True
2026-05-30T05:20:19.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:20:19.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:20:19.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:20:19.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043861.618853s, valid=True
2026-05-30T05:20:19.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:20:19.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:20:19.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:20:19.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:20:19.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:20:19.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:20:19.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:20:19.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:20:19.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:20:19.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:20:19.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:20:19.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:20:19.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:20:19.946 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:20:20.170 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:20:20.510 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:20:20.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:20:20.610 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:20:20.610 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:20:20.877 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:20:20.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:20:50.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:20:50.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:20:50.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:20:51.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:20:51.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:20:51.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:20:51.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-05-30T05:20:51.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:20:51.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-05-30T05:20:51.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:20:51.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:20:51.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:20:51.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-05-30T05:20:54.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-05-30T05:20:54.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:20:54.168 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:20:54.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:20:54.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:20:54.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:20:54.193 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:20:54.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:20:54.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:20:54.194 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:20:54.195 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:20:54.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:20:54.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:20:54.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:20:54.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:20:54.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:20:54.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:20:54.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:20:54.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:20:54.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:20:54.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:20:54.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:20:54.513 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:20:54.575 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:20:25
2026-05-30T05:20:54.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73844, datetime.datetime(2026, 5, 30, 5, 20, 25), datetime.datetime(2026, 5, 30, 5, 20, 25), 'salt', 10.98, 46.22, None, 16.44, 327.33, 11.1, 831.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:20:54.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:20:54.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:20:54.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:20:25, diff=29.582788s, valid=True
2026-05-30T05:20:54.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:20:54.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:20:54.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:20:12, diff=42.586269s, valid=True
2026-05-30T05:20:54.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:20:54.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:20:54.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:20:19, diff=35.594391s, valid=True
2026-05-30T05:20:54.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:20:54.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:20:54.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:20:54.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:20:54.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:20:54.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:20:54.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:20:12, diff=42.598144s, valid=True
2026-05-30T05:20:54.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:20:54.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:20:54.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:20:54.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043896.599022s, valid=True
2026-05-30T05:20:54.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:20:54.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:20:54.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:20:54.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:20:54.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:20:54.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:20:54.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:20:54.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:20:54.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:20:54.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:20:54.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:20:54.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:20:54.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:20:54.921 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:20:55.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:20:55.469 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:20:55.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:20:55.630 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:20:55.630 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:20:58.146 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:20:58.146 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:21:28.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:21:28.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:21:28.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:21:28.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:21:28.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:21:28.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:21:28.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T05:21:28.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:21:28.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-05-30T05:21:28.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:21:28.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:21:28.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:21:28.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-05-30T05:22:02.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-05-30T05:22:02.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:22:02.726 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:22:02.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:22:02.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:22:02.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:22:02.750 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:22:02.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:22:02.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:22:02.751 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:22:02.751 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:22:02.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:22:02.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:22:02.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:22:02.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:22:02.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:22:03.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:22:03.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:22:03.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:22:03.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:22:03.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:22:03.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:22:03.080 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:22:03.142 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:21:56
2026-05-30T05:22:03.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73847, datetime.datetime(2026, 5, 30, 5, 21, 56), datetime.datetime(2026, 5, 30, 5, 21, 56), 'salt', 10.91, 46.05, None, 13.48, 328.85, 11.14, 831.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:22:03.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:22:03.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:22:03.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:21:56, diff=7.149964s, valid=True
2026-05-30T05:22:03.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:22:03.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:22:03.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:22:12, diff=-8.846508s, valid=True
2026-05-30T05:22:03.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:22:03.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:22:03.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:21:53, diff=10.161655s, valid=True
2026-05-30T05:22:03.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:22:03.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:22:03.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:22:03.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:22:03.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:22:03.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:22:03.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:22:12, diff=-8.834582s, valid=True
2026-05-30T05:22:03.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:22:03.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:22:03.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:22:03.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1043965.166244s, valid=True
2026-05-30T05:22:03.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:22:03.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:22:03.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:22:03.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:22:03.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:22:03.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:22:03.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:22:03.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:22:03.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:22:03.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:22:03.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:22:03.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:22:03.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:22:03.485 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:22:03.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:22:04.035 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:22:04.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:22:04.135 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:22:04.135 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:22:04.395 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:22:04.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:22:34.398 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:22:34.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:22:34.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:22:34.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:22:34.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:22:34.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:22:34.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-05-30T05:22:34.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:22:34.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-05-30T05:22:34.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:22:34.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:22:34.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:22:34.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-05-30T05:22:37.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-05-30T05:22:37.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:22:37.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:22:37.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:22:37.675 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:22:37.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:22:37.688 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:22:37.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:22:37.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:22:37.689 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:22:37.689 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:22:37.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:22:37.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:22:37.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:22:37.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:22:37.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:22:37.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:22:37.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:22:38.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:22:38.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:22:38.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:22:38.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:22:38.008 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:22:38.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:22:26
2026-05-30T05:22:38.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73848, datetime.datetime(2026, 5, 30, 5, 22, 26), datetime.datetime(2026, 5, 30, 5, 22, 26), 'salt', 10.88, 46.18, None, 14.01, 330.57, 11.1, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:22:38.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:22:38.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:22:38.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:22:26, diff=12.077666s, valid=True
2026-05-30T05:22:38.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:22:38.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:22:38.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:22:12, diff=26.08123s, valid=True
2026-05-30T05:22:38.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:22:38.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:22:38.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:22:25, diff=13.089662s, valid=True
2026-05-30T05:22:38.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:22:38.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:22:38.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:22:38.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:22:38.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:22:38.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:22:38.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:22:12, diff=26.0934s, valid=True
2026-05-30T05:22:38.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:22:38.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:22:38.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:22:38.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044000.094239s, valid=True
2026-05-30T05:22:38.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:22:38.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:22:38.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:22:38.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:22:38.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:22:38.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:22:38.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:22:38.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:22:38.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:22:38.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:22:38.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:22:38.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:22:38.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:22:38.415 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:22:38.697 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:22:39.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:22:39.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:22:39.140 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:22:39.140 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:22:39.405 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:22:39.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:23:09.436 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:23:09.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:23:09.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:23:09.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:23:09.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:23:09.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:23:09.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-05-30T05:23:09.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:23:09.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-05-30T05:23:09.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:23:09.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:23:09.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:23:09.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-05-30T05:23: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-05-30T05:23:12.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:23:12.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:23:12.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:23:12.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:23:12.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:23:12.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:23:12.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:23:12.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:23:12.316 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:23:12.316 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:23:12.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:23:12.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:23:12.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:23:12.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:23:12.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:23:12.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:23:12.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:23:12.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:23:12.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:23:12.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:23:12.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:23:12.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:23:12.699 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:22:57
2026-05-30T05:23:12.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73849, datetime.datetime(2026, 5, 30, 5, 22, 57), datetime.datetime(2026, 5, 30, 5, 22, 56), 'salt', 10.88, 45.95, None, 12.74, 339.49, 11.17, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:23:12.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:23:12.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:23:12.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:22:56, diff=16.70744s, valid=True
2026-05-30T05:23:12.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:23:12.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:23:12.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:23:12, diff=0.710996s, valid=True
2026-05-30T05:23:12.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:23:12.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:23:12.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:22:56, diff=16.7192s, valid=True
2026-05-30T05:23:12.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:23:12.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:23:12.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:23:12.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:23:12.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:23:12.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:23:12.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:23:12, diff=0.722991s, valid=True
2026-05-30T05:23:12.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:23:12.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:23:12.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:23:12.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044034.723825s, valid=True
2026-05-30T05:23:12.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:23:12.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:23:12.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:23:12.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:23:12.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:23:12.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:23:12.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:23:12.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:23:12.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:23:12.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:23:12.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:23:12.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:23:13.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:23:13.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:23:13.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:23:13.646 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:23:13.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:23:13.746 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:23:13.746 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:23:13.941 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:23:13.941 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:23:43.963 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:23:43.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:23:43.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:23:44.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:23:44.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:23:44.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:23:44.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-05-30T05:23:44.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:23:44.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-05-30T05:23:44.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:23:44.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:23:44.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:23:44.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-05-30T05:23: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-05-30T05:23:47.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:23:47.341 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:23:47.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:23:47.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:23:47.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:23:47.365 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:23:47.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:23:47.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:23:47.366 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:23:47.366 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:23:47.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:23:47.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:23:47.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:23:47.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:23:47.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:23:47.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:23:47.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:23:47.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:23:47.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:23:47.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:23:47.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:23:47.688 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:23:47.753 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:23:27
2026-05-30T05:23:47.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73850, datetime.datetime(2026, 5, 30, 5, 23, 27), datetime.datetime(2026, 5, 30, 5, 23, 27), 'salt', 10.91, 46.15, None, 16.09, 326.82, 11.11, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:23:47.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:23:47.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:23:47.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:23:27, diff=20.760696s, valid=True
2026-05-30T05:23:47.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:23:47.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:23:47.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:23:12, diff=35.764174s, valid=True
2026-05-30T05:23:47.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:23:47.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:23:47.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:23:21, diff=26.772363s, valid=True
2026-05-30T05:23:47.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:23:47.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:23:47.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:23:47.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:23:47.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:23:47.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:23:47.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:23:12, diff=35.776115s, valid=True
2026-05-30T05:23:47.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:23:47.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:23:47.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:23:47.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044069.776941s, valid=True
2026-05-30T05:23:47.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:23:47.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:23:47.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:23:47.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:23:47.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:23:47.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:23:47.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:23:47.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:23:47.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:23:47.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:23:47.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:23:48.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:23:48.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:23:48.169 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:23:48.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:23:48.715 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:23:48.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:23:48.814 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:23:48.814 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:23:49.125 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:23:49.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:24:19.147 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:24:19.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:24:19.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:24:19.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:24:19.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:24:19.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:24:19.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-05-30T05:24:19.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:24:19.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-05-30T05:24:19.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:24:19.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:24:19.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:24:19.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-05-30T05:24:22.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-05-30T05:24:22.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:24:22.071 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:24:22.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:24:22.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:24:22.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:24:22.094 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:24:22.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:24:22.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:24:22.095 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:24:22.095 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:24:22.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:24:22.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:24:22.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:24:22.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:24:22.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:24:22.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:24:22.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:24:22.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:24:22.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:24:22.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:24:22.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:24:22.411 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:24:22.473 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:23:57
2026-05-30T05:24:22.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73851, datetime.datetime(2026, 5, 30, 5, 23, 57), datetime.datetime(2026, 5, 30, 5, 23, 57), 'salt', 10.88, 46.05, None, 16.76, 329.37, 11.14, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:24:22.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:24:22.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:24:22.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:23:57, diff=25.480608s, valid=True
2026-05-30T05:24:22.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:24:22.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:24:22.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:24:12, diff=10.484109s, valid=True
2026-05-30T05:24:22.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:24:22.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:24:22.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:23:51, diff=31.49227s, valid=True
2026-05-30T05:24:22.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:24:22.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:24:22.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:24:22.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:24:22.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:24:22.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:24:22.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:24:12, diff=10.496012s, valid=True
2026-05-30T05:24:22.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:24:22.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:24:22.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:24:22.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044104.496861s, valid=True
2026-05-30T05:24:22.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:24:22.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:24:22.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:24:22.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:24:22.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:24:22.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:24:22.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:24:22.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:24:22.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:24:22.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:24:22.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:24:22.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:24:22.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:24:22.815 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:24:23.021 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:24:23.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:24:23.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:24:23.462 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:24:23.462 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:24:23.729 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:24:23.729 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:24:53.760 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:24:53.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:24:53.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:24:54.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:24:54.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:24:54.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:24:54.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-05-30T05:24:54.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:24:54.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T05:24:54.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:24:54.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:24:54.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:24:54.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-05-30T05:24:57.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-05-30T05:24:57.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:24:57.216 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:24:57.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:24:57.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:24:57.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:24:57.240 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:24:57.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:24:57.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:24:57.241 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:24:57.242 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:24:57.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:24:57.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:24:57.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:24:57.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:24:57.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:24:57.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:24:57.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:24:57.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:24:57.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:24:57.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:24:57.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:24:57.560 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:24:57.622 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:24:27
2026-05-30T05:24:57.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73852, datetime.datetime(2026, 5, 30, 5, 24, 27), datetime.datetime(2026, 5, 30, 5, 24, 27), 'salt', 10.95, 46.08, None, 15.28, 315.48, 11.14, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:24:57.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:24:57.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:24:57.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:24:27, diff=30.629689s, valid=True
2026-05-30T05:24:57.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:24:57.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:24:57.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:24:12, diff=45.63325s, valid=True
2026-05-30T05:24:57.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:24:57.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:24:57.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:24:21, diff=36.64174s, valid=True
2026-05-30T05:24:57.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:24:57.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:24:57.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:24:57.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:24:57.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:24:57.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:24:57.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:24:12, diff=45.645637s, valid=True
2026-05-30T05:24:57.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:24:57.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:24:57.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:24:57.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044139.646482s, valid=True
2026-05-30T05:24:57.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:24:57.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:24:57.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:24:57.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:24:57.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:24:57.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:24:57.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:24:57.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:24:57.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:24:57.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:24:57.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:24:57.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:24:58.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:24:58.044 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:24:58.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:24:58.603 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:24:58.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:24: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-05-30T05:24: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-05-30T05:24:58.971 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:24:58.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:25:28.980 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:25:28.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:25:28.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:25:29.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:25:29.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:25:29.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:25:29.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-05-30T05:25:29.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:25:29.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-05-30T05:25:29.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:25:29.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:25:29.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:25:29.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-05-30T05:25:32.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-05-30T05:25:32.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:25:32.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:25:32.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:25:32.269 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:25:32.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:25:32.281 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:25:32.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:25:32.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:25:32.282 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:25:32.282 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:25:32.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:25:32.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T05:25:32.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:25:32.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T05:25:32.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:25:32.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:25:32.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:25:32.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:25:32.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:25:32.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:25:32.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:25:32.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:25:32.666 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:25:28
2026-05-30T05:25:32.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73854, datetime.datetime(2026, 5, 30, 5, 25, 28), datetime.datetime(2026, 5, 30, 5, 25, 28), 'salt', 10.88, 46.28, None, 15.74, 341.58, 11.07, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:25:32.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:25:32.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T05:25:32.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:25:28, diff=4.674241s, valid=True
2026-05-30T05:25:32.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:25:32.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:25:32.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:25:12, diff=20.678043s, valid=True
2026-05-30T05:25:32.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:25:32.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T05:25:32.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:25:23, diff=9.686828s, valid=True
2026-05-30T05:25:32.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:25:32.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:25:32.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:25:32.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:25:32.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:25:32.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:25:32.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:25:12, diff=20.690587s, valid=True
2026-05-30T05:25:32.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:25:32.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:25:32.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:25:32.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044174.691402s, valid=True
2026-05-30T05:25:32.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:25:32.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:25:32.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:25:32.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:25:32.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:25:32.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:25:32.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:25:32.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:25:32.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:25:33.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:25:33.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:25:33.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:25:33.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:25:33.796 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:25:34.033 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:25:34.857 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:25:34.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:25: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-05-30T05:25: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-05-30T05:25:39.004 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:25:39.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:26:09.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:26:09.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:26:09.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:26:09.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:26:09.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:26:09.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:26:09.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-05-30T05:26:09.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:26:09.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-05-30T05:26:09.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:26:09.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:26:09.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:26:09.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-05-30T05:26:44.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-05-30T05:26:44.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:26:44.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:26:44.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:26:44.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:26:44.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:26:44.573 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:26:44.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:26:44.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:26:44.574 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:26:44.575 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:26:44.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:26:44.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:26:44.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:26:44.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:26:44.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:26:44.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:26:44.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:26:44.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:26:44.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:26:44.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:26:44.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:26:44.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:26:44.961 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:26:28
2026-05-30T05:26:44.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73856, datetime.datetime(2026, 5, 30, 5, 26, 28), datetime.datetime(2026, 5, 30, 5, 26, 28), 'salt', 10.82, 46.52, None, 14.29, 346.09, 11.0, 831.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:26:44.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:26:44.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:26:44.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:26:28, diff=16.968924s, valid=True
2026-05-30T05:26:44.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:26:44.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:26:44.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:26:12, diff=32.972454s, valid=True
2026-05-30T05:26:44.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:26:44.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:26:44.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:26:26, diff=18.980749s, valid=True
2026-05-30T05:26:44.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:26:44.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:26:44.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:26:44.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:26:44.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:26:44.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:26:44.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:26:12, diff=32.984511s, valid=True
2026-05-30T05:26:44.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:26:44.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:26:44.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:26:44.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044246.985365s, valid=True
2026-05-30T05:26:44.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:26:44.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:26:44.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:26:44.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:26:44.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:26:45.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:26:45.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:26:45.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:26:45.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:26:45.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:26:45.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:26:45.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:26:45.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:26:45.369 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:26:45.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:26:45.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:26:46.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:26:46.021 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:26:46.021 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:26:46.211 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:26:46.211 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:27:16.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:27:16.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:27:16.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:27:16.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:27:16.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:27:16.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:27:16.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-05-30T05:27:16.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:27:16.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-05-30T05:27:16.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:27:16.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:27:16.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:27:16.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T05:27:21.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-05-30T05:27:21.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:27:21.305 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:27:21.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:27:21.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:27:21.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:27:21.330 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:27:21.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:27:21.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:27:21.332 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:27:21.332 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:27:21.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:27:21.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:27:21.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:27:21.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:27:21.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:27:21.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:27:21.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:27:21.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:27:21.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:27:21.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:27:21.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:27:21.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:27:21.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:26:59
2026-05-30T05:27:21.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73857, datetime.datetime(2026, 5, 30, 5, 26, 59), datetime.datetime(2026, 5, 30, 5, 26, 58), 'salt', 10.78, 46.52, None, 15.1, 2.99, 10.99, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:27:21.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:27:21.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:27:21.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:26:58, diff=23.720502s, valid=True
2026-05-30T05:27:21.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:27:21.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:27:21.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:27:12, diff=9.723914s, valid=True
2026-05-30T05:27:21.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:27:21.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:27:21.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:26:57, diff=24.732019s, valid=True
2026-05-30T05:27:21.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:27:21.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:27:21.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:27:21.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:27:21.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:27:21.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:27:21.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:27:12, diff=9.735706s, valid=True
2026-05-30T05:27:21.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:27:21.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:27:21.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:27:21.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044283.736513s, valid=True
2026-05-30T05:27:21.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:27:21.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:27:21.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:27:21.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:27:21.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:27:21.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:27:21.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:27:21.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:27:21.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:27:21.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:27:21.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:27:21.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:27:22.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:27:22.056 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:27:22.263 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:27:22.604 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:27:22.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:27:22.705 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:27:22.705 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:27:22.898 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:27:22.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:27:52.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:27:52.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:27:52.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:27:53.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:27:53.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:27:53.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:27:53.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-05-30T05:27:53.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:27:53.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-05-30T05:27:53.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:27:53.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:27:53.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:27:53.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-05-30T05:27:57.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-05-30T05:27:57.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:27:57.279 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:27:57.280 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:27:57.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:27:57.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:27:57.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:27:57.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:27:57.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:27:57.305 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:27:57.305 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:27:57.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:27:57.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:27:57.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:27:57.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:27:57.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:27:57.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:27:57.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:27:57.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:27:57.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:27:57.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:27:57.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:27:57.624 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:27:57.686 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:27:29
2026-05-30T05:27:57.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73858, datetime.datetime(2026, 5, 30, 5, 27, 29), datetime.datetime(2026, 5, 30, 5, 27, 29), 'salt', 10.75, 46.65, None, 16.8, 331.58, 10.95, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:27:57.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:27:57.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:27:57.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:27:29, diff=28.69383s, valid=True
2026-05-30T05:27:57.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:27:57.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:27:57.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:27:12, diff=45.697351s, valid=True
2026-05-30T05:27:57.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:27:57.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:27:57.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:27:28, diff=29.705628s, valid=True
2026-05-30T05:27:57.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:27:57.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:27:57.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:27:57.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:27:57.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:27:57.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:27:57.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:27:12, diff=45.709332s, valid=True
2026-05-30T05:27:57.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:27:57.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:27:57.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:27:57.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044319.710153s, valid=True
2026-05-30T05:27:57.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:27:57.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:27:57.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:27:57.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:27:57.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:27:57.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:27:57.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:27:57.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:27:57.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:27:57.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:27:57.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:27:57.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:27:57.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:27:58.030 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:27:58.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:27:58.582 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:27:58.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:27:58.682 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:27:58.682 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:27:58.952 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:27:58.952 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:28:28.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:28:28.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:28:28.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:28:29.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:28:29.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:28:29.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:28:29.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-05-30T05:28:29.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:28:29.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-05-30T05:28:29.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:28:29.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:28:29.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:28:29.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T05:28:31.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-05-30T05:28:31.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:28:31.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:28:31.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:28:31.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:28:31.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:28:31.778 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:28:31.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:28:31.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:28:31.778 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:28:31.778 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:28:31.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:28:31.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T05:28:31.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:28:31.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T05:28:31.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:28:31.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:28:31.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:28:32.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:28:32.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:28:32.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:28:32.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:28:32.031 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:28:32.091 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:28:29
2026-05-30T05:28:32.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73860, datetime.datetime(2026, 5, 30, 5, 28, 29), datetime.datetime(2026, 5, 30, 5, 28, 29), 'salt', 10.72, 46.58, None, 15.56, 347.83, 10.97, 831.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:28:32.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:28:32.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T05:28:32.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:28:29, diff=3.098746s, valid=True
2026-05-30T05:28:32.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:28:32.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:28:32.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:28:12, diff=20.101883s, valid=True
2026-05-30T05:28:32.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:28:32.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T05:28:32.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:28:23, diff=9.109367s, valid=True
2026-05-30T05:28:32.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:28:32.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:28:32.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:28:32.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:28:32.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:28:32.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:28:32.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:28:12, diff=20.112748s, valid=True
2026-05-30T05:28:32.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:28:32.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:28:32.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:28:32.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044354.11349s, valid=True
2026-05-30T05:28:32.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:28:32.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:28:32.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:28:32.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:28:32.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:28:32.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:28:32.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:28:32.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:28:32.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:28:32.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:28:32.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:28:32.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:28:32.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:28:32.519 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:28:32.746 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:28:33.086 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:28:33.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:28:33.246 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:28:33.246 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:28:33.498 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:28:33.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:29:03.519 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:29:03.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:29:03.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:29:03.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:29:03.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:29:04.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:29:04.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T05:29:04.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:29:04.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-05-30T05:29:04.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:29:04.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:29:04.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:29:04.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T05:29:06.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-05-30T05:29:06.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:29:06.342 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:29:06.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:29:06.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:29:06.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:29:06.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:29:06.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:29:06.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:29:06.368 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:29:06.368 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:29:06.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:29:06.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:29:06.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:29:06.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:29:06.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:29:06.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:29:06.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:29:06.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:29:06.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:29:06.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:29:06.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:29:06.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:29:06.752 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:29:00
2026-05-30T05:29:06.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73861, datetime.datetime(2026, 5, 30, 5, 29), datetime.datetime(2026, 5, 30, 5, 28, 59), 'salt', 10.78, 46.65, None, 14.54, 339.45, 10.95, 831.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:29:06.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:29:06.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:29:06.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:28:59, diff=7.759954s, valid=True
2026-05-30T05:29:06.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:29:06.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:29:06.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:29:12, diff=-5.236537s, valid=True
2026-05-30T05:29:06.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:29:06.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:29:06.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:28:53, diff=13.771751s, valid=True
2026-05-30T05:29:06.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:29:06.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:29:06.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:29:06.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:29:06.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:29:06.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:29:06.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:29:12, diff=-5.224495s, valid=True
2026-05-30T05:29:06.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:29:06.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:29:06.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:29:06.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044388.776334s, valid=True
2026-05-30T05:29:06.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:29:06.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:29:06.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:29:06.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:29:06.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:29:06.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:29:06.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:29:06.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:29:06.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:29:06.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:29:06.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:29:07.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:29:07.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:29:07.099 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:29:07.307 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:29:07.646 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:29:07.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:29:07.746 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:29:07.746 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:29:08.009 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:29:08.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:29:38.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:29:38.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:29:38.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:29:38.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:29:38.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:29:38.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:29:38.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-05-30T05:29:38.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:29:38.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-05-30T05:29:38.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:29:38.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:29:38.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:29:38.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-05-30T05:29:41.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-05-30T05:29:41.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:29:41.207 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:29:41.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:29:41.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:29:41.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:29:41.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:29:41.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:29:41.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:29:41.228 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:29:41.228 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:29:41.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:29:41.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:29:41.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:29:41.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:29:41.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:29:41.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:29:41.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:29:41.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:29:41.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:29:41.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:29:41.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:29:41.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:29:41.551 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:29:30
2026-05-30T05:29:41.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73862, datetime.datetime(2026, 5, 30, 5, 29, 30), datetime.datetime(2026, 5, 30, 5, 29, 30), 'salt', 10.62, 46.68, None, 13.8, 335.62, 10.94, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:29:41.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:29:41.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:29:41.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:29:30, diff=11.55851s, valid=True
2026-05-30T05:29:41.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:29:41.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:29:41.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:29:12, diff=29.56166s, valid=True
2026-05-30T05:29:41.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:29:41.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:29:41.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:29:24, diff=17.569144s, valid=True
2026-05-30T05:29:41.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:29:41.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:29:41.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:29:41.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:29:41.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:29:41.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:29:41.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:29:12, diff=29.572458s, valid=True
2026-05-30T05:29:41.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:29:41.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:29:41.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:29:41.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044423.573196s, valid=True
2026-05-30T05:29:41.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:29:41.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:29:41.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:29:41.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:29:41.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:29:41.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:29:41.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:29:41.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:29:41.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:29:41.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:29:41.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:29:41.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:29:41.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:29:41.891 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:29:42.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:29:42.513 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:29:42.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:29:42.614 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:29:42.614 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:29:42.796 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:29:42.796 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:30:12.826 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:30:12.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:30:12.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:30:13.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:30:13.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:30:13.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:30:13.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-05-30T05:30:13.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:30:13.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-05-30T05:30:13.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:30:13.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:30:13.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:30:13.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-05-30T05:30:19.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-05-30T05:30:19.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:30:19.272 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:30:19.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:30:19.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:30:19.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:30:19.295 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:30:19.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:30:19.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:30:19.296 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:30:19.296 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:30:19.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:30:19.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:30:19.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:30:19.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:30:19.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:30:19.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:30:19.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:30:19.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:30:19.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:30:19.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:30:19.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:30:19.616 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:30:19.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:30:00
2026-05-30T05:30:19.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73863, datetime.datetime(2026, 5, 30, 5, 30), datetime.datetime(2026, 5, 30, 5, 30), 'salt', 10.72, 46.81, None, 14.4, 331.47, 10.91, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:30:19.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:30:19.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:30:19.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:30:00, diff=19.68693s, valid=True
2026-05-30T05:30:19.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:30:19.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:30:19.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:30:12, diff=7.690449s, valid=True
2026-05-30T05:30:19.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:30:19.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:30:19.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:29:55, diff=24.698796s, valid=True
2026-05-30T05:30:19.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:30:19.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:30:19.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:30:19.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:30:19.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:30:19.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:30:19.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:30:12, diff=7.702595s, valid=True
2026-05-30T05:30:19.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:30:19.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:30:19.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:30:19.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044461.703442s, valid=True
2026-05-30T05:30:19.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:30:19.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:30:19.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:30:19.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:30:19.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:30:19.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:30:19.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:30:19.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:30:19.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:30:19.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:30:19.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:30:19.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:30:19.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:30:20.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:30:20.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:30:20.597 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:30:20.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:30:20.696 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:30:20.696 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:30:20.955 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:30:20.955 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:30:50.961 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:30:50.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:30:50.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:30:51.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:30:51.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:30:51.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:30:51.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-05-30T05:30:51.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:30:51.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-05-30T05:30:51.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:30:51.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:30:51.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:30:51.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-05-30T05:31:20.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-05-30T05:31:20.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:31:20.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:31:20.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:31:20.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:31:20.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:31:20.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:31:20.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:31:20.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:31:20.415 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:31:20.416 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:31:20.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:31:20.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:31:20.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:31:20.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:31:20.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:31:20.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:31:20.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:31:20.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:31:20.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:31:20.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:31:20.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:31:20.746 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:31:20.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:31:01
2026-05-30T05:31:20.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73865, datetime.datetime(2026, 5, 30, 5, 31, 1), datetime.datetime(2026, 5, 30, 5, 31), 'salt', 10.75, 46.68, None, 16.9, 331.0, 10.94, 831.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:31:20.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:31:20.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:31:20.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:31:00, diff=20.817064s, valid=True
2026-05-30T05:31:20.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:31:20.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:31:20.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:31:12, diff=8.820611s, valid=True
2026-05-30T05:31:20.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:31:20.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:31:20.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:30:58, diff=22.82904s, valid=True
2026-05-30T05:31:20.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:31:20.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:31:20.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:31:20.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:31:20.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:31:20.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:31:20.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:31:12, diff=8.832869s, valid=True
2026-05-30T05:31:20.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:31:20.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:31:20.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:31:20.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044522.83373s, valid=True
2026-05-30T05:31:20.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:31:20.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:31:20.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:31:20.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:31:20.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:31:20.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:31:20.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:31:20.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:31:20.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:31:20.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:31:21.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:31:21.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:31:21.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:31:21.232 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:31:21.450 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:31:21.800 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:31:21.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:31:21.902 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:31:21.902 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:31:22.090 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:31:22.090 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:31:52.120 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:31:52.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:31:52.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:31:52.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:31:52.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:31:52.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:31:52.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-05-30T05:31:52.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:31:52.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-05-30T05:31:52.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:31:52.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:31:52.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:31:52.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-05-30T05:31:56.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-05-30T05:31:56.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:31:56.897 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:31:56.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:31:56.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:31:56.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:31:56.921 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:31:56.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:31:56.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:31:56.922 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:31:56.922 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:31:56.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:31:57.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:31:57.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:31:57.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:31:57.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:31:57.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:31:57.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:31:57.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:31:57.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:31:57.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:31:57.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:31:57.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:31:57.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:31:31
2026-05-30T05:31:57.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73866, datetime.datetime(2026, 5, 30, 5, 31, 31), datetime.datetime(2026, 5, 30, 5, 31, 31), 'salt', 10.65, 46.25, None, 13.52, 337.57, 11.06, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:31:57.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:31:57.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:31:57.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:31:31, diff=26.343348s, valid=True
2026-05-30T05:31:57.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:31:57.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:31:57.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:31:12, diff=45.346899s, valid=True
2026-05-30T05:31:57.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:31:57.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:31:57.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:31:29, diff=28.355293s, valid=True
2026-05-30T05:31:57.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:31:57.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:31:57.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:31:57.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:31:57.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:31:57.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:31:57.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:31:12, diff=45.359057s, valid=True
2026-05-30T05:31:57.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:31:57.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:31:57.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:31:57.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044559.3599s, valid=True
2026-05-30T05:31:57.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:31:57.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:31:57.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:31:57.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:31:57.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:31:57.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:31:57.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:31:57.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:31:57.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:31:57.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:31:57.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:31:57.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:31:57.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:31:57.682 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:31:57.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:31:58.231 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:31:58.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:31:58.331 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:31:58.331 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:31:58.522 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:31:58.522 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:32:28.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:32:28.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:32:28.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:32:28.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:32:28.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:32:28.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:32:28.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-05-30T05:32:28.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:32:28.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-05-30T05:32:28.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:32:28.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:32:28.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:32:28.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-05-30T05:32:31.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T05:32:31.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:32:31.165 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:32:31.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:32:31.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:32:31.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:32:31.190 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:32:31.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:32:31.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:32:31.191 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:32:31.191 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:32:31.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:32:31.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:32:31.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:32:31.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:32:31.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:32:31.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:32:31.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:32:31.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:32:31.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:32:31.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:32:31.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:32:31.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:32:31.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:32:01
2026-05-30T05:32:31.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73867, datetime.datetime(2026, 5, 30, 5, 32, 1), datetime.datetime(2026, 5, 30, 5, 32, 1), 'salt', 10.82, 46.48, None, 16.16, 325.29, 11.01, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:32:31.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:32:31.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:32:31.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:32:01, diff=30.574294s, valid=True
2026-05-30T05:32:31.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:32:31.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:32:31.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:32:12, diff=19.577152s, valid=True
2026-05-30T05:32:31.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:32:31.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:32:31.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:32:01, diff=30.584128s, valid=True
2026-05-30T05:32:31.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:32:31.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:32:31.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:32:31.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:32:31.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:32:31.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:32:31.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:32:12, diff=19.587217s, valid=True
2026-05-30T05:32:31.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:32:31.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:32:31.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:32:31.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044593.587885s, valid=True
2026-05-30T05:32:31.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:32:31.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:32:31.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:32:31.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:32:31.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:32:31.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:32:31.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:32:31.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:32:31.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:32:31.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:32:31.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:32:31.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:32:31.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:32:31.978 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:32:32.200 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:32:32.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:32:32.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:32:32.706 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:32:32.706 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:32:32.860 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:32:32.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:33:02.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:33:02.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:33:02.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:33:03.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:33:03.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:33:03.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:33:03.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T05:33:03.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:33:03.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-05-30T05:33:03.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:33:03.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:33:03.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:33:03.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-05-30T05:33:05.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-05-30T05:33:05.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:33:05.913 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:33:05.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:33:05.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:33:05.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:33:05.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:33:05.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:33:05.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:33:05.938 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:33:05.939 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:33:05.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:33:06.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T05:33:06.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:33:06.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T05:33:06.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:33:06.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:33:06.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:33:06.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:33:06.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:33:06.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:33:06.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:33:06.272 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:33:06.334 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:33:02
2026-05-30T05:33:06.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73869, datetime.datetime(2026, 5, 30, 5, 33, 2), datetime.datetime(2026, 5, 30, 5, 33, 1), 'salt', 10.88, 46.52, None, 14.64, 334.63, 11.0, 831.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:33:06.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:33:06.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T05:33:06.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:33:01, diff=5.341885s, valid=True
2026-05-30T05:33:06.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:33:06.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:33:06.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:32:12, diff=54.345392s, valid=True
2026-05-30T05:33:06.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:33:06.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T05:33:06.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:32:55, diff=11.353844s, valid=True
2026-05-30T05:33:06.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:33:06.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:33:06.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:33:06.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:33:06.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:33:06.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:33:06.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:32:12, diff=54.357568s, valid=True
2026-05-30T05:33:06.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:33:06.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:33:06.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:33:06.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044628.358384s, valid=True
2026-05-30T05:33:06.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:33:06.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:33:06.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:33:06.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:33:06.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:33:06.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:33:06.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:33:06.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:33:06.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:33:06.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:33:06.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:33:06.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:33:06.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:33:06.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:33:06.888 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:33:07.227 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:33:07.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:33:07.327 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:33:07.328 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:33:07.529 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:33:07.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:33:37.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:33:37.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:33:37.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:33:37.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:33:37.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:33:38.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:33:38.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T05:33:38.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:33:38.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-05-30T05:33:38.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:33:38.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:33:38.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:33:38.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-05-30T05:33:40.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-05-30T05:33:40.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:33:40.567 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:33:40.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:33:40.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:33:40.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:33:40.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:33:40.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:33:40.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:33:40.591 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:33:40.591 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:33:40.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:33:40.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:33:40.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:33:40.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:33:40.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:33:40.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T05:33:40.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:33:40.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T05:33:40.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:33:40.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:33:40.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:33:40.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:33:40.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:33:32
2026-05-30T05:33:40.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73870, datetime.datetime(2026, 5, 30, 5, 33, 32), datetime.datetime(2026, 5, 30, 5, 33, 31), 'salt', 10.75, 46.38, None, 15.95, 328.37, 11.03, 831.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:33:40.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:33:40.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:33:41.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:33:31, diff=10.003105s, valid=True
2026-05-30T05:33:41.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:33:41.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T05:33:41.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:32:12, diff=89.006651s, valid=True
2026-05-30T05:33:41.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:33:41.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:33:41.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:33:25, diff=16.014788s, valid=True
2026-05-30T05:33:41.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:33:41.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:33:41.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:33:41.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:33:41.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:33:41.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T05:33:41.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:32:12, diff=89.018512s, valid=True
2026-05-30T05:33:41.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:33:41.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:33:41.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:33:41.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044663.019334s, valid=True
2026-05-30T05:33:41.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:33:41.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:33:41.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:33:41.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:33:41.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:33:41.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:33:41.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:33:41.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:33:41.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:33:41.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:33:41.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:33:41.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:33:41.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:33:41.409 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:33:41.617 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:33:41.959 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:33:42.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:33:42.058 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:33:42.058 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:33:42.212 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:33:42.212 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:34:12.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:34:12.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:34:12.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:34:12.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:34:12.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:34:12.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:34:12.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-05-30T05:34:12.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:34:12.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T05:34:12.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:34:12.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:34:12.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:34:12.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-05-30T05:34:15.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-05-30T05:34:15.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:34:15.129 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:34:15.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:34:15.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:34:15.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:34:15.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:34:15.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:34:15.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:34:15.156 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:34:15.156 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:34:15.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:34:15.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:34:15.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:34:15.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:34:15.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:34:15.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T05:34:15.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:34:15.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T05:34:15.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:34:15.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:34:15.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:34:15.506 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:34:15.570 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:34:02
2026-05-30T05:34:15.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73871, datetime.datetime(2026, 5, 30, 5, 34, 2), datetime.datetime(2026, 5, 30, 5, 34, 2), 'salt', 10.72, 46.35, None, 15.7, 333.18, 11.04, 831.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:34:15.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:34:15.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:34:15.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:34:02, diff=13.578776s, valid=True
2026-05-30T05:34:15.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:34:15.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T05:34:15.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:32:12, diff=123.582436s, valid=True
2026-05-30T05:34:15.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:34:15.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:34:15.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:33:56, diff=19.591118s, valid=True
2026-05-30T05:34:15.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:34:15.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:34:15.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:34:15.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:34:15.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:34:15.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T05:34:15.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:32:12, diff=123.595008s, valid=True
2026-05-30T05:34:15.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:34:15.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:34:15.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:34:15.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044697.595875s, valid=True
2026-05-30T05:34:15.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:34:15.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:34:15.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:34:15.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:34:15.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:34:15.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:34:15.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:34:15.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:34:15.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:34:15.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:34:15.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:34:15.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:34:15.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:34:15.916 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:34:16.124 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:34:16.466 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:34:16.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:34:16.566 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:34:16.566 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:34:16.761 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:34:16.762 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:34:46.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:34:46.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:34:46.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:34:47.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:34:47.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:34:47.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:34:47.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-05-30T05:34:47.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:34: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-05-30T05:34:47.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:34:47.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:34:47.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:34:47.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-05-30T05:34:53.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-05-30T05:34:53.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:34:53.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:34:53.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:34:53.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:34:53.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:34:53.435 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:34:53.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:34:53.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:34:53.436 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:34:53.437 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:34:53.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:34:53.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:34:53.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:34:53.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:34:53.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:34:53.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T05:34:53.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:34:53.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T05:34:53.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:34:53.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:34:53.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:34:53.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:34:53.872 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:34:32
2026-05-30T05:34:53.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73872, datetime.datetime(2026, 5, 30, 5, 34, 32), datetime.datetime(2026, 5, 30, 5, 34, 32), 'salt', 10.85, 46.38, None, 13.9, 323.18, 11.04, 831.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:34:53.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:34:53.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:34:53.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:34:32, diff=21.878706s, valid=True
2026-05-30T05:34:53.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:34:53.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T05:34:53.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:32:12, diff=161.881647s, valid=True
2026-05-30T05:34:53.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:34:53.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:34:53.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:34:28, diff=25.888649s, valid=True
2026-05-30T05:34:53.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:34:53.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:34:53.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:34:53.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:34:53.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:34:53.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T05:34:53.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:32:12, diff=161.891851s, valid=True
2026-05-30T05:34:53.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:34:53.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:34:53.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:34:53.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044735.892549s, valid=True
2026-05-30T05:34:53.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:34:53.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:34:53.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:34:53.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:34:53.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:34:53.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:34:53.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:34:53.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:34:53.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:34:54.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:34:54.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:34:54.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:34:54.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:34:54.207 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:34:54.415 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:34:54.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:34:54.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:34:54.858 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:34:54.858 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:34:55.058 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:34:55.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:35:25.075 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:35:25.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:35:25.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:35:25.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:35:25.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:35:25.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:35: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-05-30T05:35:25.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:35:25.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-05-30T05:35:25.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:35:25.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:35:25.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:35:25.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-05-30T05:36:07.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-05-30T05:36:07.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:36:07.260 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:36:07.260 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:36:07.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:36:07.282 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:36:07.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:36:07.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:36:07.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:36:07.284 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:36:07.284 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:36:07.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:36:07.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T05:36:07.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:36:07.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T05:36:07.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:36:07.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T05:36:07.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:36:07.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T05:36:07.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:36:07.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:36:07.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:36:07.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:36:07.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:36:03
2026-05-30T05:36:07.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73875, datetime.datetime(2026, 5, 30, 5, 36, 3), datetime.datetime(2026, 5, 30, 5, 36, 2), 'salt', 10.78, 46.52, None, 14.29, 325.95, 10.99, 831.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:36:07.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:36:07.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T05:36:07.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:36:02, diff=5.687387s, valid=True
2026-05-30T05:36:07.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:36:07.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T05:36:07.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:32:12, diff=235.690893s, valid=True
2026-05-30T05:36:07.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:36:07.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T05:36:07.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:36:02, diff=5.699395s, valid=True
2026-05-30T05:36:07.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:36:07.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:36:07.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:36:07.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:36:07.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:36:07.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T05:36:07.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:32:12, diff=235.703117s, valid=True
2026-05-30T05:36:07.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:36:07.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:36:07.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:36:07.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044809.703945s, valid=True
2026-05-30T05:36:07.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:36:07.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:36:07.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:36:07.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:36:07.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:36:07.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:36:07.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:36:07.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:36:07.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:36:07.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:36:07.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:36:07.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:36:07.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:36:08.025 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:36:08.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:36:08.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:36:08.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:36:08.752 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:36:08.752 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:36:09.008 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:36:09.008 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:36:39.038 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:36:39.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:36:39.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:36:39.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:36:39.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:36:39.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:36:39.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-05-30T05:36:39.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:36:39.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-05-30T05:36:39.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:36:39.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:36:39.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:36:39.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-05-30T05:37:08.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-05-30T05:37:08.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:37:08.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:37:08.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:37:08.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:37:08.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:37:08.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:37:08.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:37:08.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:37:08.292 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:37:08.292 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:37:08.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:37:08.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T05:37:08.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:37:08.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T05:37:08.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:37:08.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T05:37:08.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:37:08.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T05:37:08.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:37:08.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:37:08.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:37:08.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:37:08.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:37:04
2026-05-30T05:37:08.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73877, datetime.datetime(2026, 5, 30, 5, 37, 4), datetime.datetime(2026, 5, 30, 5, 37, 3), 'salt', 10.72, 46.62, None, 13.66, 328.39, 10.96, 831.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:37:08.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:37:08.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T05:37:08.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:37:03, diff=5.688017s, valid=True
2026-05-30T05:37:08.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:37:08.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T05:37:08.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:37:12, diff=-3.308511s, valid=True
2026-05-30T05:37:08.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:37:08.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T05:37:08.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:36:57, diff=11.699808s, valid=True
2026-05-30T05:37:08.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:37:08.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:37:08.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:37:08.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:37:08.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:37:08.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T05:37:08.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:37:12, diff=-3.296437s, valid=True
2026-05-30T05:37:08.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:37:08.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:37:08.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:37:08.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044870.704416s, valid=True
2026-05-30T05:37:08.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:37:08.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:37:08.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:37:08.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:37:08.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:37:08.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:37:08.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:37:08.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:37:08.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:37:08.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:37:08.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:37:08.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:37:08.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:37:09.024 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:37:09.233 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:37:09.573 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:37:09.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:37:09.673 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:37:09.673 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:37:09.865 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:37:09.865 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:37:39.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:37:39.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:37:39.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:37:40.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:37:40.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:37:40.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:37:40.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-05-30T05:37:40.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:37:40.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-05-30T05:37:40.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:37:40.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:37:40.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:37:40.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-05-30T05:37:42.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-05-30T05:37:42.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:37:42.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:37:42.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:37:42.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:37:42.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:37:42.967 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:37:42.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:37:42.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:37:42.968 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:37:42.968 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:37:42.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:37:43.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:37:43.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:37:43.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:37:43.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:37:43.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T05:37:43.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:37:43.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T05:37:43.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:37:43.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:37:43.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:37:43.286 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:37:43.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:37:34
2026-05-30T05:37:43.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73878, datetime.datetime(2026, 5, 30, 5, 37, 34), datetime.datetime(2026, 5, 30, 5, 37, 34), 'salt', 10.65, 46.75, None, 12.03, 343.69, 10.91, 831.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:37:43.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:37:43.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:37:43.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:37:34, diff=9.357437s, valid=True
2026-05-30T05:37:43.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:37:43.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T05:37:43.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:38:12, diff=-28.639033s, valid=True
2026-05-30T05:37:43.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:37:43.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:37:43.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:37:27, diff=16.36929s, valid=True
2026-05-30T05:37:43.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:37:43.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:37:43.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:37:43.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:37:43.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:37:43.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T05:37:43.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:38:12, diff=-28.626982s, valid=True
2026-05-30T05:37:43.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:37:43.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:37:43.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:37:43.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044905.373846s, valid=True
2026-05-30T05:37:43.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:37:43.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:37:43.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:37:43.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:37:43.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:37:43.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:37:43.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:37:43.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:37:43.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:37:43.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:37:43.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:37:43.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:37:43.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:37:43.696 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:37:43.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:37:44.302 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:37:44.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:37:44.400 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:37:44.400 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:37:44.631 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:37:44.631 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:38:14.650 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:38:14.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:38:14.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:38:14.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:38:14.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:38:15.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:38:15.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-05-30T05:38:15.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:38:15.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-05-30T05:38:15.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:38:15.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:38:15.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:38:15.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-05-30T05:38: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-05-30T05:38:17.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:38:17.556 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:38:17.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:38:17.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:38:17.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:38:17.579 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:38:17.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:38:17.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:38:17.580 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:38:17.581 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:38:17.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:38:17.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:38:17.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:38:17.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:38:17.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:38:17.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T05:38:17.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:38:17.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T05:38:17.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:38:17.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:38:17.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:38:17.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:38:17.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:38:04
2026-05-30T05:38:17.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73879, datetime.datetime(2026, 5, 30, 5, 38, 4), datetime.datetime(2026, 5, 30, 5, 38, 4), 'salt', 10.58, 46.58, None, 15.14, 320.69, 10.95, 831.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:38:17.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:38:17.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:38:17.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:38:04, diff=13.934903s, valid=True
2026-05-30T05:38:17.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:38:17.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T05:38:17.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:38:12, diff=5.937943s, valid=True
2026-05-30T05:38:17.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:38:17.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:38:17.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:37:57, diff=20.945061s, valid=True
2026-05-30T05:38:17.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:38:17.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:38:17.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:38:17.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:38:17.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:38:17.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T05:38:17.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:38:12, diff=5.948134s, valid=True
2026-05-30T05:38:17.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:38:17.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:38:17.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:38:17.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044939.948828s, valid=True
2026-05-30T05:38:17.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:38:17.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:38:17.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:38:17.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:38:17.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:38:18.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:38:18.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:38:18.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:38:18.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:38:18.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:38:18.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:38:18.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:38:18.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:38:18.349 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:38:18.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:38:18.881 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:38:18.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:38:18.979 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:38:18.979 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:38:19.231 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:38:19.232 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:38:49.234 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:38:49.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:38:49.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:38:49.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:38:49.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:38:49.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:38:49.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-05-30T05:38:49.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:38:49.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-05-30T05:38:49.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:38:49.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:38:49.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:38:49.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-05-30T05:38:54.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-05-30T05:38:54.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:38:54.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:38:54.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:38:54.356 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:38:54.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:38:54.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:38:54.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:38:54.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:38:54.371 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:38:54.371 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:38:54.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:38:54.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:38:54.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:38:54.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:38:54.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:38:54.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T05:38:54.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:38:54.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T05:38:54.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:38:54.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:38:54.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:38:54.705 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:38:54.768 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:38:34
2026-05-30T05:38:54.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73880, datetime.datetime(2026, 5, 30, 5, 38, 34), datetime.datetime(2026, 5, 30, 5, 38, 34), 'salt', 10.75, 46.48, None, 16.09, 332.26, 11.0, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:38:54.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:38:54.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:38:54.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:38:34, diff=20.778989s, valid=True
2026-05-30T05:38:54.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:38:54.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T05:38:54.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:39:12, diff=-17.217623s, valid=True
2026-05-30T05:38:54.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:38:54.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:38:54.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:38:28, diff=26.790333s, valid=True
2026-05-30T05:38:54.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:38:54.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:38:54.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:38:54.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:38:54.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:38:54.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T05:38:54.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:39:12, diff=-17.206045s, valid=True
2026-05-30T05:38:54.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:38:54.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:38:54.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:38:54.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1044976.794749s, valid=True
2026-05-30T05:38:54.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:38:54.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:38:54.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:38:54.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:38:54.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:38:54.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:38:54.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:38:54.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:38:54.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:38:54.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:38:54.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:38:55.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:38:55.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:38:55.116 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:38:55.386 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:38:55.721 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:38:55.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:38:55.821 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:38:55.821 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:38:56.078 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:38:56.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:39:26.087 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:39:26.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:39:26.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:39:26.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:39:26.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:39:26.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:39:26.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-05-30T05:39:26.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:39:26.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-05-30T05:39:26.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:39:26.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:39:26.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:39:26.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-05-30T05:39:58.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-05-30T05:39:58.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:39:58.547 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:39:58.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:39:58.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:39:58.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:39:58.576 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:39:58.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:39:58.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:39:58.577 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:39:58.577 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:39:58.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:39:58.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:39:58.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:39:58.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:39:58.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:39:58.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T05:39:58.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:39:58.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T05:39:58.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:39:58.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:39:58.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:39:58.910 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:39:58.970 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:39:35
2026-05-30T05:39:58.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73882, datetime.datetime(2026, 5, 30, 5, 39, 35), datetime.datetime(2026, 5, 30, 5, 39, 35), 'salt', 10.82, 46.12, None, 15.63, 324.19, 11.12, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:39:58.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:39:58.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:39:58.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:39:35, diff=23.977799s, valid=True
2026-05-30T05:39:58.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:39:58.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T05:39:58.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:40:12, diff=-13.018777s, valid=True
2026-05-30T05:39:58.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:39:58.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:39:58.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:39:31, diff=27.989363s, valid=True
2026-05-30T05:39:58.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:39:58.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:39:58.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:39:58.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:39:58.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:39:58.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T05:39:58.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:40:12, diff=-13.006987s, valid=True
2026-05-30T05:39:58.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:39:58.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:39:58.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:39:58.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045040.993823s, valid=True
2026-05-30T05:39:58.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:39:58.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:39:58.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:39:58.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:39:58.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:39:59.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:39:59.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:39:59.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:39:59.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:39:59.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:39:59.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:39:59.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:39:59.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:39:59.325 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:39:59.527 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:39:59.870 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:39:59.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:39:59.985 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:39:59.985 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:40:00.183 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:40:00.183 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:40:30.204 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:40:30.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:40:30.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:40:30.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:40:30.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:40:30.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:40:30.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-05-30T05:40:30.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:40:30.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-05-30T05:40:30.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:40:30.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:40:30.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:40:30.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-05-30T05:40:33.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-05-30T05:40:33.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:40:33.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:40:33.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:40:33.280 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:40:33.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:40:33.293 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:40:33.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:40:33.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:40:33.294 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:40:33.295 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:40:33.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:40:33.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:40:33.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:40:33.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:40:33.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:40:33.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T05:40:33.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:40:33.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 658 rows from lcogt
2026-05-30T05:40:33.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:40:33.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:40:33.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:40:33.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:40:33.671 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:40:05
2026-05-30T05:40:33.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73883, datetime.datetime(2026, 5, 30, 5, 40, 5), datetime.datetime(2026, 5, 30, 5, 40, 5), 'salt', 10.82, 46.28, None, 15.77, 330.64, 11.07, 831.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:40:33.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:40:33.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:40:33.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:40:05, diff=28.679247s, valid=True
2026-05-30T05:40:33.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:40:33.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T05:40:33.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:40:12, diff=21.682687s, valid=True
2026-05-30T05:40:33.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:40:33.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:40:33.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:40:03, diff=30.690854s, valid=True
2026-05-30T05:40:33.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:40:33.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:40:33.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:40:33.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:40:33.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:40:33.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 658 rows. Structure expected: 10 fields
2026-05-30T05:40:33.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:40:12, diff=21.694488s, valid=True
2026-05-30T05:40:33.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:40:33.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:40:33.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:40:33.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045075.695299s, valid=True
2026-05-30T05:40:33.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:40:33.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:40:33.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:40:33.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:40:33.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:40:33.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:40:33.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:40:33.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:40:33.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:40:33.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:40:33.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:40:33.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:40:34.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:40:34.084 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:40:34.282 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:40:34.617 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:40:34.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:40:34.715 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:40:34.715 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:40:35.014 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:40:35.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:41:05.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:41:05.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:41:05.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:41:05.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:41:05.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:41:05.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:41:05.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-05-30T05:41:05.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:41:05.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-05-30T05:41:05.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:41:05.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:41:05.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:41:05.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T05:41: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-05-30T05:41:10.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:41:10.025 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:41:10.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:41:10.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:41:10.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:41:10.046 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:41:10.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:41:10.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:41:10.046 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:41:10.046 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:41:10.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:41:10.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T05:41:10.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:41:10.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T05:41:10.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:41:10.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T05:41:10.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:41:10.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T05:41:10.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:41:10.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:41:10.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:41:10.311 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:41:10.372 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:41:06
2026-05-30T05:41:10.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73885, datetime.datetime(2026, 5, 30, 5, 41, 6), datetime.datetime(2026, 5, 30, 5, 41, 5), 'salt', 10.82, 46.12, None, 15.39, 327.8, 11.12, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:41:10.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:41:10.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T05:41:10.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:41:05, diff=5.378881s, valid=True
2026-05-30T05:41:10.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:41:10.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T05:41:10.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:41:12, diff=-1.618044s, valid=True
2026-05-30T05:41:10.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:41:10.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T05:41:10.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:41:05, diff=5.389195s, valid=True
2026-05-30T05:41:10.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:41:10.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:41:10.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:41:10.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:41:10.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:41:10.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T05:41:10.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:41:12, diff=-1.607466s, valid=True
2026-05-30T05:41:10.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:41:10.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:41:10.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:41:10.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045112.393273s, valid=True
2026-05-30T05:41:10.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:41:10.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:41:10.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:41:10.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:41:10.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:41:10.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:41:10.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:41:10.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:41:10.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:41:10.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:41:10.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:41:10.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:41:10.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:41:10.712 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:41:10.910 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:41:11.248 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:41:11.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:41:11.346 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:41: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-05-30T05:41:11.574 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:41:11.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:41:41.605 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:41:41.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:41:41.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:41:41.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:41:41.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:41:42.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:41:42.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-05-30T05:41:42.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:41:42.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-05-30T05:41:42.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:41:42.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:41:42.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:41:42.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-05-30T05:41:45.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-05-30T05:41:45.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:41:45.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:41:45.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:41:45.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:41:45.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:41:45.460 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:41:45.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:41:45.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:41:45.461 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:41:45.461 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:41:45.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:41:45.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:41:45.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:41:45.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:41:45.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:41:45.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T05:41:45.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:41:45.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T05:41:45.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:41:45.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:41:45.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:41:45.779 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:41:45.838 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:41:36
2026-05-30T05:41:45.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73886, datetime.datetime(2026, 5, 30, 5, 41, 36), datetime.datetime(2026, 5, 30, 5, 41, 36), 'salt', 10.68, 46.02, None, 15.53, 326.42, 11.13, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:41:45.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:41:45.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:41:45.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:41:36, diff=9.846323s, valid=True
2026-05-30T05:41:45.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:41:45.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T05:41:45.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:42:12, diff=-26.150162s, valid=True
2026-05-30T05:41:45.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:41:45.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:41:45.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:41:29, diff=16.857975s, valid=True
2026-05-30T05:41:45.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:41:45.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:41:45.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:41:45.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:41:45.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:41:45.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T05:41:45.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:42:12, diff=-26.138274s, valid=True
2026-05-30T05:41:45.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:41:45.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:41:45.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:41:45.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045147.862553s, valid=True
2026-05-30T05:41:45.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:41:45.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:41:45.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:41:45.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:41:45.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:41:45.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:41:45.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:41:45.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:41:45.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:41:46.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:41:46.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:41:46.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:41:46.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:41:46.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:41:46.449 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:41:46.781 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:41:46.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:41:46.879 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:41:46.879 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:41:47.084 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:41:47.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:42:17.106 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:42:17.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:42:17.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:42:17.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:42:17.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:42:17.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:42:17.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-05-30T05:42:17.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:42:17.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-05-30T05:42:17.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:42:17.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:42:17.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:42:17.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-05-30T05:42:20.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-05-30T05:42:20.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:42:20.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:42:20.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:42:20.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:42:20.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:42:20.115 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:42:20.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:42:20.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:42:20.115 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:42:20.115 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:42:20.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:42:20.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:42:20.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:42:20.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:42:20.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:42:20.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T05:42:20.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:42:20.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T05:42:20.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:42:20.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:42:20.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:42:20.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:42:20.444 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:42:06
2026-05-30T05:42:20.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73887, datetime.datetime(2026, 5, 30, 5, 42, 6), datetime.datetime(2026, 5, 30, 5, 42, 6), 'salt', 10.78, 46.12, None, 15.17, 327.99, 11.11, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:42:20.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:42:20.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:42:20.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:42:06, diff=14.451214s, valid=True
2026-05-30T05:42:20.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:42:20.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T05:42:20.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:42:12, diff=8.454425s, valid=True
2026-05-30T05:42:20.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:42:20.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:42:20.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:41:59, diff=21.462027s, valid=True
2026-05-30T05:42:20.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:42:20.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:42:20.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:42:20.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:42:20.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:42:20.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T05:42:20.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:42:12, diff=8.465478s, valid=True
2026-05-30T05:42:20.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:42:20.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:42:20.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:42:20.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045182.46627s, valid=True
2026-05-30T05:42:20.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:42:20.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:42:20.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:42:20.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:42:20.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:42:20.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:42:20.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:42:20.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:42:20.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:42:20.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:42:20.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:42:20.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:42:20.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:42:20.784 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:42:20.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:42:21.314 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:42:21.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:42:21.412 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:42:21.412 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:42:21.619 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:42:21.620 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:42:51.638 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:42:51.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:42:51.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:42:52.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:42:52.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:42:52.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:42:52.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-05-30T05:42:52.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:42:52.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-05-30T05:42:52.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:42:52.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:42:52.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:42:52.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T05:43:27.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-05-30T05:43:27.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:43:27.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:43:27.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:43:27.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:43:27.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:43:27.572 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:43:27.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:43:27.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:43:27.573 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:43:27.573 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:43:27.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:43:27.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:43:27.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:43:27.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:43:27.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:43:27.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T05:43:27.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:43:27.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T05:43:27.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:43:27.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:43:27.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:43:27.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:43:28.011 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:43:07
2026-05-30T05:43:28.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73889, datetime.datetime(2026, 5, 30, 5, 43, 7), datetime.datetime(2026, 5, 30, 5, 43, 6), 'salt', 10.85, 45.82, None, 15.63, 331.58, 11.21, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:43:28.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:43:28.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:43:28.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:43:06, diff=22.017725s, valid=True
2026-05-30T05:43:28.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:43:28.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T05:43:28.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:43:12, diff=16.020582s, valid=True
2026-05-30T05:43:28.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:43:28.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:43:28.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:43:01, diff=27.027802s, valid=True
2026-05-30T05:43:28.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:43:28.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:43:28.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:43:28.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:43:28.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:43:28.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T05:43:28.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:43:12, diff=16.030878s, valid=True
2026-05-30T05:43:28.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:43:28.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:43:28.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:43:28.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045250.031614s, valid=True
2026-05-30T05:43:28.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:43:28.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:43:28.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:43:28.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:43:28.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:43:28.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:43:28.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:43:28.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:43:28.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:43:28.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:43:28.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:43:28.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:43:28.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:43:28.347 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:43:28.547 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:43:28.879 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:43:28.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:43:28.978 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:43:28.979 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:43:29.245 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:43:29.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:43:59.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:43:59.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:43:59.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:43:59.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:43:59.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:43:59.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:43:59.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-05-30T05:43:59.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:43:59.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-05-30T05:43:59.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:43:59.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:43:59.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:43:59.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-05-30T05:44:02.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-05-30T05:44:02.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:44:02.473 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:44:02.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:44:02.483 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:44:02.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:44:02.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:44:02.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:44:02.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:44:02.497 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:44:02.498 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:44:02.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:44:02.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:44:02.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:44:02.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:44:02.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:44:02.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:44:02.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:44:02.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T05:44:02.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:44:02.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:44:02.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:44:02.821 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:44:02.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:43:37
2026-05-30T05:44:02.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73890, datetime.datetime(2026, 5, 30, 5, 43, 37), datetime.datetime(2026, 5, 30, 5, 43, 37), 'salt', 10.88, 45.79, None, 15.99, 329.82, 11.22, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:44:02.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:44:02.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:44:02.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:43:37, diff=25.892884s, valid=True
2026-05-30T05:44:02.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:44:02.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:44:02.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:44:12, diff=-9.103608s, valid=True
2026-05-30T05:44:02.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:44:02.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:44:02.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:43:32, diff=30.904641s, valid=True
2026-05-30T05:44:02.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:44:02.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:44:02.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:44:02.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:44:02.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:44:02.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T05:44:02.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:44:12, diff=-9.091625s, valid=True
2026-05-30T05:44:02.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:44:02.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:44:02.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:44:02.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045284.909219s, valid=True
2026-05-30T05:44:02.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:44:02.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:44:02.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:44:02.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:44:02.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:44:02.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:44:02.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:44:02.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:44:02.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:44:03.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:44:03.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:44:03.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:44:03.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:44:03.230 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:44:03.428 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:44:03.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:44:03.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:44:03.857 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:44:03.858 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:44:04.125 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:44:04.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:44:34.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:44:34.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:44:34.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:44:34.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:44:34.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:44:34.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:44:34.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-05-30T05:44:34.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:44:34.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-05-30T05:44:34.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:44:34.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:44:34.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:44:34.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-05-30T05:44:41.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-05-30T05:44:41.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:44:41.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:44:41.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:44:41.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:44:41.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:44:41.345 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:44:41.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:44:41.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:44:41.346 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:44:41.346 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:44:41.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:44:41.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T05:44:41.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:44:41.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T05:44:41.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:44:41.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:44:41.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:44:41.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:44:41.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:44:41.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:44:41.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:44:41.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:44:41.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:44:38
2026-05-30T05:44:41.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73892, datetime.datetime(2026, 5, 30, 5, 44, 38), datetime.datetime(2026, 5, 30, 5, 44, 37), 'salt', 10.85, 45.69, None, 16.09, 325.34, 11.25, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:44:41.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:44:41.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T05:44:41.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:44:37, diff=4.738386s, valid=True
2026-05-30T05:44:41.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:44:41.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:44:41.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:45:12, diff=-30.25808s, valid=True
2026-05-30T05:44:41.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:44:41.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T05:44:41.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:44:35, diff=6.75006s, valid=True
2026-05-30T05:44:41.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:44:41.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:44:41.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:44:41.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:44:41.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:44:41.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:44:41.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:45:12, diff=-30.246245s, valid=True
2026-05-30T05:44:41.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:44:41.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:44:41.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:44:41.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045323.754553s, valid=True
2026-05-30T05:44:41.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:44:41.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:44:41.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:44:41.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:44:41.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:44:41.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:44:41.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:44:41.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:44:41.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:44:41.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:44:41.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:44:41.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:44:42.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:44:42.076 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:44:42.275 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:44:42.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:44:42.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:44:42.709 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:44:42.709 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:44:44.159 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:44:44.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:45:14.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:45:14.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:45:14.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:45:14.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:45:14.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:45:14.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:45:14.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-05-30T05:45:14.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:45:14.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T05:45:14.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:45:14.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:45:14.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:45:14.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-05-30T05:45:16.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T05:45:16.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:45:16.919 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:45:16.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:45:16.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:45:16.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:45:16.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:45:16.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:45:16.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:45:16.944 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:45:16.944 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:45:16.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:45:17.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:45:17.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:45:17.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:45:17.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:45:17.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:45:17.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:45:17.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:45:17.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:45:17.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:45:17.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:45:17.272 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:45:17.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:45:08
2026-05-30T05:45:17.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73893, datetime.datetime(2026, 5, 30, 5, 45, 8), datetime.datetime(2026, 5, 30, 5, 45, 7), 'salt', 10.91, 45.62, None, 16.13, 326.35, 11.27, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:45:17.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:45:17.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:45:17.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:45:07, diff=10.341321s, valid=True
2026-05-30T05:45:17.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:45:17.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:45:17.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:45:12, diff=5.34491s, valid=True
2026-05-30T05:45:17.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:45:17.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:45:17.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:45:07, diff=10.353168s, valid=True
2026-05-30T05:45:17.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:45:17.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:45:17.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:45:17.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:45:17.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:45:17.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:45:17.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:45:12, diff=5.357133s, valid=True
2026-05-30T05:45:17.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:45:17.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:45:17.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:45:17.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045359.358043s, valid=True
2026-05-30T05:45:17.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:45:17.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:45:17.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:45:17.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:45:17.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:45:17.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:45:17.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:45:17.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:45:17.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:45:17.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:45:17.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:45:17.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:45:17.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:45:17.684 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:45:17.883 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:45:18.272 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:45:18.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:45:18.371 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:45:18.371 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:45:18.632 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:45:18.632 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:45:48.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:45:48.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:45:48.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:45:48.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:45:48.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:45:49.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:45:49.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-05-30T05:45:49.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:45:49.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-05-30T05:45:49.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:45:49.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:45:49.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:45:49.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-05-30T05:45:54.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-05-30T05:45:54.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:45:54.671 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:45:54.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:45:54.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:45:54.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:45:54.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:45:54.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:45:54.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:45:54.697 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:45:54.697 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:45:54.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:45:54.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:45:54.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:45:54.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:45:54.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:45:54.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:45:54.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:45:55.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:45:55.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:45:55.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:45:55.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:45:55.026 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:45:55.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:45:38
2026-05-30T05:45:55.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73894, datetime.datetime(2026, 5, 30, 5, 45, 38), datetime.datetime(2026, 5, 30, 5, 45, 38), 'salt', 11.01, 45.52, None, 15.7, 328.81, 11.31, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:45:55.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:45:55.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:45:55.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:45:38, diff=17.095693s, valid=True
2026-05-30T05:45:55.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:45:55.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:45:55.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:46:12, diff=-16.900744s, valid=True
2026-05-30T05:45:55.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:45:55.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:45:55.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:45:31, diff=24.107517s, valid=True
2026-05-30T05:45:55.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:45:55.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:45:55.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:45:55.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:45:55.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:45:55.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:45:55.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:46:12, diff=-16.888651s, valid=True
2026-05-30T05:45:55.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:45:55.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:45:55.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:45:55.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045397.11218s, valid=True
2026-05-30T05:45:55.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:45:55.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:45:55.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:45:55.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:45:55.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:45:55.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:45:55.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:45:55.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:45:55.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:45:55.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:45:55.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:45:55.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:45:55.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:45:55.431 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:45:55.630 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:45:55.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:45:56.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:45:56.061 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:45:56.061 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:45:56.260 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:45:56.260 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:46:26.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:46:26.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:46:26.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:46:26.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:46:26.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:46:26.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:46:26.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-05-30T05:46:26.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:46:26.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-05-30T05:46:26.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:46:26.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:46:26.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:46:26.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-05-30T05:47:27.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-05-30T05:47:27.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:47:27.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:47:27.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:47:27.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:47:27.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:47:27.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:47:27.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:47:27.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:47:27.299 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:47:27.299 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:47:27.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:47:27.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:47:27.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:47:27.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:47:27.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:47:27.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:47:27.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:47:27.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:47:27.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:47:27.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:47:27.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:47:27.628 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:47:27.697 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:47:09
2026-05-30T05:47:27.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73897, datetime.datetime(2026, 5, 30, 5, 47, 9), datetime.datetime(2026, 5, 30, 5, 47, 8), 'salt', 10.95, 45.45, None, 14.4, 328.39, 11.33, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:47:27.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:47:27.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:47:27.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:47:08, diff=19.705183s, valid=True
2026-05-30T05:47:27.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:47:27.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:47:27.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:47:12, diff=15.708593s, valid=True
2026-05-30T05:47:27.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:47:27.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:47:27.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:47:02, diff=25.716567s, valid=True
2026-05-30T05:47:27.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:47:27.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:47:27.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:47:27.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:47:27.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:47:27.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:47:27.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:47:12, diff=15.720182s, valid=True
2026-05-30T05:47:27.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:47:27.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:47:27.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:47:27.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045489.720992s, valid=True
2026-05-30T05:47:27.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:47:27.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:47:27.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:47:27.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:47:27.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:47:27.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:47:27.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:47:27.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:47:27.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:47:27.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:47:27.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:47:27.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:47:28.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:47:28.052 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:47:28.336 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:47:28.668 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:47:28.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:47:28.768 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:47:28.768 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:47:29.036 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:47:29.036 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:47:59.066 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:47:59.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:47:59.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:47:59.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:47:59.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:47:59.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:47:59.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-05-30T05:47:59.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:47:59.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-05-30T05:47:59.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:47:59.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:47:59.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:47:59.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-05-30T05:48:22.231 [ERROR] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] processing LCO all-sky image: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
2026-05-30T05:48:22.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:48:22.232 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:48:22.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:48:22.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:48:22.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:48:22.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:48:22.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:48:22.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:48:22.256 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:48:22.257 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:48:22.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:48:22.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:48:22.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:48:22.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:48:22.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:48:22.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:48:22.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:48:22.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:48:22.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:48:22.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:48:22.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:48:22.577 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:48:22.641 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:48:09
2026-05-30T05:48:22.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73899, datetime.datetime(2026, 5, 30, 5, 48, 9), datetime.datetime(2026, 5, 30, 5, 48, 9), 'salt', 10.95, 45.42, None, 15.77, 323.37, 11.34, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:48:22.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:48:22.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:48:22.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:48:09, diff=13.648908s, valid=True
2026-05-30T05:48:22.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:48:22.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:48:22.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:48:12, diff=10.652338s, valid=True
2026-05-30T05:48:22.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:48:22.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:48:22.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:48:05, diff=17.660365s, valid=True
2026-05-30T05:48:22.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:48:22.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:48:22.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:48:22.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:48:22.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:48:22.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:48:22.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:48:12, diff=10.664022s, valid=True
2026-05-30T05:48:22.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:48:22.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:48:22.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:48:22.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045544.664841s, valid=True
2026-05-30T05:48:22.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:48:22.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:48:22.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:48:22.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:48:22.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:48:22.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:48:22.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:48:22.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:48:22.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:48:22.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:48:22.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:48:22.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:48:22.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:48:22.993 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:48:23.197 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:48:23.532 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:48:23.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:48:23.633 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:48:23.633 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:48:23.896 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:48:23.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:48:53.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:48:53.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:48:53.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:48:54.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:48:54.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:48:54.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:48:54.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T05:48:54.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:48:54.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-05-30T05:48:54.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:48:54.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:48:54.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:48:54.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-05-30T05:48:57.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T05:48:57.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:48:57.569 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:48:57.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:48:57.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:48:57.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:48:57.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:48:57.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:48:57.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:48:57.594 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:48:57.594 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:48:57.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:48:57.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:48:57.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:48:57.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:48:57.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:48:57.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:48:57.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:48:57.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:48:57.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:48:57.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:48:57.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:48:57.910 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:48:57.974 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:48:40
2026-05-30T05:48:57.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73900, datetime.datetime(2026, 5, 30, 5, 48, 40), datetime.datetime(2026, 5, 30, 5, 48, 39), 'salt', 10.95, 45.45, None, 15.53, 326.21, 11.33, 831.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:48:57.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:48:57.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:48:57.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:48:39, diff=18.981687s, valid=True
2026-05-30T05:48:57.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:48:57.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:48:57.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:49:12, diff=-14.014886s, valid=True
2026-05-30T05:48:57.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:48:57.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:48:57.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:48:36, diff=21.993322s, valid=True
2026-05-30T05:48:57.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:48:57.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:48:57.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:48:57.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:48:57.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:48:57.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:48:57.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:49:12, diff=-14.002929s, valid=True
2026-05-30T05:48:57.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:48:57.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:48:57.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:48:57.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045579.99788s, valid=True
2026-05-30T05:48:57.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:48:57.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:48:57.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:48:57.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:48:58.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:48:58.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:48:58.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:48:58.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:48:58.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:48:58.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:48:58.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:48:58.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:48:58.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:48:58.387 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:48:58.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:48:58.922 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:48:59.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:48:59.022 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:48:59.022 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:48:59.287 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:48:59.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:49:29.289 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:49:29.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:49:29.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:49:29.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:49:29.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:49:29.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:49:29.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-05-30T05:49:29.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:49:29.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-05-30T05:49:29.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:49:29.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:49:29.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:49:29.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-05-30T05:49:35.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-05-30T05:49:35.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:49:35.062 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:49:35.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:49:35.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:49:35.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:49:35.085 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:49:35.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:49:35.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:49:35.086 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:49:35.087 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:49:35.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:49:35.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:49:35.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:49:35.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:49:35.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:49:35.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:49:35.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:49:35.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:49:35.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:49:35.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:49:35.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:49:35.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:49:35.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:49:10
2026-05-30T05:49:35.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73901, datetime.datetime(2026, 5, 30, 5, 49, 10), datetime.datetime(2026, 5, 30, 5, 49, 9), 'salt', 10.92, 45.69, None, 15.7, 326.56, 11.26, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:49:35.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:49:35.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:49:35.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:49:09, diff=26.483062s, valid=True
2026-05-30T05:49:35.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:49:35.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:49:35.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:49:12, diff=23.486553s, valid=True
2026-05-30T05:49:35.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:49:35.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:49:35.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:49:07, diff=28.49493s, valid=True
2026-05-30T05:49:35.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:49:35.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:49:35.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:49:35.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:49:35.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:49:35.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:49:35.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:49:12, diff=23.498504s, valid=True
2026-05-30T05:49:35.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:49:35.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:49:35.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:49:35.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045617.499289s, valid=True
2026-05-30T05:49:35.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:49:35.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:49:35.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:49:35.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:49:35.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:49:35.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:49:35.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:49:35.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:49:35.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:49:35.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:49:35.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:49:35.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:49:35.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:49:35.814 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:49:36.016 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:49:36.347 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:49:36.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:49:36.447 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:49:36.447 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:49:36.714 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:49:36.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:50:06.722 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:50:06.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:50:06.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:50:07.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:50:07.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:50:07.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:50:07.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-05-30T05:50:07.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:50:07.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T05:50:07.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:50:07.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:50:07.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:50:07.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-05-30T05:50:09.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-05-30T05:50:09.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:50:09.941 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:50:09.941 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:50:09.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:50:09.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:50:09.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:50:09.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:50:09.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:50:09.963 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:50:09.963 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:50:09.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:50:10.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:50:10.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:50:10.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:50:10.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:50:10.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:50:10.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:50:10.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:50:10.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:50:10.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:50:10.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:50:10.272 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:50:10.334 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:49:40
2026-05-30T05:50:10.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73902, datetime.datetime(2026, 5, 30, 5, 49, 40), datetime.datetime(2026, 5, 30, 5, 49, 40), 'salt', 10.92, 45.82, None, 15.88, 328.11, 11.22, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:50:10.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:50:10.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:50:10.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:49:40, diff=30.341289s, valid=True
2026-05-30T05:50:10.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:50:10.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:50:10.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:50:12, diff=-1.655546s, valid=True
2026-05-30T05:50:10.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:50:10.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:50:10.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:49:39, diff=31.351963s, valid=True
2026-05-30T05:50:10.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:50:10.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:50:10.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:50:10.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:50:10.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:50:10.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:50:10.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:50:12, diff=-1.64465s, valid=True
2026-05-30T05:50:10.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:50:10.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:50:10.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:50:10.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045652.356097s, valid=True
2026-05-30T05:50:10.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:50:10.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:50:10.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:50:10.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:50:10.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:50:10.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:50:10.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:50:10.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:50:10.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:50:10.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:50:10.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:50:10.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:50:10.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:50:10.740 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:50:10.940 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:50:11.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:50:11.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:50:11.374 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:50:11.374 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:50:11.590 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:50:11.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:50:41.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:50:41.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:50:41.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:50:41.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:50:41.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:50:42.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:50:42.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-05-30T05:50:42.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:50:42.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-05-30T05:50:42.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:50:42.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:50:42.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:50:42.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-05-30T05:50:44.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-05-30T05:50:44.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:50:44.544 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:50:44.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:50:44.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:50:44.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:50:44.570 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:50:44.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:50:44.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:50:44.571 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:50:44.571 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:50:44.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:50:44.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T05:50:44.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:50:44.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T05:50:44.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:50:44.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T05:50:44.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:50:44.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T05:50:44.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:50:44.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:50:44.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:50:44.893 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:50:44.955 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:50:41
2026-05-30T05:50:44.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73904, datetime.datetime(2026, 5, 30, 5, 50, 41), datetime.datetime(2026, 5, 30, 5, 50, 40), 'salt', 10.78, 46.05, None, 15.07, 344.49, 11.13, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:50:44.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:50:44.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T05:50:44.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:50:40, diff=4.962903s, valid=True
2026-05-30T05:50:44.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:50:44.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T05:50:44.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:51:12, diff=-27.033563s, valid=True
2026-05-30T05:50:44.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:50:44.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T05:50:44.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:50:33, diff=11.974777s, valid=True
2026-05-30T05:50:44.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:50:44.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:50:44.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:50:44.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:50:44.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:50:44.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T05:50:44.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:51:12, diff=-27.021471s, valid=True
2026-05-30T05:50:44.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:50:44.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:50:44.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:50:44.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045686.979351s, valid=True
2026-05-30T05:50:44.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:50:44.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:50:44.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:50:44.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:50:44.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:50:45.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:50:45.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:50:45.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:50:45.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:50:45.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:50:45.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:50:45.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:50:45.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:50:45.300 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:50:45.515 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:50:45.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:50:45.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:50:45.946 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:50:45.946 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:50:46.160 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:50:46.160 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:51:16.190 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:51:16.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:51:16.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:51:16.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:51:16.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:51:16.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:51:16.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-05-30T05:51:16.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:51:16.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-05-30T05:51:16.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:51:16.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:51:16.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:51:16.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T05:51:19.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-05-30T05:51:19.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:51:19.060 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:51:19.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:51:19.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:51:19.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:51:19.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:51:19.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:51:19.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:51:19.085 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:51:19.085 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:51:19.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:51:19.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:51:19.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:51:19.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:51:19.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:51:19.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:51:19.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:51:19.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:51:19.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:51:19.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:51:19.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:51:19.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:51:19.465 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:51:11
2026-05-30T05:51:19.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73905, datetime.datetime(2026, 5, 30, 5, 51, 11), datetime.datetime(2026, 5, 30, 5, 51, 10), 'salt', 10.75, 46.05, None, 14.93, 326.7, 11.13, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:51:19.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:51:19.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:51:19.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:51:10, diff=9.473196s, valid=True
2026-05-30T05:51:19.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:51:19.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:51:19.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:51:12, diff=7.476685s, valid=True
2026-05-30T05:51:19.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:51:19.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:51:19.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:51:03, diff=16.484782s, valid=True
2026-05-30T05:51:19.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:51:19.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:51:19.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:51:19.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:51:19.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:51:19.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:51:19.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:51:12, diff=7.48849s, valid=True
2026-05-30T05:51:19.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:51:19.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:51:19.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:51:19.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045721.489317s, valid=True
2026-05-30T05:51:19.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:51:19.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:51:19.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:51:19.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:51:19.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:51:19.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:51:19.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:51:19.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:51:19.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:51:19.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:51:19.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:51:19.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:51:19.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:51:19.808 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:51:20.029 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:51:20.378 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:51:20.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:51:20.477 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:51:20.477 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:51:20.715 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:51:20.715 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:51:50.745 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:51:50.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:51:50.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:51:51.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:51:51.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:51:51.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:51:51.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-05-30T05:51:51.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:51:51.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-05-30T05:51:51.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:51:51.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:51:51.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:51:51.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-05-30T05:51:55.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-05-30T05:51:55.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:51:55.929 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:51:55.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:51:55.941 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:51:55.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:51:55.954 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:51:55.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:51:55.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:51:55.955 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:51:55.956 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:51:55.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:51:56.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:51:56.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:51:56.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:51:56.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:51:56.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:51:56.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:51:56.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:51:56.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:51:56.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:51:56.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:51:56.233 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:51:56.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:51:41
2026-05-30T05:51:56.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73906, datetime.datetime(2026, 5, 30, 5, 51, 41), datetime.datetime(2026, 5, 30, 5, 51, 41), 'salt', 10.75, 45.92, None, 14.86, 335.6, 11.17, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:51:56.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:51:56.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:51:56.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:51:41, diff=15.300694s, valid=True
2026-05-30T05:51:56.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:51:56.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:51:56.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:52:12, diff=-15.696434s, valid=True
2026-05-30T05:51:56.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:51:56.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:51:56.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:51:34, diff=22.310438s, valid=True
2026-05-30T05:51:56.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:51:56.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:51:56.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:51:56.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:51:56.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:51:56.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:51:56.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:52:12, diff=-15.686463s, valid=True
2026-05-30T05:51:56.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:51:56.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:51:56.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:51:56.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045758.314214s, valid=True
2026-05-30T05:51:56.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:51:56.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:51:56.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:51:56.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:51:56.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:51:56.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:51:56.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:51:56.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:51:56.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:51:56.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:51:56.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:51:56.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:51:56.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:51:56.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:51:56.897 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:51:57.236 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:51:57.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:51:57.335 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:51:57.335 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:51:57.611 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:51:57.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:52:27.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:52:27.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:52:27.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:52:28.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:52:28.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:52:28.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:52:28.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-05-30T05:52:28.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:52:28.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-05-30T05:52:28.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:52:28.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:52:28.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:52:28.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-05-30T05:52:30.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-05-30T05:52:30.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:52:30.687 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:52:30.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:52:30.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:52:30.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:52:30.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:52:30.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:52:30.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:52:30.712 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:52:30.712 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:52:30.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:52:30.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:52:30.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:52:30.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:52:30.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:52:30.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:52:30.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:52:31.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:52:31.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:52:31.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:52:31.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:52:31.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:52:31.120 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:52:11
2026-05-30T05:52:31.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73907, datetime.datetime(2026, 5, 30, 5, 52, 11), datetime.datetime(2026, 5, 30, 5, 52, 11), 'salt', 10.72, 45.65, None, 13.48, 337.66, 11.25, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:52:31.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:52:31.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:52:31.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:52:11, diff=20.128039s, valid=True
2026-05-30T05:52:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:52:31.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:52:31.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:52:12, diff=19.131716s, valid=True
2026-05-30T05:52:31.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:52:31.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:52:31.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:52:05, diff=26.140485s, valid=True
2026-05-30T05:52:31.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:52:31.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:52:31.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:52:31.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:52:31.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:52:31.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:52:31.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:52:12, diff=19.144401s, valid=True
2026-05-30T05:52:31.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:52:31.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:52:31.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:52:31.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045793.145275s, valid=True
2026-05-30T05:52:31.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:52:31.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:52:31.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:52:31.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:52:31.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:52:31.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:52:31.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:52:31.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:52:31.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:52:31.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:52:31.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:52:31.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:52:31.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:52:31.467 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:52:31.677 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:52:32.021 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:52:32.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:52:32.124 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:52:32.124 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:52:32.665 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:52:32.732 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:53:02.749 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:53:02.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:53:02.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:53:03.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:53:03.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:53:03.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:53:03.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-05-30T05:53:03.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:53:03.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-05-30T05:53:03.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:53:03.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:53:03.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:53:03.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-05-30T05:53:05.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-05-30T05:53:05.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:53:05.625 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:53:05.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:53:05.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:53:05.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:53:05.650 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:53:05.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:53:05.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:53:05.651 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:53:05.651 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:53:05.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:53:05.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:53:05.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:53:05.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:53:05.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:53:05.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:53:05.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:53:05.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:53:05.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:53:05.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:53:05.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:53:05.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:53:06.042 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:52:42
2026-05-30T05:53:06.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73908, datetime.datetime(2026, 5, 30, 5, 52, 42), datetime.datetime(2026, 5, 30, 5, 52, 41), 'salt', 10.82, 45.65, None, 12.39, 335.41, 11.26, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:53:06.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:53:06.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:53:06.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:52:41, diff=25.050272s, valid=True
2026-05-30T05:53:06.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:53:06.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:53:06.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:53:12, diff=-5.946215s, valid=True
2026-05-30T05:53:06.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:53:06.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:53:06.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:52:37, diff=29.066599s, valid=True
2026-05-30T05:53:06.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:53:06.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:53:06.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:53:06.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:53:06.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:53:06.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:53:06.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:53:12, diff=-5.929642s, valid=True
2026-05-30T05:53:06.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:53:06.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:53:06.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:53:06.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045828.071205s, valid=True
2026-05-30T05:53:06.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:53:06.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:53:06.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:53:06.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:53:06.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:53:06.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:53:06.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:53:06.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:53:06.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:53:06.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:53:06.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:53:06.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:53:06.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:53:06.393 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:53:06.661 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:53:07.003 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:53:07.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:53:07.105 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:53:07.105 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:53:07.386 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:53:07.386 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:53:37.417 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:53:37.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:53:37.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:53:37.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:53:37.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:53:37.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:53:37.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-05-30T05:53:37.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:53:37.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-05-30T05:53:37.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:53:37.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:53:37.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:53:37.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-05-30T05:53:40.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-05-30T05:53:40.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:53:40.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:53:40.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:53:40.339 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:53:40.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:53:40.353 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:53:40.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:53:40.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:53:40.354 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:53:40.354 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:53:40.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:53:40.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:53:40.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:53:40.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:53:40.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:53:40.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:53:40.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:53:40.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:53:40.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:53:40.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:53:40.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:53:40.666 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:53:40.727 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:53:12
2026-05-30T05:53:40.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73909, datetime.datetime(2026, 5, 30, 5, 53, 12), datetime.datetime(2026, 5, 30, 5, 53, 12), 'salt', 10.92, 45.42, None, 16.09, 341.09, 11.34, 831.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:53:40.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:53:40.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:53:40.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:53:12, diff=28.735402s, valid=True
2026-05-30T05:53:40.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:53:40.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:53:40.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:53:12, diff=28.739136s, valid=True
2026-05-30T05:53:40.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:53:40.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:53:40.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:53:08, diff=32.747559s, valid=True
2026-05-30T05:53:40.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:53:40.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:53:40.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:53:40.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:53:40.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:53:40.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:53:40.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:53:12, diff=28.751521s, valid=True
2026-05-30T05:53:40.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:53:40.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:53:40.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:53:40.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045862.752364s, valid=True
2026-05-30T05:53:40.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:53:40.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:53:40.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:53:40.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:53:40.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:53:40.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:53:40.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:53:40.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:53:40.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:53:40.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:53:40.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:53:40.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:53:41.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:53:41.079 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:53:41.290 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:53:41.632 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:53:41.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:53:41.732 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:53:41.732 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:53:41.932 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:53:41.933 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:54:11.944 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:54:11.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:54:11.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:54:12.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:54:12.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:54:12.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:54:12.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-05-30T05:54:12.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:54:12.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-05-30T05:54:12.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:54:12.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:54:12.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:54:12.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-05-30T05:54:14.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T05:54:14.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:54:14.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:54:14.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:54:14.861 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:54:14.874 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:54:14.875 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:54:14.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:54:14.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:54:14.876 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:54:14.876 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:54:14.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:54:15.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T05:54:15.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:54:15.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T05:54:15.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:54:15.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:54:15.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:54:15.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:54:15.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:54:15.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:54:15.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:54:15.198 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:54:15.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:54:12
2026-05-30T05:54:15.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73911, datetime.datetime(2026, 5, 30, 5, 54, 12), datetime.datetime(2026, 5, 30, 5, 54, 12), 'salt', 11.02, 45.16, None, 15.03, 316.96, 11.43, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:54:15.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:54:15.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T05:54:15.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:54:12, diff=3.266643s, valid=True
2026-05-30T05:54:15.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:54:15.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:54:15.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:54:12, diff=3.269488s, valid=True
2026-05-30T05:54:15.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:54:15.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T05:54:15.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:54:11, diff=4.276354s, valid=True
2026-05-30T05:54:15.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:54:15.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:54:15.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:54:15.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:54:15.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:54:15.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:54:15.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:54:12, diff=3.279392s, valid=True
2026-05-30T05:54:15.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:54:15.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:54:15.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:54:15.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045897.280062s, valid=True
2026-05-30T05:54:15.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:54:15.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:54:15.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:54:15.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:54:15.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:54:15.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:54:15.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:54:15.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:54:15.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:54:15.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:54:15.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:54:15.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:54:15.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:54:15.666 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:54:15.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:54:16.229 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:54:16.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:54:16.329 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:54:16.329 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:54:16.529 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:54:16.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:54:46.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:54:46.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:54:46.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:54:46.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:54:46.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:54:47.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:54:47.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-05-30T05:54:47.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:54:47.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-05-30T05:54:47.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:54:47.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:54:47.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:54:47.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-05-30T05:54:49.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-05-30T05:54:49.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:54:49.896 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:54:49.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:54:49.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:54:49.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:54:49.916 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:54:49.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:54:49.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:54:49.916 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:54:49.916 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:54:49.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:54:50.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:54:50.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:54:50.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:54:50.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:54:50.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:54:50.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:54:50.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:54:50.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:54:50.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:54:50.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:54:50.192 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:54:50.254 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:54:43
2026-05-30T05:54:50.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73912, datetime.datetime(2026, 5, 30, 5, 54, 43), datetime.datetime(2026, 5, 30, 5, 54, 42), 'salt', 10.95, 45.19, None, 17.11, 323.3, 11.41, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:54:50.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:54:50.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:54:50.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:54:42, diff=8.260573s, valid=True
2026-05-30T05:54:50.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:54:50.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:54:50.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:55:12, diff=-21.736544s, valid=True
2026-05-30T05:54:50.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:54:50.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:54:50.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:54:35, diff=15.270294s, valid=True
2026-05-30T05:54:50.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:54:50.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:54:50.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:54:50.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:54:50.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:54:50.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:54:50.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:55:12, diff=-21.72662s, valid=True
2026-05-30T05:54:50.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:54:50.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:54:50.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:54:50.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045932.274072s, valid=True
2026-05-30T05:54:50.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:54:50.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:54:50.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:54:50.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:54:50.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:54:50.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:54:50.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:54:50.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:54:50.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:54:50.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:54:50.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:54:50.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:54:50.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:54:50.599 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:54:50.809 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:54:51.152 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:54:51.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:54:51.252 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:54:51.252 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:54:51.549 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:54:51.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:55:21.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:55:21.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:55:21.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:55:22.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:55:22.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:55:22.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:55:22.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-05-30T05:55:22.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:55: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-05-30T05:55:22.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:55:22.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:55:22.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:55:22.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-05-30T05:55:35.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-05-30T05:55:35.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:55:35.497 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:55:35.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:55:35.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:55:35.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:55:35.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:55:35.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:55:35.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:55:35.522 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:55:35.523 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:55:35.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:55:35.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:55:35.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:55:35.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:55:35.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:55:35.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:55:35.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:55:35.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:55:35.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:55:35.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:55:35.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:55:35.844 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:55:35.906 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:55:13
2026-05-30T05:55:35.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73913, datetime.datetime(2026, 5, 30, 5, 55, 13), datetime.datetime(2026, 5, 30, 5, 55, 13), 'salt', 10.98, 44.49, None, 16.44, 348.27, 11.62, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:55:35.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:55:35.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:55:35.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:55:13, diff=22.913701s, valid=True
2026-05-30T05:55:35.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:55:35.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:55:35.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:55:12, diff=23.917106s, valid=True
2026-05-30T05:55:35.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:55:35.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:55:35.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:55:05, diff=30.925127s, valid=True
2026-05-30T05:55:35.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:55:35.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:55:35.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:55:35.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:55:35.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:55:35.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:55:35.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:55:12, diff=23.928776s, valid=True
2026-05-30T05:55:35.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:55:35.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:55:35.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:55:35.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1045977.929563s, valid=True
2026-05-30T05:55:35.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:55:35.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:55:35.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:55:35.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:55:35.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:55:35.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:55:35.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:55:35.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:55:36.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:55:36.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:55:36.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:55:36.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:55:36.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:55:36.325 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:55:36.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:55:36.890 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:55:36.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:55:36.993 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:55:36.993 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:55:37.200 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:55:37.200 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:56:07.203 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:56:07.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:56:07.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:56:07.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:56:07.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:56:07.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:56:07.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-05-30T05:56:07.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:56:07.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T05:56:07.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:56:07.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:56:07.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:56:07.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-05-30T05:56:11.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-05-30T05:56:11.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:56:11.174 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:56:11.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:56:11.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:56:11.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:56:11.198 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:56:11.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:56:11.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:56:11.199 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:56:11.199 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:56:11.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:56:11.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:56:11.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:56:11.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:56:11.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:56:11.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:56:11.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:56:11.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:56:11.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:56:11.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:56:11.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:56:11.513 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:56:11.575 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:55:43
2026-05-30T05:56:11.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73914, datetime.datetime(2026, 5, 30, 5, 55, 43), datetime.datetime(2026, 5, 30, 5, 55, 43), 'salt', 11.02, 44.76, None, 14.75, 331.51, 11.55, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:56:11.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:56:11.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:56:11.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:55:43, diff=28.582583s, valid=True
2026-05-30T05:56:11.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:56:11.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:56:11.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:56:12, diff=-0.413971s, valid=True
2026-05-30T05:56:11.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:56:11.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:56:11.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:55:35, diff=36.594141s, valid=True
2026-05-30T05:56:11.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:56:11.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:56:11.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:56:11.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:56:11.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:56:11.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:56:11.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:56:12, diff=-0.402188s, valid=True
2026-05-30T05:56:11.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:56:11.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:56:11.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:56:11.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046013.598632s, valid=True
2026-05-30T05:56:11.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:56:11.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:56:11.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:56:11.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:56:11.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:56:11.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:56:11.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:56:11.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:56:11.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:56:11.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:56:11.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:56:11.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:56:11.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:56:11.918 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:56:12.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:56:12.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:56:12.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:56:12.565 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:56:12.565 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:56:12.832 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:56:12.832 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:56:42.849 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:56:42.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:56:42.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:56:43.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:56:43.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:56:43.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:56: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-05-30T05:56:43.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:56:43.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-05-30T05:56:43.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:56:43.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:56:43.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:56:43.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T05:57:25.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-05-30T05:57:25.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:57:25.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:57:25.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:57:25.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:57:25.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:57:25.250 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:57:25.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:57:25.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:57:25.250 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:57:25.250 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:57:25.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:57:25.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:57:25.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:57:25.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:57:25.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:57:25.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:57:25.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:57:25.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:57:25.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:57:25.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:57:25.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:57:25.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:57:25.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:57:16
2026-05-30T05:57:25.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73917, datetime.datetime(2026, 5, 30, 5, 57, 16), datetime.datetime(2026, 5, 30, 5, 57, 15), 'salt', 10.98, 44.59, None, 14.75, 327.78, 11.59, 831.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:57:25.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:57:25.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:57:25.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:57:15, diff=10.623194s, valid=True
2026-05-30T05:57:25.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:57:25.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:57:25.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:57:12, diff=13.626579s, valid=True
2026-05-30T05:57:25.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:57:25.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:57:25.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:57:16, diff=9.634569s, valid=True
2026-05-30T05:57:25.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:57:25.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:57:25.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:57:25.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:57:25.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:57:25.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:57:25.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:57:12, diff=13.638209s, valid=True
2026-05-30T05:57:25.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:57:25.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:57:25.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:57:25.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046087.63904s, valid=True
2026-05-30T05:57:25.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:57:25.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:57:25.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:57:25.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:57:25.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:57:25.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:57:25.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:57:25.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:57:25.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:57:25.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:57:25.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:57:25.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:57:25.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:57:26.028 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:57:26.236 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:57:26.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:57:26.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:57:26.678 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:57:26.679 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:57:27.003 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:57:27.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:57:57.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:57:57.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:57:57.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:57:57.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:57:57.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:57:57.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:57:57.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-05-30T05:57:57.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:57:57.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-05-30T05:57:57.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:57:57.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:57:57.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:57:57.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-05-30T05:58:00.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T05:58:00.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:58:00.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:58:00.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:58:00.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:58:00.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:58:00.541 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:58:00.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:58:00.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:58:00.542 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:58:00.543 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:58:00.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:58:00.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:58:00.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:58:00.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:58:00.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:58:00.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:58:00.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:58:00.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:58:00.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:58:00.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:58:00.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:58:00.882 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:58:00.945 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:57:46
2026-05-30T05:58:00.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73918, datetime.datetime(2026, 5, 30, 5, 57, 46), datetime.datetime(2026, 5, 30, 5, 57, 46), 'salt', 11.02, 45.12, None, 11.4, 336.84, 11.44, 831.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:58:00.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:58:00.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:58:00.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:57:46, diff=14.952751s, valid=True
2026-05-30T05:58:00.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:58:00.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:58:00.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:58:12, diff=-11.043706s, valid=True
2026-05-30T05:58:00.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:58:00.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:58:00.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:57:46, diff=14.964753s, valid=True
2026-05-30T05:58:00.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:58:00.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:58:00.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:58:00.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:58:00.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:58:00.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:58:00.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:58:12, diff=-11.031502s, valid=True
2026-05-30T05:58:00.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:58:00.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:58:00.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:58:00.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046122.969351s, valid=True
2026-05-30T05:58:00.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:58:00.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:58:00.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:58:00.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:58:00.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:58:01.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:58:01.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:58:01.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:58:01.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:58:01.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:58:01.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:58:01.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:58:01.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:58:01.303 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:58:01.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:58:01.877 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:58:01.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:58:01.978 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:58:01.978 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:58:02.187 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:58:02.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:58:32.200 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:58:32.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:58:32.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:58:32.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:58:32.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:58:32.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:58:32.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-05-30T05:58:32.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:58:32.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T05:58:32.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:58:32.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:58:32.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:58:32.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-05-30T05:58:39.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-05-30T05:58:39.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:58:39.124 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:58:39.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:58:39.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:58:39.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:58:39.148 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:58:39.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:58:39.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:58:39.149 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:58:39.150 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:58:39.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:58:39.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:58:39.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:58:39.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:58:39.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:58:39.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:58:39.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:58:39.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:58:39.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:58:39.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:58:39.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:58:39.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:58:39.591 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:58:16
2026-05-30T05:58:39.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73919, datetime.datetime(2026, 5, 30, 5, 58, 16), datetime.datetime(2026, 5, 30, 5, 58, 16), 'salt', 11.11, 45.19, None, 13.52, 322.76, 11.42, 831.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:58:39.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:58:39.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:58:39.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:58:16, diff=23.597878s, valid=True
2026-05-30T05:58:39.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:58:39.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:58:39.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:58:12, diff=27.600836s, valid=True
2026-05-30T05:58:39.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:58:39.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:58:39.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:58:16, diff=23.607682s, valid=True
2026-05-30T05:58:39.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:58:39.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:58:39.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:58:39.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:58:39.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:58:39.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:58:39.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:58:12, diff=27.610879s, valid=True
2026-05-30T05:58:39.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:58:39.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:58:39.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:58:39.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046161.61169s, valid=True
2026-05-30T05:58:39.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:58:39.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:58:39.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:58:39.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:58:39.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:58:39.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:58:39.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:58:39.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:58:39.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:58:39.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:58:39.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:58:39.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:58:39.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:58:39.935 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:58:40.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:58:40.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:58:40.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:58:40.597 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:58:40.597 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:58:40.902 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:58:40.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:59:10.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:59:10.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:59:10.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:59:11.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:59:11.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:59:11.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:59:11.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-05-30T05:59:11.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:59:11.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-05-30T05:59:11.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:59:11.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:59:11.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:59:11.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-05-30T05:59:16.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-05-30T05:59:16.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:59:16.269 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:59:16.269 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:59:16.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:59:16.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:59:16.306 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:59:16.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:59:16.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:59:16.307 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:59:16.307 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:59:16.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:59:16.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:59:16.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:59:16.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:59:16.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:59:16.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:59:16.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:59:16.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:59:16.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:59:16.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:59:16.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:59:16.639 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:59:16.703 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:58:47
2026-05-30T05:59:16.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73920, datetime.datetime(2026, 5, 30, 5, 58, 47), datetime.datetime(2026, 5, 30, 5, 58, 46), 'salt', 11.05, 44.92, None, 12.25, 325.46, 11.5, 831.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:59:16.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:59:16.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:59:16.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:58:46, diff=30.7111s, valid=True
2026-05-30T05:59:16.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:59:16.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:59:16.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:59:12, diff=4.714571s, valid=True
2026-05-30T05:59:16.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:59:16.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:59:16.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:58:46, diff=30.722263s, valid=True
2026-05-30T05:59:16.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:59:16.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:59:16.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:59:16.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:59:16.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:59:16.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:59:16.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:59:12, diff=4.725613s, valid=True
2026-05-30T05:59:16.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:59:16.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:59:16.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:59:16.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046198.726326s, valid=True
2026-05-30T05:59:16.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:59:16.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:59:16.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:59:16.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:59:16.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:59:16.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:59:16.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:59:16.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:59:16.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:59:16.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:59:16.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:59:16.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:59:17.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:59:17.050 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:59:17.261 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:59:17.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:59:17.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:59:17.759 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:59:17.759 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:59:18.020 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:59:18.021 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T05:59:48.035 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T05:59:48.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T05:59:48.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T05:59:48.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T05:59:48.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T05:59:48.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T05:59:48.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-05-30T05:59:48.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T05:59:48.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-05-30T05:59:48.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T05:59:48.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T05:59:48.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T05:59:48.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-05-30T05:59:51.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-05-30T05:59:51.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T05:59:51.292 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T05:59:51.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T05:59:51.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T05:59:51.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T05:59:51.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T05:59:51.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T05:59:51.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T05:59:51.317 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T05:59:51.317 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T05:59:51.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T05:59:51.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T05:59:51.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T05:59:51.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T05:59:51.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:59:51.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:59:51.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T05:59:51.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T05:59:51.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T05:59:51.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T05:59:51.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T05:59:51.644 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T05:59:51.705 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 05:59:47
2026-05-30T05:59:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73922, datetime.datetime(2026, 5, 30, 5, 59, 47), datetime.datetime(2026, 5, 30, 5, 59, 47), 'salt', 11.05, 45.19, None, 14.96, 331.05, 11.42, 831.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T05:59:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T05:59:51.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T05:59:51.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:59:47, diff=4.712523s, valid=True
2026-05-30T05:59:51.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T05:59:51.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:59:51.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:00:12, diff=-20.284093s, valid=True
2026-05-30T05:59:51.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T05:59:51.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T05:59:51.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 05:59:47, diff=4.723993s, valid=True
2026-05-30T05:59:51.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T05:59:51.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:59:51.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T05:59:51.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T05:59:51.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T05:59:51.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T05:59:51.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:00:12, diff=-20.272407s, valid=True
2026-05-30T05:59:51.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T05:59:51.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T05:59:51.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T05:59:51.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046233.728384s, valid=True
2026-05-30T05:59:51.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T05:59:51.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T05:59:51.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T05:59:51.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T05:59:51.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T05:59:51.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T05:59:51.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T05:59:51.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T05:59:51.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T05:59:51.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T05:59:51.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T05:59:51.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T05:59:52.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T05:59:52.047 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T05:59:52.254 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:59:52.599 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T05:59:52.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T05:59:52.698 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T05:59:52.698 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T05:59:52.974 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T05:59:52.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:00:23.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:00:23.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:00:23.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:00:23.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:00:23.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:00:23.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:00:23.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-05-30T06:00:23.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:00:23.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-05-30T06:00:23.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:00:23.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:00:23.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:00:23.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-05-30T06:00:26.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-05-30T06:00:26.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:00:26.751 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:00:26.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:00:26.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:00:26.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:00:26.776 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:00:26.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:00:26.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:00:26.777 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:00:26.777 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:00:26.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:00:26.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:00:26.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:00:27.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:00:27.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:00:27.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:00:27.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:00:27.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:00:27.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:00:27.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:00:27.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:00:27.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:00:27.168 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:00:17
2026-05-30T06:00:27.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73923, datetime.datetime(2026, 5, 30, 6, 0, 17), datetime.datetime(2026, 5, 30, 6, 0, 17), 'salt', 10.98, 45.26, None, 12.39, 323.91, 11.39, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:00:27.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:00:27.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:00:27.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:00:17, diff=10.176476s, valid=True
2026-05-30T06:00:27.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:00:27.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:00:27.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:00:12, diff=15.180008s, valid=True
2026-05-30T06:00:27.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:00:27.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:00:27.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:00:17, diff=10.188348s, valid=True
2026-05-30T06:00:27.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:00:27.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:00:27.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:00:27.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:00:27.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:00:27.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:00:27.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:00:12, diff=15.192084s, valid=True
2026-05-30T06:00:27.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:00:27.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:00:27.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:00:27.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046269.192904s, valid=True
2026-05-30T06:00:27.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:00:27.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:00:27.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:00:27.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:00:27.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:00:27.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:00:27.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:00:27.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:00:27.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:00:27.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:00:27.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:00:27.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:00:27.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:00:27.512 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:00:27.792 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:00:28.131 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:00:28.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:00: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-05-30T06:00: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-05-30T06:00:28.472 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:00:28.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:00:58.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:00:58.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:00:58.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:00:58.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:00:58.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:00:59.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:00:59.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-05-30T06:00:59.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:00:59.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-05-30T06:00:59.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:00:59.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:00:59.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:00:59.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-05-30T06:01:01.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-05-30T06:01:01.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:01:01.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:01:01.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:01:01.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:01:01.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:01:01.665 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:01:01.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:01:01.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:01:01.667 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:01:01.667 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:01:01.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:01:01.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:01:01.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:01:01.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:01:01.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:01:01.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:01:01.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:01:01.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:01:01.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:01:01.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:01:01.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:01:01.977 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:01:02.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:00:48
2026-05-30T06:01:02.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73924, datetime.datetime(2026, 5, 30, 6, 0, 48), datetime.datetime(2026, 5, 30, 6, 0, 47), 'salt', 10.95, 45.22, None, 12.35, 322.9, 11.4, 831.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:01:02.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:01:02.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:01:02.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:00:47, diff=15.047819s, valid=True
2026-05-30T06:01:02.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:01:02.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:01:02.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:01:12, diff=-9.949282s, valid=True
2026-05-30T06:01:02.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:01:02.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:01:02.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:00:47, diff=15.057458s, valid=True
2026-05-30T06:01:02.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:01:02.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:01:02.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:01:02.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:01:02.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:01:02.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:01:02.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:01:12, diff=-9.939497s, valid=True
2026-05-30T06:01:02.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:01:02.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:01:02.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:01:02.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046304.061165s, valid=True
2026-05-30T06:01:02.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:01:02.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:01:02.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:01:02.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:01:02.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:01:02.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:01:02.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:01:02.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:01:02.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:01:02.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:01:02.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:01:02.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:01:02.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:01:02.377 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:01:02.585 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:01:02.925 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:01:03.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:01:03.025 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:01:03.025 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:01:03.292 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:01:03.292 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:01:33.309 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:01:33.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:01:33.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:01:33.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:01:33.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:01:34.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:01:34.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-05-30T06:01:34.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:01:34.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-05-30T06:01:34.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:01:34.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:01:34.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:01:34.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-05-30T06:01:36.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-05-30T06:01:36.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:01:36.343 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:01:36.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:01:36.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:01:36.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:01:36.368 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:01:36.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:01:36.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:01:36.369 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:01:36.369 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:01:36.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:01:36.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:01:36.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:01:36.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:01:36.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:01:36.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:01:36.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:01:36.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:01:36.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:01:36.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:01:36.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:01:36.705 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:01:36.769 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:01:18
2026-05-30T06:01:36.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73925, datetime.datetime(2026, 5, 30, 6, 1, 18), datetime.datetime(2026, 5, 30, 6, 1, 18), 'salt', 10.98, 45.36, None, 14.79, 332.03, 11.36, 831.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:01:36.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:01:36.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:01:36.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:01:18, diff=18.776704s, valid=True
2026-05-30T06:01:36.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:01:36.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:01:36.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:01:12, diff=24.780181s, valid=True
2026-05-30T06:01:36.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:01:36.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:01:36.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:01:18, diff=18.788256s, valid=True
2026-05-30T06:01:36.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:01:36.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:01:36.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:01:36.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:01:36.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:01:36.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:01:36.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:01:12, diff=24.792017s, valid=True
2026-05-30T06:01:36.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:01:36.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:01:36.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:01:36.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046338.792854s, valid=True
2026-05-30T06:01:36.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:01:36.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:01:36.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:01:36.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:01:36.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:01:36.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:01:36.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:01:36.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:01:36.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:01:36.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:01:36.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:01:37.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:01:37.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:01:37.182 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:01:37.389 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:01:37.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:01:37.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:01:37.830 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:01:37.830 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:01:38.029 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:01:38.029 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:02:08.059 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:02:08.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:02:08.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:02:08.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:02:08.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:02:08.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:02:08.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-05-30T06:02:08.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:02:08.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-05-30T06:02:08.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:02:08.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:02:08.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:02:08.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-05-30T06:02:40.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-05-30T06:02:40.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:02:40.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:02:40.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:02:40.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:02:40.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:02:40.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:02:40.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:02:40.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:02:40.320 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:02:40.320 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:02:40.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:02:40.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:02:40.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:02:40.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:02:40.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:02:40.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:02:40.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:02:40.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:02:40.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:02:40.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:02:40.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:02:40.650 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:02:40.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:02:18
2026-05-30T06:02:40.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73927, datetime.datetime(2026, 5, 30, 6, 2, 18), datetime.datetime(2026, 5, 30, 6, 2, 18), 'salt', 10.92, 45.52, None, 14.64, 335.67, 11.31, 831.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:02:40.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:02:40.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:02:40.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:02:18, diff=22.731774s, valid=True
2026-05-30T06:02:40.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:02:40.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:02:40.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:02:12, diff=28.735481s, valid=True
2026-05-30T06:02:40.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:02:40.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:02:40.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:02:18, diff=22.74413s, valid=True
2026-05-30T06:02:40.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:02:40.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:02:40.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:02:40.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:02:40.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:02:40.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:02:40.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:02:12, diff=28.74817s, valid=True
2026-05-30T06:02:40.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:02:40.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:02:40.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:02:40.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046402.74904s, valid=True
2026-05-30T06:02:40.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:02:40.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:02:40.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:02:40.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:02:40.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:02:40.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:02:40.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:02:40.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:02:40.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:02:40.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:02:40.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:02:40.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:02:41.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:02:41.072 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:02:41.280 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:02:41.622 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:02:41.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:02:41.721 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:02:41.722 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:02:41.915 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:02:41.915 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:03:11.916 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:03:11.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:03:11.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:03:12.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:03:12.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:03:12.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:03:12.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-05-30T06:03:12.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:03:12.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-05-30T06:03:12.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:03:12.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:03:12.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:03:12.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-05-30T06:03:15.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-05-30T06:03:15.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:03:15.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:03:15.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:03:15.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:03:15.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:03:15.619 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:03:15.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:03:15.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:03:15.621 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:03:15.621 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:03:15.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:03:15.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:03:15.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:03:15.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:03:15.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:03:15.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:03:15.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:03:15.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:03:15.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:03:15.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:03:15.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:03:15.944 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:03:16.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:02:49
2026-05-30T06:03:16.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73928, datetime.datetime(2026, 5, 30, 6, 2, 49), datetime.datetime(2026, 5, 30, 6, 2, 48), 'salt', 10.98, 45.49, None, 14.15, 326.89, 11.32, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:03:16.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:03:16.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:03:16.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:02:48, diff=28.010706s, valid=True
2026-05-30T06:03:16.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:03:16.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:03:16.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:03:12, diff=4.013539s, valid=True
2026-05-30T06:03:16.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:03:16.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:03:16.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:02:48, diff=28.020193s, valid=True
2026-05-30T06:03:16.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:03:16.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:03:16.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:03:16.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:03:16.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:03:16.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:03:16.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:03:12, diff=4.023236s, valid=True
2026-05-30T06:03:16.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:03:16.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:03:16.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:03:16.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046438.02389s, valid=True
2026-05-30T06:03:16.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:03:16.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:03:16.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:03:16.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:03:16.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:03:16.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:03:16.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:03:16.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:03:16.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:03:16.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:03:16.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:03:16.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:03:16.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:03:16.405 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:03:16.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:03:16.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:03:17.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:03:17.047 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:03:17.048 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:03:17.313 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:03:17.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:03:47.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:03:47.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:03:47.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:03:47.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:03:47.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:03:47.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:03:47.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-05-30T06:03:47.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:03:47.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-05-30T06:03:47.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:03:47.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:03:47.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:03:47.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-05-30T06:03:50.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T06:03:50.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:03:50.836 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:03:50.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:03:50.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:03:50.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:03:50.858 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:03:50.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:03:50.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:03:50.860 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:03:50.860 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:03:50.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:03:50.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T06:03:50.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:03:51.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:03:51.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:03:51.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:03:51.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:03:51.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:03:51.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:03:51.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:03:51.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:03:51.183 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:03:51.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:03:50
2026-05-30T06:03:51.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73930, datetime.datetime(2026, 5, 30, 6, 3, 50), datetime.datetime(2026, 5, 30, 6, 3, 50), 'salt', 10.95, 45.75, None, 14.75, 326.42, 11.24, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:03:51.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:03:51.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T06:03:51.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:03:50, diff=1.249384s, valid=True
2026-05-30T06:03:51.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:03:51.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:03:51.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:04:12, diff=-20.7478s, valid=True
2026-05-30T06:03:51.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:03:51.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:03:51.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:03:49, diff=2.258803s, valid=True
2026-05-30T06:03:51.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:03:51.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:03:51.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:03:51.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:03:51.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:03:51.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:03:51.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:04:12, diff=-20.738209s, valid=True
2026-05-30T06:03:51.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:03:51.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:03:51.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:03:51.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046473.262446s, valid=True
2026-05-30T06:03:51.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:03:51.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:03:51.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:03:51.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:03:51.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:03:51.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:03:51.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:03:51.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:03:51.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:03:51.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:03:51.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:03:51.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:03:51.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:03:51.578 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:03:51.787 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:03:52.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:03:52.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:03:52.230 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:03:52.230 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:03:52.429 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:03:52.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:04:22.460 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:04:22.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:04:22.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:04:22.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:04:22.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:04:22.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:04:22.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-05-30T06:04:22.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:04:22.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-05-30T06:04:22.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:04:22.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:04:22.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:04:22.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-05-30T06:04:26.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-05-30T06:04:26.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:04:26.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:04:26.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:04:26.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:04:26.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:04:26.690 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:04:26.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:04:26.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:04:26.691 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:04:26.692 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:04:26.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:04:26.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:04:26.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:04:26.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:04:26.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:04:27.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:04:27.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:04:27.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:04:27.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:04:27.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:04:27.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:04:27.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:04:27.161 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:04:20
2026-05-30T06:04:27.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73931, datetime.datetime(2026, 5, 30, 6, 4, 20), datetime.datetime(2026, 5, 30, 6, 4, 20), 'salt', 10.75, 45.79, None, 12.67, 331.26, 11.21, 831.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:04:27.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:04:27.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:04:27.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:04:20, diff=7.167795s, valid=True
2026-05-30T06:04:27.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:04:27.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:04:27.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:04:12, diff=15.170701s, valid=True
2026-05-30T06:04:27.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:04:27.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:04:27.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:04:19, diff=8.178913s, valid=True
2026-05-30T06:04:27.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:04:27.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:04:27.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:04:27.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:04:27.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:04:27.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:04:27.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:04:12, diff=15.182707s, valid=True
2026-05-30T06:04:27.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:04:27.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:04:27.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:04:27.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046509.183506s, valid=True
2026-05-30T06:04:27.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:04:27.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:04:27.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:04:27.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:04:27.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:04:27.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:04:27.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:04:27.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:04:27.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:04:27.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:04:27.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:04:27.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:04:27.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:04:27.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:04:27.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:04:28.118 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:04:28.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:04:28.220 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:04:28.220 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:04:28.414 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:04:28.414 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:04:58.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:04:58.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:04:58.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:04:58.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:04:58.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:04:58.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:04:58.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-05-30T06:04:58.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:04:58.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-05-30T06:04:58.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:04:58.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:04:58.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:04:58.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T06:05:02.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-05-30T06:05:02.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:05:02.119 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:05:02.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:05:02.131 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:05:02.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:05:02.144 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:05:02.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:05:02.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:05:02.145 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:05:02.145 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:05:02.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:05:02.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:05:02.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:05:02.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:05:02.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:05:02.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:05:02.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:05:02.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:05:02.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:05:02.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:05:02.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:05:02.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:05:02.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:04:51
2026-05-30T06:05:02.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73932, datetime.datetime(2026, 5, 30, 6, 4, 51), datetime.datetime(2026, 5, 30, 6, 4, 50), 'salt', 10.75, 46.02, None, 12.74, 326.75, 11.14, 831.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:05:02.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:05:02.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:05:02.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:04:50, diff=12.558191s, valid=True
2026-05-30T06:05:02.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:05:02.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:05:02.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:05:12, diff=-9.438147s, valid=True
2026-05-30T06:05:02.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:05:02.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:05:02.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:04:49, diff=13.57054s, valid=True
2026-05-30T06:05:02.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:05:02.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:05:02.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:05:02.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:05:02.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:05:02.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:05:02.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:05:12, diff=-9.425528s, valid=True
2026-05-30T06:05:02.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:05:02.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:05:02.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:05:02.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046544.575352s, valid=True
2026-05-30T06:05:02.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:05:02.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:05:02.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:05:02.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:05:02.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:05:02.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:05:02.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:05:02.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:05:02.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:05:02.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:05:02.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:05:02.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:05:02.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:05:02.896 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:05:03.102 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:05:03.441 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:05:03.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:05:03.541 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:05:03.541 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:05:03.743 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:05:03.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:05:33.745 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:05:33.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:05:33.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:05:34.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:05:34.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:05:34.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:05:34.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-05-30T06:05:34.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:05:34.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-05-30T06:05:34.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:05:34.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:05:34.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:05:34.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-05-30T06:06:08.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T06:06:08.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:06:08.123 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:06:08.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:06:08.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:06:08.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:06:08.147 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:06:08.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:06:08.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:06:08.148 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:06:08.148 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:06:08.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:06:08.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:06:08.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:06:08.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:06:08.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:06:08.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:06:08.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:06:08.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:06:08.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:06:08.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:06:08.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:06:08.470 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:06:08.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:05:51
2026-05-30T06:06:08.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73934, datetime.datetime(2026, 5, 30, 6, 5, 51), datetime.datetime(2026, 5, 30, 6, 5, 51), 'salt', 10.82, 46.09, None, 16.8, 333.84, 11.13, 831.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:06:08.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:06:08.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:06:08.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:05:51, diff=17.542971s, valid=True
2026-05-30T06:06:08.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:06:08.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:06:08.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:06:12, diff=-3.45349s, valid=True
2026-05-30T06:06:08.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:06:08.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:06:08.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:05:50, diff=18.554669s, valid=True
2026-05-30T06:06:08.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:06:08.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:06:08.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:06:08.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:06:08.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:06:08.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:06:08.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:06:12, diff=-3.441618s, valid=True
2026-05-30T06:06:08.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:06:08.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:06:08.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:06:08.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046610.559204s, valid=True
2026-05-30T06:06:08.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:06:08.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:06:08.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:06:08.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:06:08.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:06:08.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:06:08.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:06:08.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:06:08.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:06:08.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:06:08.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:06:08.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:06:08.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:06:08.884 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:06:09.099 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:06:09.443 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:06:09.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:06:09.544 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:06:09.544 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:06:09.797 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:06:09.797 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:06:39.826 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:06:39.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:06:39.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:06:40.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:06:40.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:06:40.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:06:40.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-05-30T06:06:40.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:06:40.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-05-30T06:06:40.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:06:40.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:06:40.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:06:40.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-05-30T06:07:10.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T06:07:10.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:07:10.498 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:07:10.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:07:10.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:07:10.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:07:10.522 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:07:10.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:07:10.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:07:10.523 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:07:10.523 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:07:10.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:07:10.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:07:10.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:07:10.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:07:10.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:07:10.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:07:10.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:07:10.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:07:10.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:07:10.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:07:10.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:07:10.846 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:07:10.908 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:06:52
2026-05-30T06:07:10.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73936, datetime.datetime(2026, 5, 30, 6, 6, 52), datetime.datetime(2026, 5, 30, 6, 6, 52), 'salt', 10.78, 45.89, None, 16.16, 326.4, 11.18, 831.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:07:10.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:07:10.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:07:10.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:06:52, diff=18.915468s, valid=True
2026-05-30T06:07:10.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:07:10.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:07:10.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:07:12, diff=-1.081068s, valid=True
2026-05-30T06:07:10.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:07:10.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:07:10.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:06:50, diff=20.92699s, valid=True
2026-05-30T06:07:10.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:07:10.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:07:10.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:07:10.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:07:10.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:07:10.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:07:10.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:07:12, diff=-1.06937s, valid=True
2026-05-30T06:07:10.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:07:10.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:07:10.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:07:10.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046672.931411s, valid=True
2026-05-30T06:07:10.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:07:10.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:07:10.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:07:10.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:07:10.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:07:10.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:07:10.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:07:10.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:07:11.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:07:11.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:07:11.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:07:11.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:07:11.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:07:11.251 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:07:11.458 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:07:11.800 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:07:11.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:07:11.957 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:07:11.957 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:07:12.208 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:07:12.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:07:42.238 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:07:42.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:07:42.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:07:42.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:07:42.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:07:42.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:07:42.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-05-30T06:07:42.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:07:42.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-05-30T06:07:42.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:07:42.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:07:42.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:07:42.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-05-30T06:07:45.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-05-30T06:07:45.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:07:45.301 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:07:45.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:07:45.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:07:45.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:07:45.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:07:45.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:07:45.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:07:45.325 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:07:45.325 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:07:45.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:07:45.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:07:45.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:07:45.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:07:45.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:07:45.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:07:45.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:07:45.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:07:45.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:07:45.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:07:45.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:07:45.646 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:07:45.708 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:07:22
2026-05-30T06:07:45.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73937, datetime.datetime(2026, 5, 30, 6, 7, 22), datetime.datetime(2026, 5, 30, 6, 7, 22), 'salt', 11.18, 45.99, None, 14.5, 338.79, 11.19, 831.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:07:45.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:07:45.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:07:45.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:07:22, diff=23.715902s, valid=True
2026-05-30T06:07:45.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:07:45.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:07:45.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:07:12, diff=33.719391s, valid=True
2026-05-30T06:07:45.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:07:45.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:07:45.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:07:20, diff=25.727915s, valid=True
2026-05-30T06:07:45.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:07:45.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:07:45.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:07:45.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:07:45.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:07:45.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:07:45.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:07:12, diff=33.731641s, valid=True
2026-05-30T06:07:45.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:07:45.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:07:45.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:07:45.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046707.732449s, valid=True
2026-05-30T06:07:45.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:07:45.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:07:45.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:07:45.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:07:45.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:07:45.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:07:45.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:07:45.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:07:45.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:07:45.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:07:45.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:07:45.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:07:46.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:07:46.062 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:07:46.279 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:07:46.635 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:07:46.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:07:46.737 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:07:46.737 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:07:46.989 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:07:46.989 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:08:16.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:08:16.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:08:16.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:08:17.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:08:17.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:08:17.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:08:17.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-05-30T06:08:17.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:08:17.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-05-30T06:08:17.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:08:17.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:08:17.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:08: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-05-30T06:08:20.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-05-30T06:08:20.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:08:20.120 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:08:20.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:08:20.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:08:20.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:08:20.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:08:20.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:08:20.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:08:20.143 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:08:20.143 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:08:20.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:08:20.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:08:20.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:08:20.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:08:20.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:08:20.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:08:20.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:08:20.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:08:20.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:08:20.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:08:20.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:08:20.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:08:20.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:07:53
2026-05-30T06:08:20.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73938, datetime.datetime(2026, 5, 30, 6, 7, 53), datetime.datetime(2026, 5, 30, 6, 7, 52), 'salt', 10.78, 46.09, None, 12.32, 338.89, 11.12, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:08:20.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:08:20.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:08:20.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:07:52, diff=28.517048s, valid=True
2026-05-30T06:08:20.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:08:20.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:08:20.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:08:12, diff=8.520428s, valid=True
2026-05-30T06:08:20.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:08:20.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:08:20.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:07:51, diff=29.528496s, valid=True
2026-05-30T06:08:20.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:08:20.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:08:20.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:08:20.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:08:20.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:08:20.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:08:20.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:08:12, diff=8.532144s, valid=True
2026-05-30T06:08:20.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:08:20.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:08:20.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:08:20.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046742.532978s, valid=True
2026-05-30T06:08:20.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:08:20.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:08:20.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:08:20.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:08:20.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:08:20.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:08:20.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:08:20.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:08:20.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:08:20.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:08:20.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:08:20.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:08:20.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:08:20.852 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:08:21.131 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:08:21.473 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:08:21.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:08:21.573 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:08:21.573 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:08:21.761 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:08:21.761 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:08:51.784 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:08:51.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:08:51.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:08:51.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:08:51.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:08:52.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:08:52.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T06:08:52.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:08:52.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-05-30T06:08:52.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:08:52.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:08:52.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:08:52.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-05-30T06:08:54.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-05-30T06:08:54.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:08:54.648 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:08:54.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:08:54.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:08:54.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:08:54.671 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:08:54.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:08:54.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:08:54.673 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:08:54.673 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:08:54.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:08:54.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T06:08:54.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:08:54.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T06:08:54.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:08:54.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:08:54.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:08:54.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:08:54.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:08:55.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:08:55.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:08:55.003 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:08:55.067 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:08:53
2026-05-30T06:08:55.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73940, datetime.datetime(2026, 5, 30, 6, 8, 53), datetime.datetime(2026, 5, 30, 6, 8, 53), 'salt', 10.75, 46.48, None, 12.74, 332.81, 11.0, 831.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:08:55.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:08:55.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T06:08:55.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:08:53, diff=2.075158s, valid=True
2026-05-30T06:08:55.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:08:55.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:08:55.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:09:12, diff=-16.921476s, valid=True
2026-05-30T06:08:55.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:08:55.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T06:08:55.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:08:52, diff=3.086664s, valid=True
2026-05-30T06:08:55.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:08:55.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:08:55.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:08:55.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:08:55.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:08:55.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:08:55.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:09:12, diff=-16.90962s, valid=True
2026-05-30T06:08:55.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:08:55.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:08:55.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:08:55.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046777.091192s, valid=True
2026-05-30T06:08:55.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:08:55.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:08:55.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:08:55.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:08:55.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:08:55.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:08:55.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:08:55.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:08:55.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:08:55.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:08:55.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:08:55.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:08:55.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:08:55.424 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:08:55.634 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:08:56.041 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:08:56.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:08:56.141 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:08:56.141 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:08:56.347 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:08:56.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:09:26.372 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:09:26.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:09:26.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:09:26.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:09:26.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:09:26.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:09: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-05-30T06:09:26.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:09:26.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-05-30T06:09:26.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:09:26.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:09:26.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:09:26.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-05-30T06:09:38.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-05-30T06:09:38.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:09:38.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:09:38.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:09:38.150 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:09:38.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:09:38.163 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:09:38.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:09:38.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:09:38.164 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:09:38.164 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:09:38.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:09:38.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:09:38.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:09:38.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:09:38.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:09:38.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:09:38.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:09:38.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:09:38.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:09:38.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:09:38.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:09:38.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:09:38.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:09:24
2026-05-30T06:09:38.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73941, datetime.datetime(2026, 5, 30, 6, 9, 24), datetime.datetime(2026, 5, 30, 6, 9, 23), 'salt', 10.72, 46.52, None, 14.12, 340.2, 10.99, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:09:38.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:09:38.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:09:38.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:09:23, diff=15.557308s, valid=True
2026-05-30T06:09:38.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:09:38.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:09:38.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:09:12, diff=26.560823s, valid=True
2026-05-30T06:09:38.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:09:38.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:09:38.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:09:23, diff=15.569128s, valid=True
2026-05-30T06:09:38.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:09:38.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:09:38.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:09:38.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:09:38.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:09:38.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:09:38.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:09:12, diff=26.572924s, valid=True
2026-05-30T06:09:38.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:09:38.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:09:38.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:09:38.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046820.573763s, valid=True
2026-05-30T06:09:38.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:09:38.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:09:38.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:09:38.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:09:38.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:09:38.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:09:38.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:09:38.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:09:38.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:09:38.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:09:38.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:09:38.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:09:38.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:09:38.964 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:09:39.170 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:09:39.510 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:09:39.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:09:39.610 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:09:39.610 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:09:39.820 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:09:39.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:10:09.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:10:09.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:10:09.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:10:10.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:10:10.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:10:10.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:10:10.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-05-30T06:10:10.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:10:10.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-05-30T06:10:10.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:10:10.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:10:10.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:10:10.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-05-30T06:10:12.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-05-30T06:10:12.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:10:12.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:10:12.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:10:12.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:10:12.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:10:12.968 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:10:12.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:10:12.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:10:12.970 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:10:12.970 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:10:12.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:10:13.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:10:13.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:10:13.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:10:13.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:10:13.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:10:13.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:10:13.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:10:13.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:10:13.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:10:13.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:10:13.289 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:10:13.350 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:09:54
2026-05-30T06:10:13.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73942, datetime.datetime(2026, 5, 30, 6, 9, 54), datetime.datetime(2026, 5, 30, 6, 9, 53), 'salt', 10.65, 46.65, None, 7.73, 335.9, 10.94, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:10:13.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:10:13.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:10:13.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:09:53, diff=20.358202s, valid=True
2026-05-30T06:10:13.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:10:13.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:10:13.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:10:12, diff=1.361597s, valid=True
2026-05-30T06:10:13.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:10:13.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:10:13.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:09:52, diff=21.369574s, valid=True
2026-05-30T06:10:13.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:10:13.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:10:13.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:10:13.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:10:13.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:10:13.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:10:13.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:10:12, diff=1.37325s, valid=True
2026-05-30T06:10:13.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:10:13.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:10:13.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:10:13.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046855.374078s, valid=True
2026-05-30T06:10:13.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:10:13.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:10:13.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:10:13.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:10:13.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:10:13.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:10:13.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:10:13.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:10:13.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:10:13.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:10:13.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:10:13.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:10:13.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:10:13.699 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:10:13.905 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:10:14.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:10:14.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:10:14.343 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:10:14.343 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:10:14.545 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:10:14.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:10:44.576 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:10:44.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:10:44.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:10:44.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:10:44.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:10:45.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:10:45.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-05-30T06:10:45.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:10:45.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-05-30T06:10:45.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:10:45.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:10:45.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:10:45.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-05-30T06:11:29.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-05-30T06:11:29.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:11:29.442 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:11:29.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:11:29.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:11:29.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:11:29.465 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:11:29.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:11:29.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:11:29.466 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:11:29.467 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:11:29.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:11:29.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:11:29.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:11:29.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:11:29.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:11:29.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:11:29.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:11:29.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:11:29.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:11:29.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:11:29.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:11:29.814 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:11:29.906 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:11:25
2026-05-30T06:11:29.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73945, datetime.datetime(2026, 5, 30, 6, 11, 25), datetime.datetime(2026, 5, 30, 6, 11, 24), 'salt', 10.58, 46.72, None, 13.34, 354.94, 10.92, 831.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:11:29.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:11:29.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:11:29.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:11:24, diff=5.913456s, valid=True
2026-05-30T06:11:29.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:11:29.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:11:29.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:11:12, diff=17.916547s, valid=True
2026-05-30T06:11:29.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:11:29.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:11:29.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:11:22, diff=7.923944s, valid=True
2026-05-30T06:11:29.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:11:29.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:11:29.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:11:29.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:11:29.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:11:29.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:11:29.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:11:12, diff=17.927275s, valid=True
2026-05-30T06:11:29.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:11:29.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:11:29.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:11:29.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046931.927956s, valid=True
2026-05-30T06:11:29.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:11:29.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:11:29.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:11:29.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:11:29.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:11:29.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:11:29.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:11:29.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:11:30.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:11:30.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:11:30.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:11:30.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:11:30.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:11:30.320 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:11:30.528 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:11:30.870 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:11:30.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:11:30.971 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:11:30.971 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:11:31.178 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:11:31.178 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:12:01.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:12:01.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:12:01.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:12:01.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:12:01.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:12:01.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:12:01.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-05-30T06:12:01.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:12:01.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-05-30T06:12:01.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:12:01.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:12:01.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:12:01.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T06:12:24.569 [ERROR] [MainThread] [fetch_web_files.py] [fetch_images()] Error [fetch_web_files.py] processing LCO all-sky image: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
2026-05-30T06:12:24.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:12:24.570 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:12:24.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:12:24.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:12:24.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:12:24.596 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:12:24.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:12:24.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:12:24.598 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:12:24.598 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:12:24.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:12:24.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:12:24.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:12:24.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:12:24.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:12:24.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:12:24.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:12:24.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:12:24.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:12:24.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:12:24.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:12:24.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:12:24.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:11:55
2026-05-30T06:12:24.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73946, datetime.datetime(2026, 5, 30, 6, 11, 55), datetime.datetime(2026, 5, 30, 6, 11, 54), 'salt', 10.68, 46.45, None, 13.55, 335.98, 11.0, 831.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:12:24.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:12:24.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:12:24.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:11:54, diff=30.996669s, valid=True
2026-05-30T06:12:24.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:12:24.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:12:25.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:12:12, diff=13.000148s, valid=True
2026-05-30T06:12:25.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:12:25.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:12:25.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:11:53, diff=32.00839s, valid=True
2026-05-30T06:12:25.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:12:25.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:12:25.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:12:25.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:12:25.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:12:25.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:12:25.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:12:12, diff=13.012092s, valid=True
2026-05-30T06:12:25.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:12:25.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:12:25.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:12:25.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1046987.012904s, valid=True
2026-05-30T06:12:25.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:12:25.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:12:25.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:12:25.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:12:25.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:12:25.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:12:25.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:12:25.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:12:25.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:12:25.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:12:25.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:12:25.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:12:25.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:12:25.334 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:12:25.541 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:12:25.881 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:12:25.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:12:25.981 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:12:25.981 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:12:26.230 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:12:26.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:12:56.255 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:12:56.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:12:56.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:12:56.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:12:56.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:12:56.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:12:56.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-05-30T06:12:56.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:12:56.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-05-30T06:12:56.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:12:56.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:12:56.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:12:56.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-05-30T06:12:59.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T06:12:59.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:12:59.146 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:12:59.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:12:59.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:12:59.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:12:59.171 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:12:59.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:12:59.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:12:59.172 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:12:59.172 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:12:59.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:12:59.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:12:59.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:12:59.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:12:59.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:12:59.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:12:59.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:12:59.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:12:59.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:12:59.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:12:59.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:12:59.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:12:59.562 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:12:55
2026-05-30T06:12:59.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73948, datetime.datetime(2026, 5, 30, 6, 12, 55), datetime.datetime(2026, 5, 30, 6, 12, 55), 'salt', 10.82, 46.38, None, 11.65, 330.91, 11.04, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:12:59.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:12:59.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:12:59.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:12:55, diff=4.569901s, valid=True
2026-05-30T06:12:59.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:12:59.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:12:59.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:13:12, diff=-12.426597s, valid=True
2026-05-30T06:12:59.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:12:59.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:12:59.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:12:53, diff=6.581481s, valid=True
2026-05-30T06:12:59.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:12:59.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:12:59.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:12:59.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:12:59.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:12:59.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:12:59.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:13:12, diff=-12.414727s, valid=True
2026-05-30T06:12:59.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:12:59.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:12:59.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:12:59.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047021.586098s, valid=True
2026-05-30T06:12:59.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:12:59.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:12:59.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:12:59.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:12:59.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:12:59.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:12:59.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:12:59.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:12:59.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:12:59.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:12:59.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:12:59.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:12:59.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:12:59.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:13:00.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:13:00.570 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:13:00.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:13:00.669 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:13:00.669 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:13:00.926 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:13:00.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:13:30.956 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:13:30.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:13:30.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:13:31.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:13:31.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:13:31.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:13:31.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-05-30T06:13:31.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:13:31.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-05-30T06:13:31.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:13:31.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:13:31.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:13:31.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-05-30T06:14:04.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-05-30T06:14:04.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:14:04.973 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:14:04.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:14:04.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:14:04.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:14:04.999 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:14:04.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:14:05.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:14:05.000 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:14:05.000 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:14:05.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:14:05.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:14:05.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:14:05.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:14:05.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:14:05.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:14:05.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:14:05.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:14:05.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:14:05.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:14:05.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:14:05.308 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:14:05.373 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:13:56
2026-05-30T06:14:05.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73950, datetime.datetime(2026, 5, 30, 6, 13, 56), datetime.datetime(2026, 5, 30, 6, 13, 55), 'salt', 10.82, 46.18, None, 13.9, 320.32, 11.1, 831.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:14:05.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:14:05.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:14:05.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:13:55, diff=10.38004s, valid=True
2026-05-30T06:14:05.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:14:05.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:14:05.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:14:12, diff=-6.616988s, valid=True
2026-05-30T06:14:05.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:14:05.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:14:05.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:13:54, diff=11.390087s, valid=True
2026-05-30T06:14:05.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:14:05.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:14:05.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:14:05.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:14:05.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:14:05.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:14:05.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:14:12, diff=-6.60622s, valid=True
2026-05-30T06:14:05.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:14:05.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:14:05.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:14:05.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047087.394557s, valid=True
2026-05-30T06:14:05.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:14:05.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:14:05.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:14:05.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:14:05.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:14:05.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:14:05.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:14:05.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:14:05.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:14:05.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:14:05.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:14:05.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:14:05.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:14:05.746 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:14:05.953 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:14:06.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:14:06.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:14:06.392 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:14:06.392 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:14:06.582 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:14:06.583 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:14:36.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:14:36.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:14:36.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:14:37.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:14:37.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:14:37.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:14:37.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-05-30T06:14:37.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:14:37.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T06:14:37.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:14:37.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:14:37.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:14:37.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-05-30T06:14:39.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-05-30T06:14:39.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:14:39.783 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:14:39.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:14:39.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:14:39.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:14:39.810 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:14:39.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:14:39.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:14:39.811 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:14:39.811 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:14:39.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:14:39.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:14:39.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:14:40.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:14:40.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:14:40.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:14:40.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:14:40.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:14:40.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:14:40.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:14:40.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:14:40.156 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:14:40.220 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:14:26
2026-05-30T06:14:40.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73951, datetime.datetime(2026, 5, 30, 6, 14, 26), datetime.datetime(2026, 5, 30, 6, 14, 26), 'salt', 10.88, 46.42, None, 13.9, 342.55, 11.03, 831.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:14:40.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:14:40.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:14:40.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:14:26, diff=14.226608s, valid=True
2026-05-30T06:14:40.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:14:40.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:14:40.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:14:12, diff=28.229497s, valid=True
2026-05-30T06:14:40.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:14:40.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:14:40.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:14:24, diff=16.236203s, valid=True
2026-05-30T06:14:40.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:14:40.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:14:40.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:14:40.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:14:40.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:14:40.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:14:40.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:14:12, diff=28.239236s, valid=True
2026-05-30T06:14:40.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:14:40.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:14:40.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:14:40.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047122.239903s, valid=True
2026-05-30T06:14:40.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:14:40.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:14:40.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:14:40.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:14:40.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:14:40.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:14:40.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:14:40.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:14:40.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:14:40.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:14:40.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:14:40.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:14:40.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:14:40.552 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:14:40.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:14:41.103 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:14:41.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:14:41.204 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:14:41.205 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:14:41.497 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:14:41.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:15:11.527 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:15:11.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:15:11.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:15:11.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:15:11.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:15:12.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:15:12.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-05-30T06:15:12.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:15:12.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-05-30T06:15:12.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:15:12.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:15:12.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:15:12.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-05-30T06:15:14.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T06:15:14.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:15:14.628 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:15:14.628 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:15:14.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:15:14.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:15:14.652 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:15:14.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:15:14.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:15:14.653 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:15:14.653 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:15:14.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:15:14.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:15:14.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:15:14.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:15:14.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:15:14.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:15:14.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:15:14.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:15:14.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:15:14.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:15:14.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:15:14.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:15:15.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:14:56
2026-05-30T06:15:15.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73952, datetime.datetime(2026, 5, 30, 6, 14, 56), datetime.datetime(2026, 5, 30, 6, 14, 56), 'salt', 10.75, 46.15, None, 15.77, 320.14, 11.1, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:15:15.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:15:15.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:15:15.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:14:56, diff=19.065573s, valid=True
2026-05-30T06:15:15.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:15:15.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:15:15.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:15:12, diff=3.069074s, valid=True
2026-05-30T06:15:15.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:15:15.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:15:15.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:14:54, diff=21.077281s, valid=True
2026-05-30T06:15:15.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:15:15.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:15:15.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:15:15.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:15:15.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:15:15.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:15:15.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:15:12, diff=3.081044s, valid=True
2026-05-30T06:15:15.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:15:15.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:15:15.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:15:15.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047157.081864s, valid=True
2026-05-30T06:15:15.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:15:15.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:15:15.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:15:15.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:15:15.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:15:15.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:15:15.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:15:15.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:15:15.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:15:15.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:15:15.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:15:15.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:15:15.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:15:15.403 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:15:15.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:15:15.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:15:16.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:15:16.102 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:15:16.102 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:15:16.308 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:15:16.308 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:15:46.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:15:46.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:15:46.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:15:46.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:15:46.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:15:47.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:15:47.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T06:15:47.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:15:47.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-05-30T06:15:47.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:15:47.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:15:47.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:15:47.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-05-30T06:15:49.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-05-30T06:15:49.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:15:49.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:15:49.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:15:49.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:15:49.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:15:49.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:15:49.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:15:49.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:15:49.544 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:15:49.544 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:15:49.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:15:49.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:15:49.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:15:49.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:15:49.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:15:49.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:15:49.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:15:49.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:15:49.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:15:49.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:15:49.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:15:49.881 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:15:49.954 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:15:26
2026-05-30T06:15:49.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73953, datetime.datetime(2026, 5, 30, 6, 15, 26), datetime.datetime(2026, 5, 30, 6, 15, 26), 'salt', 10.82, 46.45, None, 16.97, 332.72, 11.02, 831.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:15:49.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:15:49.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:15:49.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:15:26, diff=23.960926s, valid=True
2026-05-30T06:15:49.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:15:49.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:15:49.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:15:12, diff=37.964399s, valid=True
2026-05-30T06:15:49.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:15:49.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:15:49.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:15:24, diff=25.972315s, valid=True
2026-05-30T06:15:49.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:15:49.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:15:49.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:15:49.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:15:49.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:15:49.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:15:49.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:15:12, diff=37.976198s, valid=True
2026-05-30T06:15:49.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:15:49.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:15:49.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:15:49.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047191.976918s, valid=True
2026-05-30T06:15:49.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:15:49.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:15:49.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:15:49.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:15:49.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:15:50.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:15:50.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:15:50.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:15:50.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:15:50.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:15:50.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:15:50.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:15:50.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:15:50.385 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:15:50.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:15:50.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:15:51.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:15:51.036 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:15:51.036 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:15:51.237 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:15:51.237 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:16:21.265 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:16:21.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:16:21.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:16:21.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:16:21.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:16:21.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:16:21.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-05-30T06:16:21.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:16:21.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-05-30T06:16:21.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:16:21.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:16:21.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:16:21.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-05-30T06:16:24.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-05-30T06:16:24.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:16:24.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:16:24.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:16:24.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:16:24.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:16:24.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:16:24.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:16:24.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:16:24.253 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:16:24.253 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:16:24.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:16:24.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:16:24.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:16:24.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:16:24.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:16:24.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:16:24.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:16:24.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:16:24.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:16:24.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:16:24.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:16:24.577 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:16:24.637 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:15:57
2026-05-30T06:16:24.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73954, datetime.datetime(2026, 5, 30, 6, 15, 57), datetime.datetime(2026, 5, 30, 6, 15, 56), 'salt', 10.68, 46.35, None, 15.0, 329.85, 11.03, 831.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:16:24.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:16:24.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:16:24.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:15:56, diff=28.643386s, valid=True
2026-05-30T06:16:24.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:16:24.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:16:24.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:16:12, diff=12.646514s, valid=True
2026-05-30T06:16:24.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:16:24.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:16:24.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:15:54, diff=30.654414s, valid=True
2026-05-30T06:16:24.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:16:24.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:16:24.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:16:24.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:16:24.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:16:24.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:16:24.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:16:12, diff=12.658065s, valid=True
2026-05-30T06:16:24.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:16:24.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:16:24.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:16:24.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047226.658856s, valid=True
2026-05-30T06:16:24.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:16:24.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:16:24.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:16:24.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:16:24.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:16:24.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:16:24.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:16:24.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:16:24.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:16:24.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:16:24.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:16:24.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:16:24.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:16:24.998 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:16:25.281 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:16:25.622 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:16:25.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:16:25.722 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:16:25.722 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:16:26.107 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:16:26.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:16:56.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:16:56.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:16:56.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:16:56.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:16:56.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:16:56.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:16:56.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-05-30T06:16:56.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:16:56.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-05-30T06:16:56.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:16:56.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:16:56.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:16:56.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-05-30T06:17:00.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-05-30T06:17:00.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:17:00.451 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:17:00.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:17:00.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:17:00.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:17:00.474 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:17:00.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:17:00.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:17:00.475 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:17:00.475 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:17:00.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:17:00.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:17:00.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:17:00.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:17:00.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:17:00.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:17:00.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:17:00.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:17:00.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:17:00.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:17:00.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:17:00.819 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:17:00.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:16:57
2026-05-30T06:17:00.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73956, datetime.datetime(2026, 5, 30, 6, 16, 57), datetime.datetime(2026, 5, 30, 6, 16, 57), 'salt', 10.78, 46.45, None, 14.93, 322.34, 11.01, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:17:00.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:17:00.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:17:00.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:16:57, diff=3.89906s, valid=True
2026-05-30T06:17:00.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:17:00.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:17:00.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:17:12, diff=-11.097222s, valid=True
2026-05-30T06:17:00.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:17:00.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:17:00.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:16:55, diff=5.911524s, valid=True
2026-05-30T06:17:00.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:17:00.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:17:00.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:17:00.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:17:00.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:17:00.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:17:00.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:17:12, diff=-11.084574s, valid=True
2026-05-30T06:17:00.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:17:00.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:17:00.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:17:00.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047262.916284s, valid=True
2026-05-30T06:17:00.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:17:00.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:17:00.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:17:00.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:17:00.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:17:00.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:17:00.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:17:00.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:17:01.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:17:01.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:17:01.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:17:01.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:17:01.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:17:01.239 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:17:01.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:17:01.799 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:17:01.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:17:01.923 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:17:01.923 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:17:02.131 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:17:02.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:17:32.151 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:17:32.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:17:32.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:17:32.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:17:32.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:17:32.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:17:32.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-05-30T06:17:32.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:17:32.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-05-30T06:17:32.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:17:32.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:17:32.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:17:32.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-05-30T06:17:36.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-05-30T06:17:36.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:17:36.139 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:17:36.139 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:17:36.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:17:36.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:17:36.161 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:17:36.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:17:36.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:17:36.162 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:17:36.163 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:17:36.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:17:36.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:17:36.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:17:36.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:17:36.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:17:36.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:17:36.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:17:36.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:17:36.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:17:36.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:17:36.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:17:36.489 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:17:36.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:17:27
2026-05-30T06:17:36.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73957, datetime.datetime(2026, 5, 30, 6, 17, 27), datetime.datetime(2026, 5, 30, 6, 17, 27), 'salt', 10.85, 46.22, None, 18.35, 321.12, 11.09, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:17:36.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:17:36.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:17:36.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:17:27, diff=9.557465s, valid=True
2026-05-30T06:17:36.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:17:36.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:17:36.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:17:12, diff=24.56044s, valid=True
2026-05-30T06:17:36.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:17:36.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:17:36.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:17:25, diff=11.567195s, valid=True
2026-05-30T06:17:36.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:17:36.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:17:36.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:17:36.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:17:36.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:17:36.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:17:36.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:17:12, diff=24.570254s, valid=True
2026-05-30T06:17:36.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:17:36.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:17:36.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:17:36.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047298.570927s, valid=True
2026-05-30T06:17:36.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:17:36.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:17:36.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:17:36.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:17:36.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:17:36.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:17:36.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:17:36.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:17:36.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:17:36.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:17:36.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:17:36.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:17:36.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:17:36.954 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:17:37.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:17:37.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:17:37.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:17:37.600 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:17:37.600 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:17:37.810 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:17:37.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:18:07.811 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:18:07.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:18:07.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:18:08.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:18:08.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:18:08.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:18:08.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-05-30T06:18:08.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:18:08.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-05-30T06:18:08.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:18:08.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:18:08.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:18: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-05-30T06:18:46.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-05-30T06:18:46.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:18:46.466 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:18:46.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:18:46.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:18:46.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:18:46.489 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:18:46.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:18:46.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:18:46.490 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:18:46.490 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:18:46.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:18:46.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:18:46.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:18:46.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:18:46.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:18:46.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:18:46.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:18:46.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:18:46.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:18:46.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:18:46.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:18:46.820 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:18:46.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:18:28
2026-05-30T06:18:46.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73959, datetime.datetime(2026, 5, 30, 6, 18, 28), datetime.datetime(2026, 5, 30, 6, 18, 28), 'salt', 10.92, 46.28, None, 15.63, 317.39, 11.08, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:18:46.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:18:46.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:18:46.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:18:28, diff=18.890652s, valid=True
2026-05-30T06:18:46.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:18:46.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:18:46.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:18:12, diff=34.894048s, valid=True
2026-05-30T06:18:46.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:18:46.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:18:46.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:18:26, diff=20.902027s, valid=True
2026-05-30T06:18:46.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:18:46.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:18:46.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:18:46.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:18:46.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:18:46.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:18:46.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:18:12, diff=34.905703s, valid=True
2026-05-30T06:18:46.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:18:46.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:18:46.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:18:46.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047368.906477s, valid=True
2026-05-30T06:18:46.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:18:46.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:18:46.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:18:46.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:18:46.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:18:46.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:18:46.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:18:46.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:18:46.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:18:47.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:18:47.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:18:47.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:18:47.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:18:47.228 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:18:47.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:18:47.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:18:47.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:18:47.881 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:18:47.881 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:18:48.089 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:18:48.089 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:19:18.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:19:18.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:19:18.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:19:18.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:19:18.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:19:18.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:19:18.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-05-30T06:19:18.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:19:18.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-05-30T06:19:18.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:19:18.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:19:18.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:19:18.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-05-30T06:19:33.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-05-30T06:19:33.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:19:33.677 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:19:33.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:19:33.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:19:33.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:19:33.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:19:33.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:19:33.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:19:33.699 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:19:33.699 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:19:33.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:19:33.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:19:33.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:19:33.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:19:33.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:19:33.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:19:33.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:19:34.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:19:34.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:19:34.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:19:34.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:19:34.012 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:19:34.079 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:19:28
2026-05-30T06:19:34.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73961, datetime.datetime(2026, 5, 30, 6, 19, 28), datetime.datetime(2026, 5, 30, 6, 19, 28), 'salt', 10.98, 45.89, None, 16.37, 323.7, 11.2, 831.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:19:34.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:19:34.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:19:34.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:19:28, diff=6.086256s, valid=True
2026-05-30T06:19:34.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:19:34.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:19:34.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:19:12, diff=22.089683s, valid=True
2026-05-30T06:19:34.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:19:34.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:19:34.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:19:26, diff=8.097809s, valid=True
2026-05-30T06:19:34.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:19:34.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:19:34.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:19:34.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:19:34.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:19:34.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:19:34.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:19:12, diff=22.101449s, valid=True
2026-05-30T06:19:34.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:19:34.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:19:34.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:19:34.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047416.102266s, valid=True
2026-05-30T06:19:34.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:19:34.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:19:34.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:19:34.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:19:34.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:19:34.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:19:34.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:19:34.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:19:34.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:19:34.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:19:34.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:19:34.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:19:34.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:19:34.486 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:19:34.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:19:35.033 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:19:35.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:19: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-05-30T06:19: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-05-30T06:19:35.377 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:19:35.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:20:05.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:20:05.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:20:05.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:20:05.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:20:05.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:20:06.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:20:06.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-05-30T06:20:06.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:20:06.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-05-30T06:20:06.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:20:06.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:20:06.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:20:06.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-05-30T06:20:10.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-05-30T06:20:10.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:20:10.479 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:20:10.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:20:10.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:20:10.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:20:10.503 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:20:10.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:20:10.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:20:10.504 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:20:10.504 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:20:10.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:20:10.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:20:10.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:20:10.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:20:10.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:20:10.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:20:10.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:20:10.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:20:10.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:20:10.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:20:10.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:20:10.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:20:10.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:19:59
2026-05-30T06:20:10.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73962, datetime.datetime(2026, 5, 30, 6, 19, 59), datetime.datetime(2026, 5, 30, 6, 19, 58), 'salt', 11.02, 45.75, None, 16.09, 322.69, 11.25, 831.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:20:10.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:20:10.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:20:10.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:19:58, diff=12.897239s, valid=True
2026-05-30T06:20:10.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:20:10.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:20:10.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:20:12, diff=-1.099085s, valid=True
2026-05-30T06:20:10.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:20:10.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:20:10.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:19:56, diff=14.909526s, valid=True
2026-05-30T06:20:10.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:20:10.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:20:10.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:20:10.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:20:10.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:20:10.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:20:10.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:20:12, diff=-1.08655s, valid=True
2026-05-30T06:20:10.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:20:10.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:20:10.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:20:10.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047452.914308s, valid=True
2026-05-30T06:20:10.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:20:10.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:20:10.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:20:10.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:20:10.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:20:10.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:20:10.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:20:10.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:20:10.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:20:11.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:20:11.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:20:11.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:20:11.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:20:11.236 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:20:11.444 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:20:11.785 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:20:11.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:20:11.885 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:20:11.885 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:20:12.096 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:20:12.096 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:20:42.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:20:42.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:20:42.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:20:42.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:20:42.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:20:42.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:20:42.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-05-30T06:20:42.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:20:42.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-05-30T06:20:42.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:20:42.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:20:42.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:20:42.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-05-30T06:20:49.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-05-30T06:20:49.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:20:49.675 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:20:49.675 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:20:49.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:20:49.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:20:49.697 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:20:49.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:20:49.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:20:49.699 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:20:49.699 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:20:49.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:20:49.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:20:49.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:20:49.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:20:49.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:20:49.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:20:49.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:20:50.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:20:50.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:20:50.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:20:50.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:20:50.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:20:50.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:20:29
2026-05-30T06:20:50.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73963, datetime.datetime(2026, 5, 30, 6, 20, 29), datetime.datetime(2026, 5, 30, 6, 20, 29), 'salt', 11.02, 45.52, None, 15.81, 321.78, 11.32, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:20:50.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:20:50.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:20:50.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:20:29, diff=21.088519s, valid=True
2026-05-30T06:20:50.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:20:50.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:20:50.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:20:12, diff=38.091436s, valid=True
2026-05-30T06:20:50.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:20:50.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:20:50.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:20:26, diff=24.09892s, valid=True
2026-05-30T06:20:50.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:20:50.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:20:50.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:20:50.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:20:50.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:20:50.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:20:50.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:20:12, diff=38.102419s, valid=True
2026-05-30T06:20:50.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:20:50.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:20:50.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:20:50.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047492.103171s, valid=True
2026-05-30T06:20:50.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:20:50.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:20:50.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:20:50.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:20:50.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:20:50.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:20:50.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:20:50.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:20:50.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:20:50.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:20:50.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:20:50.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:20:50.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:20:50.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:20:50.711 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:20:51.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:20:51.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:20: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-05-30T06:20: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-05-30T06:20:51.416 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:20:51.416 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:21:21.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:21:21.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:21:21.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:21:21.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:21:21.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:21:21.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:21:21.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-05-30T06:21:22.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:21:22.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-05-30T06:21:22.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:21:22.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:21:22.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:21:22.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-05-30T06:21:24.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-05-30T06:21:24.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:21:24.399 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:21:24.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:21:24.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:21:24.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:21:24.423 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:21:24.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:21:24.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:21:24.424 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:21:24.424 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:21:24.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:21:24.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:21:24.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:21:24.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:21:24.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:21:24.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:21:24.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:21:24.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:21:24.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:21:24.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:21:24.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:21:24.746 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:21:24.814 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:20:59
2026-05-30T06:21:24.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73964, datetime.datetime(2026, 5, 30, 6, 20, 59), datetime.datetime(2026, 5, 30, 6, 20, 59), 'salt', 11.12, 45.49, None, 18.07, 321.45, 11.34, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:21:24.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:21:24.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:21:24.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:20:59, diff=25.821541s, valid=True
2026-05-30T06:21:24.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:21:24.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:21:24.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:21:12, diff=12.825093s, valid=True
2026-05-30T06:21:24.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:21:24.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:21:24.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:20:57, diff=27.833477s, valid=True
2026-05-30T06:21:24.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:21:24.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:21:24.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:21:24.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:21:24.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:21:24.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:21:24.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:21:12, diff=12.837299s, valid=True
2026-05-30T06:21:24.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:21:24.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:21:24.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:21:24.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047526.838134s, valid=True
2026-05-30T06:21:24.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:21:24.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:21:24.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:21:24.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:21:24.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:21:24.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:21:24.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:21:24.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:21:24.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:21:24.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:21:25.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:21:25.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:21:25.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:21:25.163 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:21:25.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:21:25.718 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:21:25.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:21:25.819 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:21:25.820 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:21:28.339 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:21:28.339 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:21:58.342 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:21:58.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:21:58.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:21:58.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:21:58.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:21:58.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:21:58.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-05-30T06:21:58.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:21:58.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-05-30T06:21:58.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:21:58.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:21:58.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:21:58.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-05-30T06:22:01.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-05-30T06:22:01.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:22:01.801 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:22:01.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:22:01.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:22:01.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:22:01.825 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:22:01.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:22:01.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:22:01.826 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:22:01.827 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:22:01.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:22:02.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:22:02.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:22:02.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:22:02.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:22:02.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:22:02.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:22:02.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:22:02.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:22:02.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:22:02.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:22:02.204 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:22:02.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:22:00
2026-05-30T06:22:02.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73966, datetime.datetime(2026, 5, 30, 6, 22), datetime.datetime(2026, 5, 30, 6, 21, 59), 'salt', 11.18, 45.22, None, 16.66, 327.2, 11.41, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:22:02.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:22:02.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:22:02.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:21:59, diff=3.285683s, valid=True
2026-05-30T06:22:02.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:22:02.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:22:02.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:22:12, diff=-9.711452s, valid=True
2026-05-30T06:22:02.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:22:02.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:22:02.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:21:57, diff=5.295274s, valid=True
2026-05-30T06:22:02.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:22:02.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:22:02.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:22:02.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:22:02.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:22:02.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:22:02.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:22:12, diff=-9.701676s, valid=True
2026-05-30T06:22:02.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:22:02.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:22:02.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:22:02.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047564.299003s, valid=True
2026-05-30T06:22:02.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:22:02.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:22:02.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:22:02.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:22:02.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:22:02.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:22:02.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:22:02.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:22:02.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:22:02.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:22:02.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:22:02.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:22:02.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:22:02.613 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:22:02.820 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:22:03.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:22:03.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:22:03.266 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:22:03.266 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:22:03.468 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:22:03.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:22:33.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:22:33.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:22:33.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:22:33.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:22:33.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:22:34.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:22:34.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-05-30T06:22:34.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:22:34.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-05-30T06:22:34.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:22:34.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:22:34.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:22:34.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-05-30T06:22:37.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-05-30T06:22:37.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:22:37.234 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:22:37.234 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:22:37.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:22:37.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:22:37.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:22:37.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:22:37.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:22:37.259 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:22:37.259 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:22:37.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:22:37.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:22:37.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:22:37.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:22:37.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:22:37.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:22:37.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:22:37.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:22:37.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:22:37.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:22:37.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:22:37.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:22:37.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:22:30
2026-05-30T06:22:37.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73967, datetime.datetime(2026, 5, 30, 6, 22, 30), datetime.datetime(2026, 5, 30, 6, 22, 30), 'salt', 11.25, 45.12, None, 16.62, 326.07, 11.45, 831.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:22:37.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:22:37.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:22:37.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:22:30, diff=7.650598s, valid=True
2026-05-30T06:22:37.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:22:37.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:22:37.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:22:12, diff=25.653961s, valid=True
2026-05-30T06:22:37.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:22:37.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:22:37.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:22:29, diff=8.662155s, valid=True
2026-05-30T06:22:37.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:22:37.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:22:37.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:22:37.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:22:37.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:22:37.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:22:37.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:22:12, diff=25.66578s, valid=True
2026-05-30T06:22:37.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:22:37.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:22:37.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:22:37.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047599.666554s, valid=True
2026-05-30T06:22:37.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:22:37.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:22:37.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:22:37.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:22:37.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:22:37.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:22:37.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:22:37.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:22:37.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:22:37.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:22:37.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:22:37.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:22:37.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:22:37.986 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:22:38.195 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:22:38.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:22:38.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:22:38.695 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:22:38.695 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:22:38.890 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:22:38.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:23:08.920 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:23:08.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:23:08.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:23:09.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:23:09.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:23:09.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:23:09.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-05-30T06:23:09.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:23:09.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-05-30T06:23:09.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:23:09.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:23:09.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:23:09.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-05-30T06:23:12.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-05-30T06:23:12.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:23:12.025 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:23:12.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:23:12.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:23:12.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:23:12.048 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:23:12.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:23:12.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:23:12.049 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:23:12.049 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:23:12.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:23:12.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:23:12.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:23:12.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:23:12.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:23:12.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:23:12.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:23:12.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:23:12.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:23:12.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:23:12.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:23:12.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:23:12.433 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:23:00
2026-05-30T06:23:12.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73968, datetime.datetime(2026, 5, 30, 6, 23), datetime.datetime(2026, 5, 30, 6, 23), 'salt', 11.31, 45.09, None, 16.34, 329.01, 11.46, 831.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:23:12.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:23:12.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:23:12.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:23:00, diff=12.441219s, valid=True
2026-05-30T06:23:12.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:23:12.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:23:12.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:23:12, diff=0.444872s, valid=True
2026-05-30T06:23:12.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:23:12.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:23:12.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:22:58, diff=14.453248s, valid=True
2026-05-30T06:23:12.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:23:12.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:23:12.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:23:12.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:23:12.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:23:12.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:23:12.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:23:12, diff=0.457084s, valid=True
2026-05-30T06:23:12.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:23:12.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:23:12.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:23:12.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047634.45792s, valid=True
2026-05-30T06:23:12.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:23:12.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:23:12.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:23:12.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:23:12.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:23:12.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:23:12.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:23:12.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:23:12.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:23:12.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:23:12.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:23:12.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:23:12.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:23:12.780 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:23:12.987 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:23:13.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:23:13.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:23:13.431 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:23:13.431 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:23:13.725 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:23:13.725 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:23:43.755 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:23:43.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:23:43.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:23:44.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:23:44.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:23:44.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:23:44.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-05-30T06:23:44.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:23:44.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-05-30T06:23:44.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:23:44.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:23:44.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:23:44.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-05-30T06:23:46.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-05-30T06:23:46.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:23:46.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:23:46.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:23:46.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:23:46.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:23:46.759 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:23:46.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:23:46.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:23:46.761 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:23:46.761 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:23:46.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:23:46.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:23:46.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:23:46.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:23:46.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:23:47.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:23:47.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:23:47.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:23:47.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:23:47.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:23:47.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:23:47.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:23:47.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:23:30
2026-05-30T06:23:47.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73969, datetime.datetime(2026, 5, 30, 6, 23, 30), datetime.datetime(2026, 5, 30, 6, 23, 30), 'salt', 11.31, 45.02, None, 17.96, 320.51, 11.48, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:23:47.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:23:47.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:23:47.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:23:30, diff=17.159383s, valid=True
2026-05-30T06:23:47.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:23:47.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:23:47.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:23:12, diff=35.162898s, valid=True
2026-05-30T06:23:47.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:23:47.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:23:47.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:23:28, diff=19.171065s, valid=True
2026-05-30T06:23:47.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:23:47.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:23:47.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:23:47.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:23:47.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:23:47.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:23:47.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:23:12, diff=35.174802s, valid=True
2026-05-30T06:23:47.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:23:47.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:23:47.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:23:47.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047669.175648s, valid=True
2026-05-30T06:23:47.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:23:47.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:23:47.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:23:47.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:23:47.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:23:47.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:23:47.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:23:47.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:23:47.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:23:47.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:23:47.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:23:47.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:23:47.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:23:47.497 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:23:47.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:23:48.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:23:48.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:23:48.216 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:23:48.216 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:23:48.475 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:23:48.476 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:24:18.493 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:24:18.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:24:18.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:24:18.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:24:18.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:24:19.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:24:19.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T06:24:19.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:24:19.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-05-30T06:24:19.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:24:19.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:24:19.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:24:19.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-05-30T06:24:53.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-05-30T06:24:53.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:24:53.559 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:24:53.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:24:53.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:24:53.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:24:53.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:24:53.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:24:53.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:24:53.584 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:24:53.585 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:24:53.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:24:53.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:24:53.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:24:53.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:24:53.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:24:53.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:24:53.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:24:53.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:24:53.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:24:53.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:24:53.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:24:53.904 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:24:53.965 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:24:31
2026-05-30T06:24:53.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73971, datetime.datetime(2026, 5, 30, 6, 24, 31), datetime.datetime(2026, 5, 30, 6, 24, 31), 'salt', 11.25, 45.09, None, 18.03, 321.48, 11.46, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:24:53.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:24:53.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:24:53.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:24:31, diff=22.972945s, valid=True
2026-05-30T06:24:53.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:24:53.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:24:53.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:24:12, diff=41.97649s, valid=True
2026-05-30T06:24:53.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:24:53.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:24:53.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:24:28, diff=25.984939s, valid=True
2026-05-30T06:24:53.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:24:53.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:24:53.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:24:53.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:24:53.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:24:53.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:24:53.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:24:12, diff=41.988713s, valid=True
2026-05-30T06:24:53.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:24:53.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:24:53.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:24:53.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047735.989541s, valid=True
2026-05-30T06:24:53.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:24:53.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:24:53.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:24:53.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:24:53.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:24:54.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:24:54.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:24:54.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:24:54.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:24:54.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:24:54.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:24:54.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:24:54.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:24:54.312 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:24:54.522 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:24:54.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:24:54.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:24:54.964 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:24:54.964 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:24:55.172 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:24:55.172 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:25:25.203 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:25:25.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:25:25.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:25:25.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:25:25.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:25:25.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:25:25.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-05-30T06:25:25.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:25:25.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-05-30T06:25:25.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:25:25.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:25:25.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:25:25.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-05-30T06:25:40.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-05-30T06:25:40.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:25:40.540 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:25:40.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:25:40.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:25:40.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:25:40.564 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:25:40.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:25:40.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:25:40.565 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:25:40.565 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:25:40.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:25:40.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:25:40.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:25:40.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:25:40.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:25:40.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:25:40.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:25:40.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:25:40.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:25:40.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:25:40.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:25:40.904 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:25:40.965 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:25:31
2026-05-30T06:25:40.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73973, datetime.datetime(2026, 5, 30, 6, 25, 31), datetime.datetime(2026, 5, 30, 6, 25, 31), 'salt', 11.15, 45.16, None, 17.36, 321.64, 11.43, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:25:40.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:25:40.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:25:40.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:25:31, diff=9.972126s, valid=True
2026-05-30T06:25:40.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:25:40.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:25:40.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:25:12, diff=28.975213s, valid=True
2026-05-30T06:25:40.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:25:40.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:25:40.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:25:29, diff=11.982581s, valid=True
2026-05-30T06:25:40.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:25:40.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:25:40.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:25:40.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:25:40.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:25:40.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:25:40.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:25:12, diff=28.985902s, valid=True
2026-05-30T06:25:40.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:25:40.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:25:40.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:25:40.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047782.986633s, valid=True
2026-05-30T06:25:40.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:25:40.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:25:40.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:25:40.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:25:40.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:25:41.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:25:41.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:25:41.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:25:41.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:25:41.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:25:41.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:25:41.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:25:41.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:25:41.372 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:25:41.581 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:25:41.926 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:25:42.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:25:42.026 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:25:42.026 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:25:42.241 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:25:42.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:26:12.262 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:26:12.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:26:12.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:26:12.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:26:12.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:26:12.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:26:12.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-05-30T06:26:12.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:26:12.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-05-30T06:26:12.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:26:12.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:26:12.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:26:12.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-05-30T06:26:17.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T06:26:17.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:26:17.042 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:26:17.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:26:17.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:26:17.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:26:17.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:26:17.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:26:17.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:26:17.074 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:26:17.074 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:26:17.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:26:17.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:26:17.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:26:17.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:26:17.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:26:17.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T06:26:17.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:26:17.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T06:26:17.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:26:17.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:26:17.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:26:17.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:26:17.470 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:26:02
2026-05-30T06:26:17.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73974, datetime.datetime(2026, 5, 30, 6, 26, 2), datetime.datetime(2026, 5, 30, 6, 26, 1), 'salt', 11.22, 45.16, None, 16.51, 319.53, 11.44, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:26:17.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:26:17.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:26:17.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:26:01, diff=16.477757s, valid=True
2026-05-30T06:26:17.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:26:17.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T06:26:17.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:25:12, diff=65.481345s, valid=True
2026-05-30T06:26:17.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:26:17.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:26:17.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:25:59, diff=18.48978s, valid=True
2026-05-30T06:26:17.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:26:17.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:26:17.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:26:17.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:26:17.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:26:17.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T06:26:17.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:25:12, diff=65.493689s, valid=True
2026-05-30T06:26:17.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:26:17.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:26:17.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:26:17.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047819.494536s, valid=True
2026-05-30T06:26:17.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:26:17.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:26:17.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:26:17.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:26:17.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:26:17.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:26:17.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:26:17.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:26:17.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:26:17.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:26:17.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:26:17.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:26:17.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:26:17.816 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:26:18.024 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:26:18.371 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:26:18.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:26:18.471 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:26:18.471 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:26:20.550 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:26:20.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:26:50.558 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:26:50.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:26:50.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:26:51.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:26:51.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:26:51.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:26:51.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-05-30T06:26:51.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:26:51.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-05-30T06:26:51.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:26:51.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:26:51.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:26:51.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-05-30T06:26:53.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-05-30T06:26:53.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:26:53.726 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:26:53.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:26:53.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:26:53.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:26:53.756 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:26:53.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:26:53.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:26:53.757 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:26:53.757 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:26:53.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:26:53.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:26:53.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:26:53.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:26:53.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:26:54.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T06:26:54.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:26:54.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T06:26:54.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:26:54.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:26:54.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:26:54.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:26:54.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:26:32
2026-05-30T06:26:54.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73975, datetime.datetime(2026, 5, 30, 6, 26, 32), datetime.datetime(2026, 5, 30, 6, 26, 31), 'salt', 11.22, 45.42, None, 18.03, 322.91, 11.36, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:26:54.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:26:54.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:26:54.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:26:31, diff=23.147208s, valid=True
2026-05-30T06:26:54.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:26:54.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T06:26:54.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:25:12, diff=102.150737s, valid=True
2026-05-30T06:26:54.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:26:54.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:26:54.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:26:30, diff=24.158946s, valid=True
2026-05-30T06:26:54.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:26:54.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:26:54.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:26:54.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:26:54.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:26:54.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T06:26:54.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:25:12, diff=102.162672s, valid=True
2026-05-30T06:26:54.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:26:54.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:26:54.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:26:54.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047856.163477s, valid=True
2026-05-30T06:26:54.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:26:54.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:26:54.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:26:54.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:26:54.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:26:54.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:26:54.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:26:54.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:26:54.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:26:54.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:26:54.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:26:54.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:26:54.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:26:54.554 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:26:54.762 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:26:55.104 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:26:55.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:26:55.206 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:26:55.206 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:26:55.366 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:26:55.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:27:25.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:27:25.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:27:25.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:27:25.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:27:25.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:27:25.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:27:25.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T06:27:25.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:27:25.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-05-30T06:27:25.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:27:25.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:27:25.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:27:25.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-05-30T06:27:54.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-05-30T06:27:54.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:27:54.020 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:27:54.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:27:54.031 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:27:54.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:27:54.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:27:54.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:27:54.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:27:54.045 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:27:54.045 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:27:54.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:27:54.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:27:54.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:27:54.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:27:54.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:27:54.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T06:27:54.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:27:54.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T06:27:54.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:27:54.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:27:54.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:27:54.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:27:54.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:27:32
2026-05-30T06:27:54.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73977, datetime.datetime(2026, 5, 30, 6, 27, 32), datetime.datetime(2026, 5, 30, 6, 27, 32), 'salt', 11.22, 45.55, None, 16.2, 326.15, 11.32, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:27:54.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:27:54.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:27:54.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:27:32, diff=22.450939s, valid=True
2026-05-30T06:27:54.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:27:54.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T06:27:54.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:25:12, diff=162.454481s, valid=True
2026-05-30T06:27:54.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:27:54.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:27:54.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:27:30, diff=24.462734s, valid=True
2026-05-30T06:27:54.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:27:54.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:27:54.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:27:54.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:27:54.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:27:54.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T06:27:54.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:25:12, diff=162.4665s, valid=True
2026-05-30T06:27:54.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:27:54.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:27:54.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:27:54.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047916.467328s, valid=True
2026-05-30T06:27:54.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:27:54.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:27:54.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:27:54.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:27:54.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:27:54.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:27:54.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:27:54.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:27:54.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:27:54.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:27:54.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:27:54.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:27:54.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:27:54.788 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:27:54.995 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:27:55.336 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:27:55.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:27:55.436 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:27:55.436 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:27:55.695 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:27:55.695 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:28:25.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:28:25.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:28:25.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:28:26.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:28:26.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:28:26.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:28:26.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-05-30T06:28:26.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:28:26.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-05-30T06:28:26.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:28:26.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:28:26.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:28:26.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-05-30T06:28:28.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-05-30T06:28:28.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:28:28.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:28:28.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:28:28.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:28:28.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:28:28.696 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:28:28.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:28:28.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:28:28.698 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:28:28.698 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:28:28.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:28:28.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:28:28.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:28:28.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:28:28.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:28:28.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:28:28.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:28:29.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:28:29.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:28:29.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:28:29.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:28:29.020 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:28:29.085 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:28:03
2026-05-30T06:28:29.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73978, datetime.datetime(2026, 5, 30, 6, 28, 3), datetime.datetime(2026, 5, 30, 6, 28, 2), 'salt', 11.18, 45.49, None, 17.64, 330.96, 11.33, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:28:29.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:28:29.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:28:29.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:28:02, diff=27.0933s, valid=True
2026-05-30T06:28:29.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:28:29.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:28:29.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:25:12, diff=197.096811s, valid=True
2026-05-30T06:28:29.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:28:29.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:28:29.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:28:00, diff=29.10525s, valid=True
2026-05-30T06:28:29.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:28:29.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:28:29.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:28:29.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:28:29.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:28:29.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:28:29.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:25:12, diff=197.10903s, valid=True
2026-05-30T06:28:29.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:28:29.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:28:29.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:28:29.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047951.109861s, valid=True
2026-05-30T06:28:29.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:28:29.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:28:29.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:28:29.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:28:29.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:28:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:28:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:28:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:28:29.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:28:29.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:28:29.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:28:29.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:28:29.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:28:29.496 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:28:29.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:28:30.069 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:28:30.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:28:30.175 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:28:30.175 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:28:30.440 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:28:30.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:29:00.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:29:00.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:29:00.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:29:00.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:29:00.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:29:00.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:29:00.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-05-30T06:29:00.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:29:00.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-05-30T06:29:00.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:29:00.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:29:00.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:29:00.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-05-30T06:29:03.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-05-30T06:29:03.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:29:03.452 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:29:03.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:29:03.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:29:03.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:29:03.475 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:29:03.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:29:03.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:29:03.476 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:29:03.477 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:29:03.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:29:03.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T06:29:03.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:29:03.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T06:29:03.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:29:03.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:29:03.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:29:03.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:29:03.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:29:03.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:29:03.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:29:03.799 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:29:03.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:29:03
2026-05-30T06:29:03.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73980, datetime.datetime(2026, 5, 30, 6, 29, 3), datetime.datetime(2026, 5, 30, 6, 29, 3), 'salt', 11.12, 45.79, None, 15.1, 330.87, 11.24, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:29:03.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:29:03.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T06:29:03.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:29:03, diff=0.868071s, valid=True
2026-05-30T06:29:03.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:29:03.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:29:03.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:25:12, diff=231.871588s, valid=True
2026-05-30T06:29:03.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:29:03.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T06:29:03.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:29:00, diff=3.879936s, valid=True
2026-05-30T06:29:03.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:29:03.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:29:03.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:29:03.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:29:03.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:29:03.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:29:03.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:25:12, diff=231.883671s, valid=True
2026-05-30T06:29:03.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:29:03.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:29:03.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:29:03.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1047985.884483s, valid=True
2026-05-30T06:29:03.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:29:03.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:29:03.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:29:03.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:29:03.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:29:03.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:29:03.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:29:03.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:29:03.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:29:04.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:29:04.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:29:04.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:29:04.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:29:04.210 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:29:04.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:29:04.760 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:29:04.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:29:04.860 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:29:04.860 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:29:05.136 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:29:05.136 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:29:35.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:29:35.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:29:35.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:29:35.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:29:35.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:29:35.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:29:35.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T06:29:35.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:29:35.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-05-30T06:29:35.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:29:35.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:29:35.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:29:35.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-05-30T06:29:38.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-05-30T06:29:38.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:29:38.119 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:29:38.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:29:38.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:29:38.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:29:38.144 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:29:38.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:29:38.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:29:38.145 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:29:38.145 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:29:38.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:29:38.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:29:38.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:29:38.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:29:38.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:29:38.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:29:38.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:29:38.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:29:38.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:29:38.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:29:38.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:29:38.519 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:29:38.582 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:29:34
2026-05-30T06:29:38.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73981, datetime.datetime(2026, 5, 30, 6, 29, 34), datetime.datetime(2026, 5, 30, 6, 29, 33), 'salt', 11.08, 45.92, None, 17.75, 324.32, 11.2, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:29:38.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:29:38.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:29:38.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:29:33, diff=5.58874s, valid=True
2026-05-30T06:29:38.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:29:38.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:29:38.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:30:12, diff=-33.408295s, valid=True
2026-05-30T06:29:38.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:29:38.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:29:38.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:29:30, diff=8.598587s, valid=True
2026-05-30T06:29:38.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:29:38.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:29:38.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:29:38.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:29:38.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:29:38.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:29:38.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:30:12, diff=-33.398117s, valid=True
2026-05-30T06:29:38.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:29:38.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:29:38.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:29:38.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048020.602598s, valid=True
2026-05-30T06:29:38.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:29:38.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:29:38.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:29:38.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:29:38.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:29:38.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:29:38.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:29:38.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:29:38.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:29:38.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:29:38.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:29:38.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:29:38.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:29:38.918 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:29:39.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:29:39.468 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:29:39.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:29:39.569 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:29:39.569 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:29:39.767 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:29:39.767 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:30:09.797 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:30:09.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:30:09.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:30:10.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:30:10.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:30:10.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:30:10.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-05-30T06:30:10.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:30:10.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-05-30T06:30:10.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:30:10.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:30:10.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:30:10.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-05-30T06:30:24.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-05-30T06:30:24.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:30:24.867 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:30:24.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:30:24.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:30:24.891 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:30:24.891 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:30:24.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:30:24.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:30:24.892 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:30:24.893 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:30:24.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:30:25.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:30:25.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:30:25.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:30:25.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:30:25.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T06:30:25.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:30:25.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T06:30:25.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:30:25.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:30:25.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:30:25.225 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:30:25.288 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:30:04
2026-05-30T06:30:25.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73982, datetime.datetime(2026, 5, 30, 6, 30, 4), datetime.datetime(2026, 5, 30, 6, 30, 3), 'salt', 11.08, 45.92, None, 16.3, 326.59, 11.2, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:30:25.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:30:25.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:30:25.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:30:03, diff=22.29552s, valid=True
2026-05-30T06:30:25.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:30:25.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T06:30:25.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:30:12, diff=13.299028s, valid=True
2026-05-30T06:30:25.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:30:25.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:30:25.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:30:01, diff=24.307316s, valid=True
2026-05-30T06:30:25.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:30:25.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:30:25.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:30:25.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:30:25.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:30:25.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T06:30:25.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:30:12, diff=13.311065s, valid=True
2026-05-30T06:30:25.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:30:25.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:30:25.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:30:25.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048067.311907s, valid=True
2026-05-30T06:30:25.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:30:25.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:30:25.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:30:25.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:30:25.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:30:25.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:30:25.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:30:25.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:30:25.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:30:25.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:30:25.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:30:25.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:30:25.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:30:25.633 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:30:25.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:30:26.179 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:30:26.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:30:26.332 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:30:26.333 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:30:26.530 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:30:26.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:30:56.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:30:56.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:30:56.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:30:56.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:30:56.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:30:57.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:30:57.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-05-30T06:30:57.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:30:57.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-05-30T06:30:57.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:30:57.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:30:57.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:30:57.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T06:31:22.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T06:31:22.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:31:22.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:31:22.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:31:22.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:31:22.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:31:22.189 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:31:22.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:31:22.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:31:22.190 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:31:22.191 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:31:22.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:31:22.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:31:22.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:31:22.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:31:22.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:31:22.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T06:31:22.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:31:22.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T06:31:22.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:31:22.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:31:22.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:31:22.511 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:31:22.574 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:31:04
2026-05-30T06:31:22.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73984, datetime.datetime(2026, 5, 30, 6, 31, 4), datetime.datetime(2026, 5, 30, 6, 31, 4), 'salt', 10.98, 45.95, None, 16.69, 313.42, 11.18, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:31:22.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:31:22.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:31:22.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:31:04, diff=18.581928s, valid=True
2026-05-30T06:31:22.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:31:22.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T06:31:22.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:31:12, diff=10.585374s, valid=True
2026-05-30T06:31:22.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:31:22.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:31:22.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:31:02, diff=20.593838s, valid=True
2026-05-30T06:31:22.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:31:22.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:31:22.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:31:22.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:31:22.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:31:22.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T06:31:22.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:31:12, diff=10.597597s, valid=True
2026-05-30T06:31:22.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:31:22.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:31:22.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:31:22.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048124.598527s, valid=True
2026-05-30T06:31:22.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:31:22.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:31:22.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:31:22.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:31:22.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:31:22.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:31:22.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:31:22.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:31:22.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:31:22.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:31:22.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:31:22.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:31:22.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:31:22.928 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:31:23.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:31:23.494 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:31:23.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:31:23.597 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:31:23.598 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:31:23.869 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:31:23.869 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:31:53.900 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:31:53.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:31:53.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:31:54.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:31:54.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:31:54.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:31:54.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T06:31:54.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:31:54.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-05-30T06:31:54.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:31:54.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:31:54.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:31:54.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-05-30T06:31:56.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-05-30T06:31:56.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:31:56.892 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:31:56.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:31:56.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:31:56.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:31:56.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:31:56.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:31:56.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:31:56.916 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:31:56.916 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:31:56.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:31:57.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:31:57.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:31:57.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:31:57.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:31:57.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:31:57.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:31:57.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:31:57.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:31:57.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:31:57.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:31:57.256 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:31:57.325 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:31:35
2026-05-30T06:31:57.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73985, datetime.datetime(2026, 5, 30, 6, 31, 35), datetime.datetime(2026, 5, 30, 6, 31, 34), 'salt', 10.98, 46.12, None, 15.03, 325.82, 11.13, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:31:57.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:31:57.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:31:57.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:31:34, diff=23.333121s, valid=True
2026-05-30T06:31:57.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:31:57.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:31:57.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:32:12, diff=-14.663577s, valid=True
2026-05-30T06:31:57.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:31:57.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:31:57.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:31:33, diff=24.344237s, valid=True
2026-05-30T06:31:57.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:31:57.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:31:57.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:31:57.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:31:57.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:31:57.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:31:57.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:32:12, diff=-14.652173s, valid=True
2026-05-30T06:31:57.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:31:57.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:31:57.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:31:57.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048159.348597s, valid=True
2026-05-30T06:31:57.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:31:57.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:31:57.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:31:57.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:31:57.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:31:57.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:31:57.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:31:57.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:31:57.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:31:57.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:31:57.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:31:57.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:31:57.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:31:57.669 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:31:57.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:31:58.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:31:58.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:31:58.392 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:31:58.392 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:31:58.589 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:31:58.589 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:32:28.618 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:32:28.618 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:32:28.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:32:28.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:32:28.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:32:29.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:32:29.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-05-30T06:32:29.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:32:29.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-05-30T06:32:29.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:32:29.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:32:29.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:32:29.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-05-30T06:32:32.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T06:32:32.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:32:32.876 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:32:32.877 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:32:32.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:32:32.899 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:32:32.899 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:32:32.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:32:32.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:32:32.900 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:32:32.901 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:32:32.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:32:33.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:32:33.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:32:33.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:32:33.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:32:33.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T06:32:33.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:32:33.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T06:32:33.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:32:33.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:32:33.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:32:33.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:32:33.307 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:32:05
2026-05-30T06:32:33.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73986, datetime.datetime(2026, 5, 30, 6, 32, 5), datetime.datetime(2026, 5, 30, 6, 32, 4), 'salt', 10.98, 46.28, None, 16.55, 329.29, 11.08, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:32:33.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:32:33.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:32:33.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:32:04, diff=29.315288s, valid=True
2026-05-30T06:32:33.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:32:33.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T06:32:33.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:32:12, diff=21.318851s, valid=True
2026-05-30T06:32:33.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:32:33.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:32:33.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:32:02, diff=31.327344s, valid=True
2026-05-30T06:32:33.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:32:33.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:32:33.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:32:33.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:32:33.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:32:33.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T06:32:33.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:32:12, diff=21.331179s, valid=True
2026-05-30T06:32:33.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:32:33.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:32:33.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:32:33.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048195.332015s, valid=True
2026-05-30T06:32:33.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:32:33.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:32:33.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:32:33.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:32:33.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:32:33.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:32:33.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:32:33.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:32:33.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:32:33.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:32:33.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:32:33.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:32:33.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:32:33.653 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:32:33.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:32:34.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:32:34.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:32:34.304 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:32:34.304 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:32:34.500 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:32:34.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:33:04.531 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:33:04.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:33:04.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:33:04.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:33:04.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:33:05.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:33:05.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T06:33:05.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:33:05.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-05-30T06:33:05.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:33:05.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:33:05.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:33:05.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-05-30T06:33:07.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-05-30T06:33:07.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:33:07.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:33:07.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:33:07.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:33:07.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:33:07.545 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:33:07.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:33:07.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:33:07.546 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:33:07.546 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:33:07.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:33:07.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T06:33:07.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:33:07.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T06:33:07.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:33:07.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:33:07.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:33:07.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:33:07.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:33:07.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:33:07.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:33:07.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:33:07.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:33:05
2026-05-30T06:33:07.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73988, datetime.datetime(2026, 5, 30, 6, 33, 5), datetime.datetime(2026, 5, 30, 6, 33, 5), 'salt', 10.95, 46.28, None, 15.67, 327.46, 11.08, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:33:07.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:33:07.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T06:33:07.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:33:05, diff=2.987893s, valid=True
2026-05-30T06:33:07.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:33:07.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:33:07.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:33:12, diff=-4.008523s, valid=True
2026-05-30T06:33:07.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:33:07.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T06:33:08.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:33:02, diff=6.000034s, valid=True
2026-05-30T06:33:08.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:33:08.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:33:08.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:33:08.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:33:08.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:33:08.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:33:08.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:33:12, diff=-3.996251s, valid=True
2026-05-30T06:33:08.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:33:08.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:33:08.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:33:08.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048230.004555s, valid=True
2026-05-30T06:33:08.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:33:08.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:33:08.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:33:08.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:33:08.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:33:08.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:33:08.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:33:08.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:33:08.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:33:08.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:33:08.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:33:08.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:33:08.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:33:08.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:33:08.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:33:08.944 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:33:09.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:33:09.043 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:33:09.043 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:33:09.237 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:33:09.237 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:33:39.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:33:39.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:33:39.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:33:39.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:33:39.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:33:39.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:33:39.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-05-30T06:33:39.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:33:39.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T06:33:39.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:33:39.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:33:39.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:33:39.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-05-30T06:33:42.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-05-30T06:33:42.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:33:42.177 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:33:42.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:33:42.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:33:42.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:33:42.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:33:42.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:33:42.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:33:42.201 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:33:42.201 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:33:42.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:33:42.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:33:42.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:33:42.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:33:42.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:33:42.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:33:42.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:33:42.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:33:42.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:33:42.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:33:42.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:33:42.528 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:33:42.592 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:33:36
2026-05-30T06:33:42.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73989, datetime.datetime(2026, 5, 30, 6, 33, 36), datetime.datetime(2026, 5, 30, 6, 33, 35), 'salt', 10.88, 46.45, None, 17.54, 323.16, 11.02, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:33:42.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:33:42.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:33:42.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:33:35, diff=7.60025s, valid=True
2026-05-30T06:33:42.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:33:42.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:33:42.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:34:12, diff=-29.396012s, valid=True
2026-05-30T06:33:42.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:33:42.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:33:42.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:33:32, diff=10.612242s, valid=True
2026-05-30T06:33:42.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:33:42.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:33:42.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:33:42.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:33:42.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:33:42.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:33:42.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:34:12, diff=-29.384017s, valid=True
2026-05-30T06:33:42.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:33:42.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:33:42.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:33:42.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048264.616797s, valid=True
2026-05-30T06:33:42.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:33:42.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:33:42.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:33:42.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:33:42.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:33:42.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:33:42.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:33:42.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:33:42.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:33:42.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:33:42.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:33:42.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:33:42.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:33:42.937 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:33:43.143 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:33:43.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:33:43.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:33:43.581 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:33:43.581 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:33:43.804 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:33:43.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:34:13.835 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:34:13.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:34:13.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:34:13.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:34:13.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:34:14.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:34:14.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-05-30T06:34:14.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:34:14.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-05-30T06:34:14.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:34:14.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:34:14.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:34:14.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-05-30T06:34:16.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-05-30T06:34:16.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:34:16.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:34:16.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:34:16.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:34:16.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:34:16.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:34:16.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:34:16.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:34:16.618 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:34:16.618 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:34:16.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:34:16.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:34:16.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:34:16.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:34:16.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:34:16.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T06:34:16.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:34:16.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T06:34:16.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:34:16.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:34:16.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:34:16.947 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:34:17.009 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:34:06
2026-05-30T06:34:17.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73990, datetime.datetime(2026, 5, 30, 6, 34, 6), datetime.datetime(2026, 5, 30, 6, 34, 6), 'salt', 10.88, 46.78, None, 15.77, 327.32, 10.92, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:34:17.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:34:17.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:34:17.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:34:06, diff=11.017079s, valid=True
2026-05-30T06:34:17.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:34:17.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T06:34:17.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:34:12, diff=5.020555s, valid=True
2026-05-30T06:34:17.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:34:17.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:34:17.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:34:03, diff=14.028822s, valid=True
2026-05-30T06:34:17.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:34:17.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:34:17.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:34:17.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:34:17.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:34:17.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T06:34:17.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:34:12, diff=5.03259s, valid=True
2026-05-30T06:34:17.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:34:17.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:34:17.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:34:17.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048299.033438s, valid=True
2026-05-30T06:34:17.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:34:17.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:34:17.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:34:17.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:34:17.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:34:17.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:34:17.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:34:17.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:34:17.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:34:17.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:34:17.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:34:17.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:34:17.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:34:17.422 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:34:17.629 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:34:17.969 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:34:18.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:34:18.072 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:34:18.072 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:34:18.271 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:34:18.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:34:48.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:34:48.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:34:48.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:34:48.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:34:48.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:34:48.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:34:48.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-05-30T06:34:48.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:34:48.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-05-30T06:34:48.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:34:48.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:34:48.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:34:48.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-05-30T06:34:51.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-05-30T06:34:51.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:34:51.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:34:51.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:34:51.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:34:51.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:34:51.274 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:34:51.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:34:51.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:34:51.275 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:34:51.275 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:34:51.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:34:51.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:34:51.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:34:51.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:34:51.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:34:51.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:34:51.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:34:51.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:34:51.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:34:51.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:34:51.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:34:51.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:34:51.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:34:36
2026-05-30T06:34:51.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73991, datetime.datetime(2026, 5, 30, 6, 34, 36), datetime.datetime(2026, 5, 30, 6, 34, 36), 'salt', 10.88, 46.95, None, 16.62, 315.96, 10.87, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:34:51.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:34:51.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:34:51.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:34:36, diff=15.681173s, valid=True
2026-05-30T06:34:51.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:34:51.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:34:51.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:35:12, diff=-20.315227s, valid=True
2026-05-30T06:34:51.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:34:51.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:34:51.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:34:33, diff=18.693122s, valid=True
2026-05-30T06:34:51.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:34:51.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:34:51.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:34:51.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:34:51.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:34:51.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:34:51.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:35:12, diff=-20.302213s, valid=True
2026-05-30T06:34:51.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:34:51.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:34:51.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:34:51.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048333.698683s, valid=True
2026-05-30T06:34:51.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:34:51.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:34:51.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:34:51.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:34:51.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:34:51.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:34:51.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:34:51.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:34:51.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:34:51.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:34:51.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:34:51.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:34:51.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:34:52.024 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:34:52.232 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:34:52.572 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:34:52.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:34:52.672 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:34:52.672 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:34:52.864 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:34:52.864 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:35:22.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:35:22.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:35:22.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:35:23.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:35:23.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:35:23.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:35:23.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-05-30T06:35:23.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:35:23.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-05-30T06:35:23.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:35:23.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:35:23.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:35:23.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-05-30T06:35: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-05-30T06:35:25.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:35:25.849 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:35:25.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:35:25.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:35:25.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:35:25.873 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:35:25.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:35:25.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:35:25.874 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:35:25.874 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:35:25.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:35:26.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:35:26.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:35:26.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:35:26.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:35:26.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T06:35:26.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:35:26.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T06:35:26.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:35:26.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:35:26.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:35:26.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:35:26.273 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:35:06
2026-05-30T06:35:26.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73992, datetime.datetime(2026, 5, 30, 6, 35, 6), datetime.datetime(2026, 5, 30, 6, 35, 6), 'salt', 10.85, 46.98, None, 16.44, 325.91, 10.86, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:35:26.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:35:26.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:35:26.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:35:06, diff=20.28189s, valid=True
2026-05-30T06:35:26.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:35:26.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T06:35:26.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:35:12, diff=14.285493s, valid=True
2026-05-30T06:35:26.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:35:26.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:35:26.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:35:03, diff=23.294267s, valid=True
2026-05-30T06:35:26.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:35:26.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:35:26.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:35:26.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:35:26.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:35:26.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T06:35:26.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:35:12, diff=14.298198s, valid=True
2026-05-30T06:35:26.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:35:26.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:35:26.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:35:26.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048368.299064s, valid=True
2026-05-30T06:35:26.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:35:26.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:35:26.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:35:26.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:35:26.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:35:26.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:35:26.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:35:26.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:35:26.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:35:26.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:35:26.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:35:26.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:35:26.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:35:26.685 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:35:26.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:35:27.235 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:35:27.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:35:27.336 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:35:27.336 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:35:28.897 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:35:28.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:35:58.920 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:35:58.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:35:58.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:35:59.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:35:59.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:35:59.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:35:59.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-05-30T06:35:59.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:35:59.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-05-30T06:35:59.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:35:59.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:35:59.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:35:59.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-05-30T06:36:01.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-05-30T06:36:01.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:36:01.897 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:36:01.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:36:01.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:36:01.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:36:01.921 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:36:01.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:36:01.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:36:01.922 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:36:01.922 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:36:01.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:36:02.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:36:02.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:36:02.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:36:02.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:36:02.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:36:02.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:36:02.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:36:02.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:36:02.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:36:02.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:36:02.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:36:02.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:35:37
2026-05-30T06:36:02.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73993, datetime.datetime(2026, 5, 30, 6, 35, 37), datetime.datetime(2026, 5, 30, 6, 35, 36), 'salt', 10.85, 47.08, None, 16.09, 325.53, 10.84, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:36:02.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:36:02.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:36:02.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:35:36, diff=26.267686s, valid=True
2026-05-30T06:36:02.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:36:02.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:36:02.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:36:12, diff=-9.729033s, valid=True
2026-05-30T06:36:02.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:36:02.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:36:02.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:35:34, diff=28.278549s, valid=True
2026-05-30T06:36:02.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:36:02.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:36:02.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:36:02.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:36:02.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:36:02.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:36:02.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:36:12, diff=-9.718042s, valid=True
2026-05-30T06:36:02.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:36:02.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:36:02.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:36:02.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048404.282715s, valid=True
2026-05-30T06:36:02.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:36:02.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:36:02.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:36:02.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:36:02.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:36:02.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:36:02.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:36:02.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:36:02.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:36:02.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:36:02.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:36:02.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:36:02.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:36:02.604 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:36:02.813 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:36:03.158 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:36:03.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:36:03.259 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:36:03.259 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:36:03.445 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:36:03.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:36:33.476 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:36:33.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:36:33.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:36:33.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:36:33.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:36:33.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:36:33.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-05-30T06:36:33.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:36:33.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-05-30T06:36:33.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:36:33.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:36:33.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:36:33.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-05-30T06:37:02.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-05-30T06:37:02.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:37:02.062 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:37:02.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:37:02.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:37:02.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:37:02.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:37:02.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:37:02.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:37:02.088 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:37:02.088 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:37:02.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:37:02.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:37:02.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:37:02.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:37:02.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:37:02.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:37:02.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:37:02.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:37:02.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:37:02.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:37:02.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:37:02.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:37:02.482 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:36:37
2026-05-30T06:37:02.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73995, datetime.datetime(2026, 5, 30, 6, 36, 37), datetime.datetime(2026, 5, 30, 6, 36, 37), 'salt', 10.78, 47.28, None, 16.87, 331.38, 10.77, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:37:02.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:37:02.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:37:02.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:36:37, diff=25.490161s, valid=True
2026-05-30T06:37:02.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:37:02.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:37:02.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:37:12, diff=-9.506349s, valid=True
2026-05-30T06:37:02.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:37:02.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:37:02.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:36:34, diff=28.501783s, valid=True
2026-05-30T06:37:02.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:37:02.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:37:02.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:37:02.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:37:02.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:37:02.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:37:02.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:37:12, diff=-9.494499s, valid=True
2026-05-30T06:37:02.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:37:02.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:37:02.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:37:02.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048464.506346s, valid=True
2026-05-30T06:37:02.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:37:02.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:37:02.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:37:02.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:37:02.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:37:02.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:37:02.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:37:02.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:37:02.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:37:02.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:37:02.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:37:02.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:37:02.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:37:02.829 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:37:03.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:37:03.383 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:37:03.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:37:03.483 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:37:03.483 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:37:03.669 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:37:03.670 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:37:33.679 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:37:33.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:37:33.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:37:33.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:37:33.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:37:34.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:37:34.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-05-30T06:37:34.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:37:34.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-05-30T06:37:34.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:37:34.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:37:34.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:37:34.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T06:37:38.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T06:37:38.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:37:38.123 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:37:38.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:37:38.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:37:38.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:37:38.146 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:37:38.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:37:38.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:37:38.147 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:37:38.148 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:37:38.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:37:38.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-30T06:37:38.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:37:38.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-30T06:37:38.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:37:38.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:37:38.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:37:38.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:37:38.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:37:38.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:37:38.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:37:38.463 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:37:38.527 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:37:38
2026-05-30T06:37:38.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73997, datetime.datetime(2026, 5, 30, 6, 37, 38), datetime.datetime(2026, 5, 30, 6, 37, 37), 'salt', 10.85, 47.18, None, 16.69, 325.23, 10.81, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:37:38.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:37:38.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-30T06:37:38.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:37:37, diff=1.534762s, valid=True
2026-05-30T06:37:38.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:37:38.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:37:38.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:38:12, diff=-33.461746s, valid=True
2026-05-30T06:37:38.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:37:38.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-30T06:37:38.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:37:34, diff=4.54655s, valid=True
2026-05-30T06:37:38.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:37:38.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:37:38.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:37:38.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:37:38.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:37:38.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:37:38.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:38:12, diff=-33.449696s, valid=True
2026-05-30T06:37:38.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:37:38.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:37:38.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:37:38.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048500.55113s, valid=True
2026-05-30T06:37:38.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:37:38.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:37:38.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:37:38.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:37:38.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:37:38.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:37:38.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:37:38.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:37:38.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:37:38.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:37:38.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:37:38.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:37:38.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:37:38.870 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:37:39.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:37:39.400 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:37:39.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:37:39.556 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:37:39.556 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:37:39.746 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:37:39.746 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:38:09.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:38:09.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:38:09.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:38:10.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:38:10.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:38:10.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:38:10.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-05-30T06:38:10.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:38:10.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-05-30T06:38:10.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:38:10.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:38:10.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:38: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-05-30T06:38:12.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-05-30T06:38:12.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:38:12.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:38:12.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:38:12.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:38:12.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:38:12.716 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:38:12.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:38:12.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:38:12.717 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:38:12.717 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:38:12.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:38:12.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:38:12.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:38:12.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:38:12.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:38:12.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T06:38:12.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:38:13.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T06:38:13.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:38:13.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:38:13.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:38:13.028 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:38:13.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:38:08
2026-05-30T06:38:13.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73998, datetime.datetime(2026, 5, 30, 6, 38, 8), datetime.datetime(2026, 5, 30, 6, 38, 8), 'salt', 10.88, 47.15, None, 15.56, 325.44, 10.82, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:38:13.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:38:13.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:38:13.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:38:08, diff=5.099868s, valid=True
2026-05-30T06:38:13.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:38:13.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T06:38:13.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:38:12, diff=1.103237s, valid=True
2026-05-30T06:38:13.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:38:13.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:38:13.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:38:05, diff=8.111272s, valid=True
2026-05-30T06:38:13.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:38:13.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:38:13.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:38:13.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:38:13.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:38:13.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T06:38:13.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:38:12, diff=1.114868s, valid=True
2026-05-30T06:38:13.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:38:13.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:38:13.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:38:13.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048535.115653s, valid=True
2026-05-30T06:38:13.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:38:13.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:38:13.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:38:13.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:38:13.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:38:13.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:38:13.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:38:13.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:38:13.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:38:13.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:38:13.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:38:13.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:38:13.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:38:13.439 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:38:13.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:38:13.972 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:38:14.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:38:14.068 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:38:14.068 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:38:14.247 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:38:14.247 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:38:44.254 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:38:44.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:38:44.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:38:44.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:38:44.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:38:44.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:38:44.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-05-30T06:38:44.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:38:44.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-05-30T06:38:44.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:38:44.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:38:44.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:38:44.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-05-30T06:38:48.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-05-30T06:38:48.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:38:48.205 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:38:48.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:38:48.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:38:48.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:38:48.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:38:48.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:38:48.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:38:48.229 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:38:48.229 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:38:48.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:38:48.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:38:48.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:38:48.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:38:48.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:38:48.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:38:48.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:38:48.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:38:48.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:38:48.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:38:48.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:38:48.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:38:48.617 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:38:38
2026-05-30T06:38:48.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(73999, datetime.datetime(2026, 5, 30, 6, 38, 38), datetime.datetime(2026, 5, 30, 6, 38, 38), 'salt', 10.88, 47.18, None, 14.93, 331.96, 10.81, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:38:48.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:38:48.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:38:48.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:38:38, diff=10.624721s, valid=True
2026-05-30T06:38:48.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:38:48.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:38:48.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:39:12, diff=-23.371772s, valid=True
2026-05-30T06:38:48.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:38:48.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:38:48.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:38:35, diff=13.636733s, valid=True
2026-05-30T06:38:48.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:38:48.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:38:48.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:38:48.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:38:48.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:38:48.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:38:48.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:39:12, diff=-23.359501s, valid=True
2026-05-30T06:38:48.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:38:48.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:38:48.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:38:48.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048570.641354s, valid=True
2026-05-30T06:38:48.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:38:48.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:38:48.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:38:48.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:38:48.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:38:48.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:38:48.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:38:48.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:38:48.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:38:48.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:38:48.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:38:48.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:38:48.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:38:48.962 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:38:49.162 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:38:49.573 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:38:49.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:38:49.674 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:38:49.674 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:38:49.851 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:38:49.851 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:39:19.881 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:39:19.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:39:19.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:39:19.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:39:19.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:39:20.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:39:20.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-05-30T06:39:20.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:39:20.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-05-30T06:39:20.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:39:20.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:39:20.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:39:20.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-05-30T06:39:22.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T06:39:22.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:39:22.629 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:39:22.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:39:22.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:39:22.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:39:22.652 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:39:22.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:39:22.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:39:22.654 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:39:22.654 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:39:22.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:39:22.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:39:22.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:39:22.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:39:22.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:39:22.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T06:39:22.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:39:22.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T06:39:22.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:39:22.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:39:22.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:39:22.934 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:39:22.996 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:39:08
2026-05-30T06:39:22.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74000, datetime.datetime(2026, 5, 30, 6, 39, 8), datetime.datetime(2026, 5, 30, 6, 39, 8), 'salt', 10.85, 47.31, None, 16.44, 331.0, 10.77, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:39:22.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:39:22.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:39:23.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:39:08, diff=15.003043s, valid=True
2026-05-30T06:39:23.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:39:23.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T06:39:23.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:39:12, diff=11.005932s, valid=True
2026-05-30T06:39:23.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:39:23.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:39:23.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:39:05, diff=18.01285s, valid=True
2026-05-30T06:39:23.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:39:23.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:39:23.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:39:23.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:39:23.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:39:23.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T06:39:23.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:39:12, diff=11.016139s, valid=True
2026-05-30T06:39:23.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:39:23.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:39:23.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:39:23.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048605.016889s, valid=True
2026-05-30T06:39:23.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:39:23.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:39:23.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:39:23.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:39:23.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:39:23.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:39:23.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:39:23.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:39:23.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:39:23.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:39:23.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:39:23.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:39:23.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:39:23.361 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:39:23.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:39:23.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:39:24.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:39:24.010 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:39:24.010 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:39:24.245 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:39:24.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:39:54.276 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:39:54.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:39:54.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:39:54.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:39:54.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:39:54.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:39:54.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-05-30T06:39:54.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:39:54.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-05-30T06:39:54.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:39:54.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:39:54.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:39:54.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-05-30T06:39:57.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-05-30T06:39:57.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:39:57.519 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:39:57.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:39:57.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:39:57.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:39:57.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:39:57.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:39:57.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:39:57.544 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:39:57.544 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:39:57.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:39:57.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:39:57.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:39:57.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:39:57.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:39:57.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:39:57.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:39:57.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:39:57.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:39:57.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:39:57.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:39:57.868 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:39:57.930 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:39:39
2026-05-30T06:39:57.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74001, datetime.datetime(2026, 5, 30, 6, 39, 39), datetime.datetime(2026, 5, 30, 6, 39, 38), 'salt', 10.85, 47.31, None, 17.04, 333.56, 10.77, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:39:57.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:39:57.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:39:57.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:39:38, diff=19.938081s, valid=True
2026-05-30T06:39:57.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:39:57.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:39:57.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:40:12, diff=-14.0584s, valid=True
2026-05-30T06:39:57.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:39:57.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:39:57.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:39:36, diff=21.950089s, valid=True
2026-05-30T06:39:57.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:39:57.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:39:57.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:39:57.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:39:57.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:39:57.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:39:57.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:40:12, diff=-14.046159s, valid=True
2026-05-30T06:39:57.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:39:57.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:39:57.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:39:57.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048639.954681s, valid=True
2026-05-30T06:39:57.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:39:57.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:39:57.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:39:57.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:39:57.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:39:58.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:39:58.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:39:58.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:39:58.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:39:58.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:39:58.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:39:58.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:39:58.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:39:58.355 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:39:58.554 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:39:58.890 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:39:58.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:39:58.989 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:39:58.989 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:39:59.174 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:39:59.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:40:29.204 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:40:29.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:40:29.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:40:29.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:40:29.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:40:29.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:40:29.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-05-30T06:40:29.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:40:29.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-05-30T06:40:29.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:40:29.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:40:29.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:40:29.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-05-30T06:40:34.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-05-30T06:40:34.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:40:34.047 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:40:34.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:40:34.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:40:34.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:40:34.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:40:34.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:40:34.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:40:34.070 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:40:34.071 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:40:34.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:40:34.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:40:34.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:40:34.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:40:34.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:40:34.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T06:40:34.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:40:34.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-30T06:40:34.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:40:34.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:40:34.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:40:34.376 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:40:34.435 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:40:09
2026-05-30T06:40:34.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74002, datetime.datetime(2026, 5, 30, 6, 40, 9), datetime.datetime(2026, 5, 30, 6, 40, 8), 'salt', 10.85, 47.31, None, 15.7, 331.12, 10.77, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:40:34.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:40:34.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:40:34.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:40:08, diff=26.443217s, valid=True
2026-05-30T06:40:34.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:40:34.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T06:40:34.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:40:12, diff=22.446675s, valid=True
2026-05-30T06:40:34.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:40:34.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:40:34.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:40:07, diff=27.454819s, valid=True
2026-05-30T06:40:34.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:40:34.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:40:34.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:40:34.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:40:34.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:40:34.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-30T06:40:34.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:40:12, diff=22.458472s, valid=True
2026-05-30T06:40:34.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:40:34.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:40:34.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:40:34.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048676.45928s, valid=True
2026-05-30T06:40:34.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:40:34.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:40:34.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:40:34.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:40:34.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:40:34.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:40:34.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:40:34.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:40:34.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:40:34.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:40:34.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:40:34.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:40:34.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:40:34.781 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:40:34.980 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:40:35.310 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:40:35.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:40:35.409 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:40:35.409 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:40:35.602 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:40:35.602 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:41:05.622 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:41:05.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:41:05.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:41:05.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:41:05.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:41:06.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:41:06.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-05-30T06:41:06.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:41:06.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T06:41:06.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:41:06.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:41:06.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:41:06.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-05-30T06:41:08.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-05-30T06:41:08.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:41:08.992 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:41:08.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:41:09.002 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:41:09.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:41:09.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:41:09.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:41:09.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:41:09.016 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:41:09.017 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:41:09.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:41:09.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:41:09.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:41:09.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:41:09.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:41:09.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:41:09.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:41:09.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-30T06:41:09.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:41:09.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:41:09.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:41:09.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:41:09.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:40:39
2026-05-30T06:41:09.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74003, datetime.datetime(2026, 5, 30, 6, 40, 39), datetime.datetime(2026, 5, 30, 6, 40, 39), 'salt', 10.92, 47.35, None, 15.46, 332.08, 10.77, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:41:09.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:41:09.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:41:09.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:40:39, diff=30.407994s, valid=True
2026-05-30T06:41:09.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:41:09.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:41:09.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:41:12, diff=-2.588286s, valid=True
2026-05-30T06:41:09.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:41:09.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:41:09.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:40:38, diff=31.420416s, valid=True
2026-05-30T06:41:09.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:41:09.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:41:09.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:41:09.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:41:09.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:41:09.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-30T06:41:09.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:41:12, diff=-2.575753s, valid=True
2026-05-30T06:41:09.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:41:09.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:41:09.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:41:09.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048711.425092s, valid=True
2026-05-30T06:41:09.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:41:09.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:41:09.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:41:09.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:41:09.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:41:09.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:41:09.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:41:09.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:41:09.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:41:09.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:41:09.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:41:09.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:41:09.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:41:09.814 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:41:10.032 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:41:10.370 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:41:10.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:41:10.470 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:41:10.471 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:41:10.662 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:41:10.663 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:41:40.678 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:41:40.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:41:40.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:41:40.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:41:40.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:41:41.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:41:41.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-05-30T06:41:41.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:41:41.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-05-30T06:41:41.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:41:41.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:41:41.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:41:41.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-05-30T06:41:43.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-05-30T06:41:44.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:41:44.005 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:41:44.005 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:41:44.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:41:44.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:41:44.027 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:41:44.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:41:44.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:41:44.028 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:41:44.029 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:41:44.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:41:44.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:41:44.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:41:44.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:41:44.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:41:44.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T06:41:44.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:41:44.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T06:41:44.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:41:44.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:41:44.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:41:44.356 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:41:44.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:41:40
2026-05-30T06:41:44.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74005, datetime.datetime(2026, 5, 30, 6, 41, 40), datetime.datetime(2026, 5, 30, 6, 41, 39), 'salt', 10.82, 47.45, None, 16.87, 334.73, 10.73, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:41:44.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:41:44.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:41:44.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:41:39, diff=5.42782s, valid=True
2026-05-30T06:41:44.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:41:44.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T06:41:44.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:42:12, diff=-27.568678s, valid=True
2026-05-30T06:41:44.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:41:44.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:41:44.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:41:37, diff=7.439152s, valid=True
2026-05-30T06:41:44.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:41:44.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:41:44.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:41:44.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:41:44.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:41:44.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T06:41:44.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:42:12, diff=-27.557546s, valid=True
2026-05-30T06:41:44.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:41:44.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:41:44.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:41:44.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048746.443166s, valid=True
2026-05-30T06:41:44.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:41:44.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:41:44.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:41:44.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:41:44.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:41:44.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:41:44.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:41:44.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:41:44.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:41:44.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:41:44.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:41:44.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:41:44.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:41:44.764 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:41:44.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:41:45.294 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:41:45.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:41:45.394 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:41:45.394 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:41:45.615 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:41:45.615 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:42:15.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:42:15.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:42:15.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:42:15.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:42:15.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:42:16.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:42:16.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-05-30T06:42:16.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:42:16.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-05-30T06:42:16.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:42:16.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:42:16.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:42:16.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-05-30T06:42:20.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-05-30T06:42:20.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:42:20.462 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:42:20.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:42:20.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:42:20.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:42:20.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:42:20.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:42:20.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:42:20.489 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:42:20.489 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:42:20.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:42:20.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:42:20.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:42:20.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:42:20.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:42:20.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T06:42:20.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:42:20.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-30T06:42:20.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:42:20.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:42:20.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:42:20.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:42:20.868 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:42:10
2026-05-30T06:42:20.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74006, datetime.datetime(2026, 5, 30, 6, 42, 10), datetime.datetime(2026, 5, 30, 6, 42, 10), 'salt', 10.82, 47.61, None, 16.2, 318.79, 10.68, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:42:20.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:42:20.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:42:20.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:42:10, diff=10.875903s, valid=True
2026-05-30T06:42:20.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:42:20.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T06:42:20.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:42:12, diff=8.879395s, valid=True
2026-05-30T06:42:20.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:42:20.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:42:20.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:42:07, diff=13.887767s, valid=True
2026-05-30T06:42:20.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:42:20.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:42:20.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:42:20.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:42:20.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:42:20.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-30T06:42:20.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:42:12, diff=8.891527s, valid=True
2026-05-30T06:42:20.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:42:20.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:42:20.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:42:20.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048782.892349s, valid=True
2026-05-30T06:42:20.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:42:20.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:42:20.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:42:20.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:42:20.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:42:20.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:42:20.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:42:20.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:42:20.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:42:21.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:42:21.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:42:21.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:42:21.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:42:21.279 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:42:21.480 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:42:21.812 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:42:21.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:42:21.914 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:42:21.914 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:42:22.099 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:42:22.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:42:52.117 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:42:52.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:42:52.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:42:52.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:42:52.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:42:52.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:42:52.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-05-30T06:42:52.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:42:52.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-05-30T06:42:52.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:42:52.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:42:52.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:42:52.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-05-30T06:42:55.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-05-30T06:42:55.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:42:55.425 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:42:55.425 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:42:55.435 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:42:55.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:42:55.448 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:42:55.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:42:55.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:42:55.449 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:42:55.449 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:42:55.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:42:55.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:42:55.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:42:55.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:42:55.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:42:55.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T06:42:55.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:42:55.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-30T06:42:55.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:42:55.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:42:55.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:42:55.775 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:42:55.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:42:40
2026-05-30T06:42:55.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74007, datetime.datetime(2026, 5, 30, 6, 42, 40), datetime.datetime(2026, 5, 30, 6, 42, 40), 'salt', 10.75, 47.68, None, 16.48, 324.87, 10.65, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:42:55.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:42:55.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:42:55.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:42:40, diff=15.84777s, valid=True
2026-05-30T06:42:55.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:42:55.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T06:42:55.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:43:12, diff=-16.148778s, valid=True
2026-05-30T06:42:55.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:42:55.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:42:55.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:42:37, diff=18.859515s, valid=True
2026-05-30T06:42:55.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:42:55.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:42:55.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:42:55.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:42:55.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:42:55.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-30T06:42:55.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:43:12, diff=-16.13677s, valid=True
2026-05-30T06:42:55.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:42:55.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:42:55.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:42:55.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048817.864055s, valid=True
2026-05-30T06:42:55.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:42:55.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:42:55.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:42:55.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:42:55.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:42:55.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:42:55.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:42:55.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:42:55.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:42:56.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:42:56.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:42:56.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:42:56.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:42:56.183 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:42:56.381 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:42:56.713 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:42:56.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:42:56.812 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:42:56.812 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:42:56.999 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:42:57.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:43:27.030 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:43:27.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:43:27.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:43:27.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:43:27.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:43:27.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:43:27.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-05-30T06:43:27.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:43:27.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-05-30T06:43:27.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:43:27.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:43:27.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:43:27.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-05-30T06:43:43.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-05-30T06:43:43.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:43:43.443 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:43:43.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:43:43.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:43:43.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:43:43.465 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:43:43.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:43:43.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:43:43.466 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:43:43.466 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:43:43.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:43:43.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:43:43.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:43:43.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:43:43.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:43:43.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:43:43.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:43:43.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:43:43.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:43:43.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:43:43.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:43:43.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:43:43.849 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:43:41
2026-05-30T06:43:43.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74009, datetime.datetime(2026, 5, 30, 6, 43, 41), datetime.datetime(2026, 5, 30, 6, 43, 40), 'salt', 10.75, 47.88, None, 19.05, 322.22, 10.6, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:43:43.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:43:43.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:43:43.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:43:40, diff=3.855394s, valid=True
2026-05-30T06:43:43.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:43:43.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:43:43.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:44:12, diff=-28.141731s, valid=True
2026-05-30T06:43:43.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:43:43.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:43:43.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:43:38, diff=5.865022s, valid=True
2026-05-30T06:43:43.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:43:43.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:43:43.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:43:43.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:43:43.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:43:43.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:43:43.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:44:12, diff=-28.131941s, valid=True
2026-05-30T06:43:43.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:43:43.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:43:43.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:43:43.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048865.868732s, valid=True
2026-05-30T06:43:43.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:43:43.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:43:43.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:43:43.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:43:43.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:43:43.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:43:43.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:43:43.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:43:43.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:43:43.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:43:44.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:43:44.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:43:44.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:43:44.182 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:43:44.381 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:43:44.713 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:43:44.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:43:44.812 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:43:44.812 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:43:45.036 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:43:45.036 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:44:15.039 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:44:15.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:44:15.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:44:15.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:44:15.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:44:15.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:44:15.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-05-30T06:44:15.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:44:15.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-05-30T06:44:15.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:44:15.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:44:15.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:44:15.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-05-30T06:44:18.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-05-30T06:44:18.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:44:18.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:44:18.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:44:18.717 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:44:18.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:44:18.730 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:44:18.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:44:18.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:44:18.731 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:44:18.731 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:44:18.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:44:18.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:44:18.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:44:18.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:44:18.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:44:19.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:44:19.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:44:19.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T06:44:19.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:44:19.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:44:19.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:44:19.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:44:19.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:44:11
2026-05-30T06:44:19.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74010, datetime.datetime(2026, 5, 30, 6, 44, 11), datetime.datetime(2026, 5, 30, 6, 44, 10), 'salt', 10.75, 48.34, None, 16.87, 327.78, 10.46, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:44:19.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:44:19.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:44:19.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:44:10, diff=9.126059s, valid=True
2026-05-30T06:44:19.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:44:19.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:44:19.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:44:12, diff=7.129494s, valid=True
2026-05-30T06:44:19.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:44:19.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:44:19.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:44:08, diff=11.137585s, valid=True
2026-05-30T06:44:19.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:44:19.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:44:19.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:44:19.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:44:19.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:44:19.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T06:44:19.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:44:12, diff=7.141243s, valid=True
2026-05-30T06:44:19.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:44:19.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:44:19.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:44:19.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1048901.142051s, valid=True
2026-05-30T06:44:19.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:44:19.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:44:19.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:44:19.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:44:19.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:44:19.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:44:19.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:44:19.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:44:19.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:44:19.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:44:19.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:44:19.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:44:19.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:44:19.464 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:44:19.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:44:20.006 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:44:20.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:44:20.112 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:44:20.112 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:44:20.407 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:44:20.407 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:44:50.432 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:44:50.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:44:50.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:44:50.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:44:50.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:44:50.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:44:50.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T06:44:50.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:44:50.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-05-30T06:44:50.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:44:50.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:44:50.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:44:50.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-05-30T06:47: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-05-30T06:47:05.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:47:05.112 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:47:05.112 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:47:05.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:47:05.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:47:05.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:47:05.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:47:05.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:47:05.138 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:47:05.138 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:47:05.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:47:05.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:47:05.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:47:05.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:47:05.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:47:05.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:47:05.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:47:05.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:47:05.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:47:05.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:47:05.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:47:05.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:47:05.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:46:42
2026-05-30T06:47:05.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74015, datetime.datetime(2026, 5, 30, 6, 46, 42), datetime.datetime(2026, 5, 30, 6, 46, 42), 'salt', 10.88, 47.58, None, 16.8, 332.13, 10.69, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:47:05.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:47:05.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:47:05.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:46:42, diff=23.490374s, valid=True
2026-05-30T06:47:05.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:47:05.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:47:05.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:47:12, diff=-6.506265s, valid=True
2026-05-30T06:47:05.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:47:05.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:47:05.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:46:39, diff=26.50183s, valid=True
2026-05-30T06:47:05.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:47:05.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:47:05.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:47:05.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:47:05.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:47:05.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:47:05.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:47:12, diff=-6.49455s, valid=True
2026-05-30T06:47:05.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:47:05.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:47:05.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:47:05.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1049067.50624s, valid=True
2026-05-30T06:47:05.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:47:05.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:47:05.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:47:05.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:47:05.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:47:05.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:47:05.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:47:05.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:47:05.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:47:05.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:47:05.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:47:05.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:47:05.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:47:05.824 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:47:06.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:47:06.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:47:06.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:47:06.452 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:47:06.452 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:47:06.635 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:47:06.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:47:36.659 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:47:36.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:47:36.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:47:37.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:47:37.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:47:37.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:47:37.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-05-30T06:47:37.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:47:37.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-05-30T06:47:37.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:47:37.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:47:37.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:47:37.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-05-30T06:47:40.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-05-30T06:47:40.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:47:40.996 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:47:40.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:47:41.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:47:41.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:47:41.020 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:47:41.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:47:41.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:47:41.021 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:47:41.021 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:47:41.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:47:41.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:47:41.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:47:41.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:47:41.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:47:41.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:47:41.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:47:41.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:47:41.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:47:41.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:47:41.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:47:41.338 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:47:41.400 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:47:13
2026-05-30T06:47:41.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74016, datetime.datetime(2026, 5, 30, 6, 47, 13), datetime.datetime(2026, 5, 30, 6, 47, 12), 'salt', 10.92, 47.78, None, 17.11, 329.33, 10.64, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:47:41.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:47:41.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:47:41.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:47:12, diff=29.408245s, valid=True
2026-05-30T06:47:41.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:47:41.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:47:41.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:47:12, diff=29.411549s, valid=True
2026-05-30T06:47:41.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:47:41.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:47:41.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:47:10, diff=31.41906s, valid=True
2026-05-30T06:47:41.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:47:41.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:47:41.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:47:41.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:47:41.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:47:41.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:47:41.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:47:12, diff=29.422253s, valid=True
2026-05-30T06:47:41.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:47:41.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:47:41.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:47:41.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1049103.422955s, valid=True
2026-05-30T06:47:41.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:47:41.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:47:41.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:47:41.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:47:41.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:47:41.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:47:41.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:47:41.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:47:41.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:47:41.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:47:41.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:47:41.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:47:41.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:47:41.739 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:47:41.937 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:47:42.329 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:47:42.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:47:42.429 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:47:42.429 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:47:42.613 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:47:42.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:48:12.627 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:48:12.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:48:12.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:48:12.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:48:12.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:48:13.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:48:13.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-05-30T06:48:13.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:48:13.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-05-30T06:48:13.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:48:13.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:48:13.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:48:13.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-05-30T06:48:16.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-05-30T06:48:16.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:48:16.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:48:16.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:48:16.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:48:16.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:48:16.348 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:48:16.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:48:16.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:48:16.349 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:48:16.349 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:48:16.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:48:16.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:48:16.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:48:16.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:48:16.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:48:16.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:48:16.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:48:16.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:48:16.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:48:16.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:48:16.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:48:16.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:48:16.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:48:13
2026-05-30T06:48:16.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74018, datetime.datetime(2026, 5, 30, 6, 48, 13), datetime.datetime(2026, 5, 30, 6, 48, 13), 'salt', 10.91, 47.81, None, 15.42, 329.31, 10.62, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:48:16.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:48:16.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:48:16.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:48:13, diff=3.73674s, valid=True
2026-05-30T06:48:16.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:48:16.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:48:16.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:48:12, diff=4.740103s, valid=True
2026-05-30T06:48:16.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:48:16.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:48:16.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:48:10, diff=6.747995s, valid=True
2026-05-30T06:48:16.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:48:16.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:48:16.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:48:16.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:48:16.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:48:16.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:48:16.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:48:12, diff=4.751592s, valid=True
2026-05-30T06:48:16.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:48:16.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:48:16.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:48:16.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1049138.752374s, valid=True
2026-05-30T06:48:16.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:48:16.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:48:16.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:48:16.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:48:16.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:48:16.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:48:16.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:48:16.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:48:16.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:48:16.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:48:16.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:48:16.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:48:17.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:48:17.078 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:48:17.276 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:48:17.607 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:48:17.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:48:17.707 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:48:17.707 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:48:17.891 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:48:17.891 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:48:47.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:48:47.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:48:47.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:48:48.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:48:48.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:48:48.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:48:48.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-05-30T06:48:48.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:48:48.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-05-30T06:48:48.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:48:48.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:48:48.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:48:48.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-05-30T06:48:51.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-05-30T06:48:51.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:48:51.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:48:51.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:48:51.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:48:51.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:48:51.842 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:48:51.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:48:51.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:48:51.843 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:48:51.843 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:48:51.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:48:51.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:48:51.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:48:52.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:48:52.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:48:52.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:48:52.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:48:52.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:48:52.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:48:52.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:48:52.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:48:52.161 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:48:52.222 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:48:43
2026-05-30T06:48:52.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74019, datetime.datetime(2026, 5, 30, 6, 48, 43), datetime.datetime(2026, 5, 30, 6, 48, 43), 'salt', 10.91, 47.98, None, 16.8, 334.73, 10.58, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:48:52.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:48:52.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:48:52.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:48:43, diff=9.230098s, valid=True
2026-05-30T06:48:52.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:48:52.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:48:52.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:49:12, diff=-19.766385s, valid=True
2026-05-30T06:48:52.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:48:52.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:48:52.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:48:40, diff=12.241929s, valid=True
2026-05-30T06:48:52.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:48:52.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:48:52.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:48:52.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:48:52.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:48:52.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:48:52.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:49:12, diff=-19.754282s, valid=True
2026-05-30T06:48:52.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:48:52.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:48:52.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:48:52.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1049174.246531s, valid=True
2026-05-30T06:48:52.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:48:52.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:48:52.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:48:52.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:48:52.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:48:52.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:48:52.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:48:52.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:48:52.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:48:52.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:48:52.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:48:52.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:48:52.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:48:52.567 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:48:52.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:48:53.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:48:53.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:48:53.282 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:48:53.282 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:48:53.463 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:48:53.463 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:49:23.480 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:49:23.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:49:23.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:49:23.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:49:23.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:49:23.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:49:23.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-05-30T06:49:24.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:49:24.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-05-30T06:49:24.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:49:24.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:49:24.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:49:24.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-05-30T06:51:30.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-05-30T06:51:30.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:51:30.363 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:51:30.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:51:30.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:51:30.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:51:30.386 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:51:30.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:51:30.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:51:30.387 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:51:30.387 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:51:30.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:51:30.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:51:30.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:51:30.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:51:30.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:51:30.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:51:30.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:51:30.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:51:30.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:51:30.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:51:30.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:51:30.708 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:51:30.773 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:51:15
2026-05-30T06:51:30.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74024, datetime.datetime(2026, 5, 30, 6, 51, 15), datetime.datetime(2026, 5, 30, 6, 51, 14), 'salt', 10.78, 48.41, None, 16.66, 330.83, 10.44, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:51:30.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:51:30.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:51:30.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:51:14, diff=16.781657s, valid=True
2026-05-30T06:51:30.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:51:30.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:51:30.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:51:12, diff=18.785343s, valid=True
2026-05-30T06:51:30.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:51:30.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:51:30.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:51:12, diff=18.793908s, valid=True
2026-05-30T06:51:30.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:51:30.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:51:30.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:51:30.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:51:30.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:51:30.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:51:30.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:51:12, diff=18.797806s, valid=True
2026-05-30T06:51:30.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:51:30.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:51:30.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:51:30.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1049332.798655s, valid=True
2026-05-30T06:51:30.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:51:30.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:51:30.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:51:30.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:51:30.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:51:30.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:51:30.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:51:30.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:51:30.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:51:30.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:51:30.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:51:31.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:51:31.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:51:31.121 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:51:31.328 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:51:31.668 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:51:31.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:51:31.769 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:51:31.769 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:51:31.958 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:51:31.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:52:01.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:52:01.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:52:01.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:52:02.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:52:02.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:52:02.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:52:02.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-05-30T06:52:02.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:52:02.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-05-30T06:52:02.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:52:02.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:52:02.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:52:02.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-05-30T06:52:06.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-05-30T06:52:06.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:52:06.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:52:06.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:52:06.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:52:06.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:52:06.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:52:06.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:52:06.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:52:06.664 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:52:06.664 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:52:06.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:52:06.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:52:06.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:52:06.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:52:06.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:52:06.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:52:06.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:52:06.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:52:06.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:52:06.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:52:06.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:52:06.991 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:52:07.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:51:45
2026-05-30T06:52:07.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74025, datetime.datetime(2026, 5, 30, 6, 51, 45), datetime.datetime(2026, 5, 30, 6, 51, 44), 'salt', 10.78, 48.24, None, 15.95, 323.42, 10.49, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:52:07.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:52:07.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:52:07.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:51:44, diff=23.063353s, valid=True
2026-05-30T06:52:07.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:52:07.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:52:07.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:52:12, diff=-4.93312s, valid=True
2026-05-30T06:52:07.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:52:07.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:52:07.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:51:42, diff=25.075111s, valid=True
2026-05-30T06:52:07.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:52:07.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:52:07.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:52:07.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:52:07.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:52:07.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:52:07.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:52:12, diff=-4.921135s, valid=True
2026-05-30T06:52:07.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:52:07.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:52:07.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:52:07.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1049369.079691s, valid=True
2026-05-30T06:52:07.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:52:07.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:52:07.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:52:07.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:52:07.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:52:07.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:52:07.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:52:07.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:52:07.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:52:07.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:52:07.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:52:07.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:52:07.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:52:07.469 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:52:07.681 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:52:08.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:52:08.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:52:08.126 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:52:08.126 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:52:08.319 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:52:08.319 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:52:38.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:52:38.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:52:38.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:52:38.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:52:38.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:52:38.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:52:38.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-05-30T06:52:38.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:52:38.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-05-30T06:52:38.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:52:38.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:52:38.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:52: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-05-30T06:52:41.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-05-30T06:52:41.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:52:41.845 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:52:41.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:52:41.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:52:41.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:52:41.869 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:52:41.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:52:41.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:52:41.870 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:52:41.870 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:52:41.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:52:41.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:52:41.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:52:42.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:52:42.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:52:42.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:52:42.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:52:42.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:52:42.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:52:42.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:52:42.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:52:42.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:52:42.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:52:15
2026-05-30T06:52:42.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74026, datetime.datetime(2026, 5, 30, 6, 52, 15), datetime.datetime(2026, 5, 30, 6, 52, 15), 'salt', 10.92, 47.81, None, 16.8, 330.72, 10.63, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:52:42.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:52:42.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:52:42.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:52:15, diff=27.226649s, valid=True
2026-05-30T06:52:42.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:52:42.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:52:42.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:52:12, diff=30.230008s, valid=True
2026-05-30T06:52:42.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:52:42.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:52:42.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:52:12, diff=30.237746s, valid=True
2026-05-30T06:52:42.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:52:42.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:52:42.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:52:42.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:52:42.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:52:42.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:52:42.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:52:12, diff=30.241304s, valid=True
2026-05-30T06:52:42.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:52:42.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:52:42.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:52:42.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1049404.242091s, valid=True
2026-05-30T06:52:42.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:52:42.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:52:42.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:52:42.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:52:42.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:52:42.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:52:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:52:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:52:42.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:52:42.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:52:42.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:52:42.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:52:42.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:52:42.562 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:52:42.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:52:43.115 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:52:43.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:52:43.216 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:52:43.216 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:52:43.486 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:52:43.487 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:53:13.516 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:53:13.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:53:13.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:53:14.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:53:14.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:53:14.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:53:14.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-05-30T06:53:14.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:53:14.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-05-30T06:53:14.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:53:14.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:53:14.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:53:14.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-05-30T06:53:17.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-05-30T06:53:17.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:53:17.805 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:53:17.806 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:53:17.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:53:17.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:53:17.830 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:53:17.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:53:17.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:53:17.831 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:53:17.831 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:53:17.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:53:17.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:53:17.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:53:18.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:53:18.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:53:18.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:53:18.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:53:18.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:53:18.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:53:18.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:53:18.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:53:18.170 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:53:18.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:53:16
2026-05-30T06:53:18.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74028, datetime.datetime(2026, 5, 30, 6, 53, 16), datetime.datetime(2026, 5, 30, 6, 53, 15), 'salt', 11.05, 47.58, None, 16.8, 319.94, 10.71, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:53:18.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:53:18.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:53:18.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:53:15, diff=3.251017s, valid=True
2026-05-30T06:53:18.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:53:18.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:53:18.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:53:12, diff=6.254549s, valid=True
2026-05-30T06:53:18.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:53:18.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:53:18.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:53:13, diff=5.263018s, valid=True
2026-05-30T06:53:18.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:53:18.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:53:18.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:53:18.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:53:18.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:53:18.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:53:18.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:53:12, diff=6.266784s, valid=True
2026-05-30T06:53:18.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:53:18.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:53:18.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:53:18.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1049440.267607s, valid=True
2026-05-30T06:53:18.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:53:18.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:53:18.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:53:18.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:53:18.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:53:18.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:53:18.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:53:18.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:53:18.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:53:18.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:53:18.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:53:18.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:53:18.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:53:18.657 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:53:18.868 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:53:19.211 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:53:19.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:53:19.314 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:53:19.314 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:53:19.571 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:53:19.571 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:53:49.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:53:49.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:53:49.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:53:49.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:53:49.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:53:50.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:53:50.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-05-30T06:53:50.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:53:50.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-05-30T06:53:50.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:53:50.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:53:50.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:53:50.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T06:53:54.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-05-30T06:53:54.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:53:54.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:53:54.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:53:54.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:53:54.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:53:54.058 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:53:54.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:53:54.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:53:54.059 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:53:54.059 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:53:54.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:53:54.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:53:54.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:53:54.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:53:54.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:53:54.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:53:54.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:53:54.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:53:54.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:53:54.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:53:54.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:53:54.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:53:54.464 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:53:46
2026-05-30T06:53:54.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74029, datetime.datetime(2026, 5, 30, 6, 53, 46), datetime.datetime(2026, 5, 30, 6, 53, 46), 'salt', 11.01, 47.51, None, 18.56, 334.4, 10.72, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:53:54.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:53:54.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:53:54.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:53:46, diff=8.471366s, valid=True
2026-05-30T06:53:54.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:53:54.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:53:54.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:54:12, diff=-17.525275s, valid=True
2026-05-30T06:53:54.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:53:54.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:53:54.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:53:44, diff=10.482646s, valid=True
2026-05-30T06:53:54.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:53:54.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:53:54.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:53:54.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:53:54.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:53:54.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:53:54.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:54:12, diff=-17.513722s, valid=True
2026-05-30T06:53:54.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:53:54.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:53:54.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:53:54.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1049476.487097s, valid=True
2026-05-30T06:53:54.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:53:54.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:53:54.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:53:54.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:53:54.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:53:54.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:53:54.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:53:54.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:53:54.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:53:54.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:53:54.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:53:54.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:53:54.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:53:54.816 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:53:55.030 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:53:55.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:53:55.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:53: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-05-30T06:53: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-05-30T06:53:55.572 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:53:55.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:54:25.576 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:54:25.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:54:25.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:54:25.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:54:25.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:54:26.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:54:26.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-05-30T06:54:26.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:54:26.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-05-30T06:54:26.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:54:26.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:54:26.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:54:26.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-05-30T06:54:31.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-05-30T06:54:31.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:54:31.253 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:54:31.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:54:31.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:54:31.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:54:31.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:54:31.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:54:31.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:54:31.278 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:54:31.278 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:54:31.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:54:31.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:54:31.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:54:31.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:54:31.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:54:31.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:54:31.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:54:31.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:54:31.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:54:31.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:54:31.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:54:31.603 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:54:31.682 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:54:16
2026-05-30T06:54:31.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74030, datetime.datetime(2026, 5, 30, 6, 54, 16), datetime.datetime(2026, 5, 30, 6, 54, 16), 'salt', 10.98, 48.01, None, 16.27, 329.02, 10.57, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:54:31.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:54:31.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:54:31.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:54:16, diff=15.688634s, valid=True
2026-05-30T06:54:31.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:54:31.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:54:31.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:54:12, diff=19.691513s, valid=True
2026-05-30T06:54:31.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:54:31.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:54:31.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:54:15, diff=16.698162s, valid=True
2026-05-30T06:54:31.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:54:31.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:54:31.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:54:31.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:54:31.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:54:31.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:54:31.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:54:12, diff=19.701233s, valid=True
2026-05-30T06:54:31.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:54:31.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:54:31.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:54:31.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1049513.701922s, valid=True
2026-05-30T06:54:31.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:54:31.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:54:31.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:54:31.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:54:31.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:54:31.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:54:31.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:54:31.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:54:31.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:54:31.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:54:31.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:54:31.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:54:31.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:54:32.020 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:54:32.242 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:54:32.589 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:54:32.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:54:32.688 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:54:32.688 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:54:32.974 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:54:32.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:55:02.985 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:55:02.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:55:02.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:55:03.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:55:03.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:55:03.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:55:03.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-05-30T06:55:03.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:55:03.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T06:55:03.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:55:03.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:55:03.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:55:03.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T06:57:26.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-05-30T06:57:26.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T06:57:26.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T06:57:26.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T06:57:26.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T06:57:26.848 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T06:57:26.848 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T06:57:26.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T06:57:26.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T06:57:26.849 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T06:57:26.850 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T06:57:26.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T06:57:26.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T06:57:26.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T06:57:27.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T06:57:27.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:57:27.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:57:27.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T06:57:27.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T06:57:27.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T06:57:27.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T06:57:27.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T06:57:27.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T06:57:27.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:57:18
2026-05-30T06:57:27.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74036, datetime.datetime(2026, 5, 30, 6, 57, 18), datetime.datetime(2026, 5, 30, 6, 57, 17), 'salt', 10.98, 48.04, None, 14.01, 329.78, 10.56, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T06:57:27.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T06:57:27.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T06:57:27.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:57:17, diff=10.278333s, valid=True
2026-05-30T06:57:27.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T06:57:27.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:57:27.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:57:12, diff=15.281881s, valid=True
2026-05-30T06:57:27.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T06:57:27.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T06:57:27.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:57:14, diff=13.290213s, valid=True
2026-05-30T06:57:27.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T06:57:27.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:57:27.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T06:57:27.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T06:57:27.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T06:57:27.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T06:57:27.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:57:12, diff=15.293997s, valid=True
2026-05-30T06:57:27.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T06:57:27.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T06:57:27.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T06:57:27.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1049689.294824s, valid=True
2026-05-30T06:57:27.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T06:57:27.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T06:57:27.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T06:57:27.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T06:57:27.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T06:57:27.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T06:57:27.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T06:57:27.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T06:57:27.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T06:57:27.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T06:57:27.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T06:57:27.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T06:57:27.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T06:57:27.615 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T06:57:27.823 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:57:28.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T06:57:28.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T06:57:28.266 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T06:57:28.266 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T06:57:28.464 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T06:57:28.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T06:57:58.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T06:57:58.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T06:57:58.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T06:57:58.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T06:57:58.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T06:57:59.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T06:57:59.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-05-30T06:57:59.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T06:57:59.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-05-30T06:57:59.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T06:57:59.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T06:57:59.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T06:57:59.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-05-30T07:00:08.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-05-30T07:00:08.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:00:08.630 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:00:08.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:00:08.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:00:08.654 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:00:08.655 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:00:08.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:00:08.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:00:08.656 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:00:08.656 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:00:08.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:00:08.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:00:08.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:00:08.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:00:08.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:00:08.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:00:08.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:00:08.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:00:08.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:00:08.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:00:08.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:00:08.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:00:09.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 06:59:49
2026-05-30T07:00:09.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74041, datetime.datetime(2026, 5, 30, 6, 59, 49), datetime.datetime(2026, 5, 30, 6, 59, 49), 'salt', 10.98, 48.57, None, 16.66, 332.85, 10.41, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:00:09.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:00:09.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:00:09.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:59:49, diff=20.068971s, valid=True
2026-05-30T07:00:09.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:00:09.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:00:09.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:00:12, diff=-2.927538s, valid=True
2026-05-30T07:00:09.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:00:09.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:00:09.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 06:59:46, diff=23.080686s, valid=True
2026-05-30T07:00:09.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:00:09.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:00:09.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:00:09.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:00:09.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:00:09.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:00:09.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:00:12, diff=-2.915568s, valid=True
2026-05-30T07:00:09.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:00:09.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:00:09.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:00:09.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1049851.085248s, valid=True
2026-05-30T07:00:09.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:00:09.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:00:09.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:00:09.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:00:09.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:00:09.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:00:09.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:00:09.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:00:09.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:00:09.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:00:09.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:00:09.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:00:09.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:00:09.405 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:00:09.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:00:09.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:00:10.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:00:10.097 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:00:10.097 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:00:10.287 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:00:10.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:00:40.292 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:00:40.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:00:40.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:00:40.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:00:40.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:00:40.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:00: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-05-30T07:00:40.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:00:40.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-05-30T07:00:40.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:00:40.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:00:40.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:00:40.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-05-30T07:00:46.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-05-30T07:00:46.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:00:46.527 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:00:46.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:00:46.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:00:46.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:00:46.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:00:46.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:00:46.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:00:46.550 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:00:46.550 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:00:46.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:00:46.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:00:46.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:00:46.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:00:46.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:00:46.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:00:46.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:00:46.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:00:46.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:00:46.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:00:46.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:00:46.867 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:00:46.929 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:00:19
2026-05-30T07:00:46.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74042, datetime.datetime(2026, 5, 30, 7, 0, 19), datetime.datetime(2026, 5, 30, 7, 0, 19), 'salt', 11.05, 48.71, None, 16.66, 335.34, 10.38, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:00:46.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:00:46.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:00:46.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:00:19, diff=27.937437s, valid=True
2026-05-30T07:00:46.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:00:46.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:00:46.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:00:12, diff=34.940964s, valid=True
2026-05-30T07:00:46.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:00:46.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:00:46.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:00:16, diff=30.949146s, valid=True
2026-05-30T07:00:46.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:00:46.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:00:46.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:00:46.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:00:46.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:00:46.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:00:46.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:00:12, diff=34.952798s, valid=True
2026-05-30T07:00:46.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:00:46.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:00:46.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:00:46.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1049888.953607s, valid=True
2026-05-30T07:00:46.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:00:46.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:00:46.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:00:46.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:00:46.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:00:47.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:00:47.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:00:47.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:00:47.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:00:47.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:00:47.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:00:47.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:00:47.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:00:47.271 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:00:47.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:00:47.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:00:47.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:00:47.979 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:00:47.979 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:00:48.236 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:00:48.236 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:01:18.252 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:01:18.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:01:18.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:01:18.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:01:18.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:01:18.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:01:18.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-05-30T07:01:18.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:01:18.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-05-30T07:01:18.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:01:18.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:01:18.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:01:18.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-05-30T07:01:22.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-05-30T07:01:22.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:01:22.313 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:01:22.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:01:22.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:01:22.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:01:22.337 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:01:22.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:01:22.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:01:22.339 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:01:22.339 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:01:22.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:01:22.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:01:22.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:01:22.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:01:22.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:01:22.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:01:22.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:01:22.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:01:22.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:01:22.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:01:22.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:01:22.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:01:22.716 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:01:20
2026-05-30T07:01:22.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74044, datetime.datetime(2026, 5, 30, 7, 1, 20), datetime.datetime(2026, 5, 30, 7, 1, 20), 'salt', 10.98, 48.97, None, 15.88, 336.52, 10.3, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:01:22.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:01:22.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:01:22.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:01:20, diff=2.724289s, valid=True
2026-05-30T07:01:22.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:01:22.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:01:22.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:01:12, diff=10.727703s, valid=True
2026-05-30T07:01:22.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:01:22.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:01:22.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:01:16, diff=6.735664s, valid=True
2026-05-30T07:01:22.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:01:22.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:01:22.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:01:22.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:01:22.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:01:22.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:01:22.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:01:12, diff=10.739288s, valid=True
2026-05-30T07:01:22.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:01:22.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:01:22.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:01:22.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1049924.740076s, valid=True
2026-05-30T07:01:22.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:01:22.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:01:22.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:01:22.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:01:22.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:01:22.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:01:22.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:01:22.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:01:22.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:01:22.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:01:22.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:01:22.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:01:23.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:01:23.060 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:01:23.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:01:23.607 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:01:23.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:01:23.706 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:01:23.706 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:01:23.929 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:01:23.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:01:53.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:01:53.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:01:53.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:01:54.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:01:54.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:01:54.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:01:54.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-05-30T07:01:54.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:01: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-05-30T07:01:54.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:01:54.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:01:54.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:01:54.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-05-30T07:01:57.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T07:01:57.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:01:57.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:01:57.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:01:57.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:01:57.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:01:57.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:01:57.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:01:57.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:01:57.569 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:01:57.569 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:01:57.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:01:57.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:01:57.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:01:57.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:01:57.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:01:57.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:01:57.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:01:57.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:01:57.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:01:57.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:01:57.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:01:57.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:01:57.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:01:50
2026-05-30T07:01:57.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74045, datetime.datetime(2026, 5, 30, 7, 1, 50), datetime.datetime(2026, 5, 30, 7, 1, 49), 'salt', 11.11, 48.54, None, 16.27, 325.93, 10.43, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:01:57.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:01:57.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:01:57.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:01:49, diff=8.959408s, valid=True
2026-05-30T07:01:57.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:01:57.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:01:57.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:02:12, diff=-14.037065s, valid=True
2026-05-30T07:01:57.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:01:57.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:01:57.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:01:47, diff=10.971279s, valid=True
2026-05-30T07:01:57.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:01:57.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:01:57.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:01:57.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:01:57.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:01:57.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:01:57.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:02:12, diff=-14.024098s, valid=True
2026-05-30T07:01:57.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:01:57.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:01:57.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:01:57.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1049959.977255s, valid=True
2026-05-30T07:01:57.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:01:57.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:01:57.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:01:57.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:01:57.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:01:58.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:01:58.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:01:58.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:01:58.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:01:58.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:01:58.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:01:58.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:01:58.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:01:58.373 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:01:58.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:01:58.917 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:01:59.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:01:59.017 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:01:59.017 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:01:59.271 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:01:59.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:02:29.301 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:02:29.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:02:29.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:02:29.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:02:29.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:02:29.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:02:29.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-05-30T07:02:29.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:02:29.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-05-30T07:02:29.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:02:29.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:02:29.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:02:29.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T07:02:33.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-05-30T07:02:33.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:02:33.274 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:02:33.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:02:33.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:02:33.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:02:33.301 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:02:33.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:02:33.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:02:33.302 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:02:33.303 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:02:33.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:02:33.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:02:33.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:02:33.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:02:33.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:02:33.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:02:33.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:02:33.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:02:33.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:02:33.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:02:33.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:02:33.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:02:33.689 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:02:21
2026-05-30T07:02:33.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74046, datetime.datetime(2026, 5, 30, 7, 2, 21), datetime.datetime(2026, 5, 30, 7, 2, 20), 'salt', 11.25, 48.04, None, 13.97, 328.72, 10.59, 831.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:02:33.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:02:33.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:02:33.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:02:20, diff=13.69695s, valid=True
2026-05-30T07:02:33.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:02:33.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:02:33.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:02:12, diff=21.700517s, valid=True
2026-05-30T07:02:33.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:02:33.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:02:33.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:02:18, diff=15.708857s, valid=True
2026-05-30T07:02:33.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:02:33.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:02:33.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:02:33.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:02:33.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:02:33.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:02:33.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:02:12, diff=21.71267s, valid=True
2026-05-30T07:02:33.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:02:33.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:02:33.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:02:33.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1049995.713492s, valid=True
2026-05-30T07:02:33.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:02:33.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:02:33.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:02:33.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:02:33.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:02:33.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:02:33.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:02:33.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:02:33.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:02:33.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:02:33.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:02:33.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:02:33.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:02:34.033 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:02:34.239 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:02:34.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:02:34.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:02:34.679 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:02:34.679 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:02:34.868 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:02:34.868 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:03:04.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:03:04.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:03:04.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:03:05.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:03:05.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:03:05.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:03:05.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-05-30T07:03:05.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:03:05.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-05-30T07:03:05.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:03:05.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:03:05.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:03:05.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-05-30T07:03:08.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-05-30T07:03:08.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:03:08.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:03:08.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:03:08.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:03:08.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:03:08.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:03:08.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:03:08.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:03:08.415 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:03:08.415 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:03:08.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:03:08.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:03:08.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:03:08.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:03:08.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:03:08.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:03:08.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:03:08.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:03:08.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:03:08.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:03:08.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:03:08.728 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:03:08.790 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:02:51
2026-05-30T07:03:08.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74047, datetime.datetime(2026, 5, 30, 7, 2, 51), datetime.datetime(2026, 5, 30, 7, 2, 50), 'salt', 11.25, 48.08, None, 14.5, 321.89, 10.58, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:03:08.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:03:08.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:03:08.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:02:50, diff=18.798505s, valid=True
2026-05-30T07:03:08.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:03:08.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:03:08.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:03:12, diff=-3.197941s, valid=True
2026-05-30T07:03:08.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:03:08.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:03:08.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:02:49, diff=19.810487s, valid=True
2026-05-30T07:03:08.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:03:08.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:03:08.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:03:08.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:03:08.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:03:08.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:03:08.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:03:12, diff=-3.185714s, valid=True
2026-05-30T07:03:08.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:03:08.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:03:08.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:03:08.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050030.815119s, valid=True
2026-05-30T07:03:08.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:03:08.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:03:08.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:03:08.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:03:08.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:03:08.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:03:08.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:03:08.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:03:08.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:03:08.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:03:09.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:03:09.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:03:09.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:03:09.206 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:03:09.412 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:03:09.752 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:03:09.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:03:09.855 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:03:09.855 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:03:10.039 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:03:10.039 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:03:40.069 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:03:40.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:03:40.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:03:40.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:03:40.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:03:40.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:03:40.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-05-30T07:03:40.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:03:40.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T07:03:40.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:03:40.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:03:40.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:03:40.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-05-30T07:03:43.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-05-30T07:03:43.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:03:43.686 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:03:43.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:03:43.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:03:43.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:03:43.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:03:43.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:03:43.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:03:43.711 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:03:43.711 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:03:43.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:03:43.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:03:43.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:03:43.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:03:43.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:03:43.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:03:43.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:03:44.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:03:44.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:03:44.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:03:44.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:03:44.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:03:44.094 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:03:21
2026-05-30T07:03:44.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74048, datetime.datetime(2026, 5, 30, 7, 3, 21), datetime.datetime(2026, 5, 30, 7, 3, 20), 'salt', 11.28, 48.41, None, 16.59, 315.55, 10.49, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:03:44.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:03:44.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:03:44.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:03:20, diff=24.102131s, valid=True
2026-05-30T07:03:44.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:03:44.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:03:44.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:03:12, diff=32.105709s, valid=True
2026-05-30T07:03:44.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:03:44.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:03:44.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:03:21, diff=23.113959s, valid=True
2026-05-30T07:03:44.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:03:44.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:03:44.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:03:44.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:03:44.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:03:44.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:03:44.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:03:12, diff=32.117721s, valid=True
2026-05-30T07:03:44.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:03:44.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:03:44.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:03:44.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050066.11853s, valid=True
2026-05-30T07:03:44.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:03:44.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:03:44.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:03:44.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:03:44.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:03:44.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:03:44.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:03:44.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:03:44.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:03:44.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:03:44.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:03:44.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:03:44.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:03:44.441 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:03:44.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:03:44.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:03:45.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:03:45.094 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:03:45.094 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:03:45.354 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:03:45.354 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:04:15.384 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:04:15.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:04:15.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:04:15.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:04:15.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:04:15.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:04:15.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-05-30T07:04:15.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:04:15.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-05-30T07:04:15.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:04:15.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:04:15.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:04:15.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-05-30T07:04:18.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-05-30T07:04:18.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:04:18.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:04:18.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:04:18.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:04:18.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:04:18.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:04:18.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:04:18.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:04:18.926 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:04:18.926 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:04:18.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:04:19.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:04:19.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:04:19.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:04:19.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:04:19.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:04:19.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:04:19.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:04:19.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:04:19.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:04:19.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:04:19.252 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:04:19.314 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:03:51
2026-05-30T07:04:19.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74049, datetime.datetime(2026, 5, 30, 7, 3, 51), datetime.datetime(2026, 5, 30, 7, 3, 50), 'salt', 11.35, 48.27, None, 16.27, 334.26, 10.53, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:04:19.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:04:19.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:04:19.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:03:50, diff=29.322214s, valid=True
2026-05-30T07:04:19.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:04:19.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:04:19.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:04:12, diff=7.325731s, valid=True
2026-05-30T07:04:19.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:04:19.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:04:19.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:03:47, diff=32.334195s, valid=True
2026-05-30T07:04:19.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:04:19.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:04:19.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:04:19.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:04:19.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:04:19.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:04:19.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:04:12, diff=7.338012s, valid=True
2026-05-30T07:04:19.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:04:19.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:04:19.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:04:19.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050101.338847s, valid=True
2026-05-30T07:04:19.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:04:19.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:04:19.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:04:19.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:04:19.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:04:19.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:04:19.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:04:19.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:04:19.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:04:19.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:04:19.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:04:19.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:04:19.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:04:19.734 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:04:19.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:04:20.307 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:04:20.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:04:20.411 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:04:20.411 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:04:20.600 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:04:20.600 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:04:50.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:04:50.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:04:50.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:04:50.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:04:50.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:04:51.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:04:51.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T07:04:51.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:04:51.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-05-30T07:04:51.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:04:51.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:04:51.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:04:51.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-05-30T07:06:32.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-05-30T07:06:32.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:06:32.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:06:32.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:06:32.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:06:32.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:06:32.493 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:06:32.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:06:32.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:06:32.493 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:06:32.493 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:06:32.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:06:32.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:06:32.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:06:32.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:06:32.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:06:32.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:06:32.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:06:32.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:06:32.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:06:32.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:06:32.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:06:32.832 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:06:32.904 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:06:23
2026-05-30T07:06:32.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74054, datetime.datetime(2026, 5, 30, 7, 6, 23), datetime.datetime(2026, 5, 30, 7, 6, 22), 'salt', 11.35, 48.74, None, 15.21, 324.87, 10.4, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:06:32.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:06:32.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:06:32.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:06:22, diff=10.912153s, valid=True
2026-05-30T07:06:32.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:06:32.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:06:32.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:06:12, diff=20.915524s, valid=True
2026-05-30T07:06:32.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:06:32.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:06:32.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:06:19, diff=13.92346s, valid=True
2026-05-30T07:06:32.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:06:32.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:06:32.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:06:32.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:06:32.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:06:32.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:06:32.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:06:12, diff=20.927088s, valid=True
2026-05-30T07:06:32.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:06:32.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:06:32.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:06:32.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050234.927863s, valid=True
2026-05-30T07:06:32.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:06:32.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:06:32.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:06:32.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:06:32.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:06:32.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:06:32.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:06:32.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:06:33.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:06:33.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:06:33.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:06:33.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:06:33.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:06:33.241 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:06:33.470 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:06:33.810 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:06:33.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:06:33.910 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:06:33.910 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:06:34.145 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:06:34.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:07:04.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:07:04.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:07:04.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:07:04.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:07:04.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:07:05.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:07:05.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-05-30T07:07:05.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:07:05.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-05-30T07:07:05.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:07:05.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:07:05.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:07:05.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-05-30T07:07:07.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-05-30T07:07:07.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:07:07.768 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:07:07.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:07:07.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:07:07.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:07:07.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:07:07.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:07:07.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:07:07.797 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:07:07.797 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:07:07.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:07:07.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:07:07.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:07:08.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:07:08.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:07:08.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:07:08.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:07:08.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:07:08.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:07:08.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:07:08.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:07:08.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:07:08.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:06:53
2026-05-30T07:07:08.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74055, datetime.datetime(2026, 5, 30, 7, 6, 53), datetime.datetime(2026, 5, 30, 7, 6, 52), 'salt', 11.25, 48.87, None, 15.24, 326.89, 10.35, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:07:08.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:07:08.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:07:08.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:06:52, diff=16.203831s, valid=True
2026-05-30T07:07:08.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:07:08.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:07:08.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:07:12, diff=-3.792805s, valid=True
2026-05-30T07:07:08.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:07:08.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:07:08.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:06:50, diff=18.215198s, valid=True
2026-05-30T07:07:08.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:07:08.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:07:08.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:07:08.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:07:08.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:07:08.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:07:08.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:07:12, diff=-3.781213s, valid=True
2026-05-30T07:07:08.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:07:08.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:07:08.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:07:08.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050270.219557s, valid=True
2026-05-30T07:07:08.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:07:08.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:07:08.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:07:08.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:07:08.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:07:08.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:07:08.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:07:08.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:07:08.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:07:08.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:07:08.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:07:08.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:07:08.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:07:08.540 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:07:08.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:07:09.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:07:09.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:07:09.188 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:07:09.188 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:07:09.383 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:07:09.383 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:07:39.403 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:07:39.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:07:39.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:07:39.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:07:39.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:07:39.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:07:39.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-05-30T07:07:39.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:07:39.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-05-30T07:07:39.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:07:39.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:07:39.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:07:39.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-05-30T07:08:46.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-05-30T07:08:46.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:08:46.788 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:08:46.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:08:46.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:08:46.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:08:46.809 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:08:46.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:08:46.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:08:46.810 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:08:46.811 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:08:46.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:08:46.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:08:46.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:08:47.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:08:47.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:08:47.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:08:47.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:08:47.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:08:47.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:08:47.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:08:47.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:08:47.134 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:08:47.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:08:23
2026-05-30T07:08:47.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74058, datetime.datetime(2026, 5, 30, 7, 8, 23), datetime.datetime(2026, 5, 30, 7, 8, 23), 'salt', 11.21, 48.9, None, 14.82, 324.78, 10.33, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:08:47.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:08:47.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:08:47.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:08:23, diff=24.201349s, valid=True
2026-05-30T07:08:47.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:08:47.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:08:47.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:08:12, diff=35.204645s, valid=True
2026-05-30T07:08:47.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:08:47.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:08:47.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:08:20, diff=27.21236s, valid=True
2026-05-30T07:08:47.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:08:47.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:08:47.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:08:47.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:08:47.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:08:47.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:08:47.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:08:12, diff=35.21587s, valid=True
2026-05-30T07:08:47.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:08:47.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:08:47.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:08:47.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050369.216635s, valid=True
2026-05-30T07:08:47.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:08:47.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:08:47.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:08:47.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:08:47.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:08:47.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:08:47.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:08:47.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:08:47.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:08:47.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:08:47.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:08:47.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:08:47.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:08:47.535 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:08:47.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:08:48.112 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:08:48.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:08:48.271 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:08:48.271 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:08:48.464 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:08:48.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:09:18.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:09:18.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:09:18.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:09:18.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:09:18.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:09:18.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:09:18.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-05-30T07:09:18.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:09:18.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-05-30T07:09:18.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:09:18.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:09:18.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:09:18.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-05-30T07:10:05.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-05-30T07:10:05.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:10:05.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:10:05.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:10:05.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:10:05.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:10:05.822 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:10:05.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:10:05.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:10:05.823 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:10:05.824 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:10:05.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:10:05.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:10:05.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:10:06.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:10:06.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:10:06.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:10:06.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:10:06.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:10:06.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:10:06.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:10:06.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:10:06.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:10:06.213 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:10:04
2026-05-30T07:10:06.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74061, datetime.datetime(2026, 5, 30, 7, 10, 4), datetime.datetime(2026, 5, 30, 7, 10, 4), 'salt', 11.48, 48.37, None, 14.19, 327.83, 10.51, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:10:06.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:10:06.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:10:06.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:10:04, diff=2.22113s, valid=True
2026-05-30T07:10:06.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:10:06.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:10:06.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:09:12, diff=54.224517s, valid=True
2026-05-30T07:10:06.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:10:06.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:10:06.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:10:01, diff=5.232614s, valid=True
2026-05-30T07:10:06.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:10:06.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:10:06.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:10:06.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:10:06.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:10:06.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:10:06.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:09:12, diff=54.236244s, valid=True
2026-05-30T07:10:06.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:10:06.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:10:06.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:10:06.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050448.237047s, valid=True
2026-05-30T07:10:06.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:10:06.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:10:06.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:10:06.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:10:06.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:10:06.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:10:06.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:10:06.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:10:06.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:10:06.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:10:06.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:10:06.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:10:06.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:10:06.560 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:10:06.770 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:10:07.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:10:07.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:10:07.213 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:10:07.213 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:10:07.415 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:10:07.416 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:10:37.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:10:37.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:10:37.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:10:37.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:10:37.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:10:37.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:10:37.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-05-30T07:10:37.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:10:37.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-05-30T07:10:38.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:10:38.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:10:38.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:10:38.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-05-30T07:10:47.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-05-30T07:10:47.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:10:47.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:10:47.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:10:47.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:10:47.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:10:47.393 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:10:47.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:10:47.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:10:47.394 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:10:47.394 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:10:47.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:10:47.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:10:47.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:10:47.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:10:47.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:10:47.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:10:47.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:10:47.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:10:47.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:10:47.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:10:47.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:10:47.711 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:10:47.773 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:10:34
2026-05-30T07:10:47.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74062, datetime.datetime(2026, 5, 30, 7, 10, 34), datetime.datetime(2026, 5, 30, 7, 10, 34), 'salt', 11.68, 47.64, None, 14.93, 330.37, 10.74, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:10:47.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:10:47.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:10:47.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:10:34, diff=13.781087s, valid=True
2026-05-30T07:10:47.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:10:47.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:10:47.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:11:12, diff=-24.215397s, valid=True
2026-05-30T07:10:47.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:10:47.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:10:47.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:10:31, diff=16.792973s, valid=True
2026-05-30T07:10:47.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:10:47.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:10:47.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:10:47.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:10:47.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:10:47.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:10:47.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:11:12, diff=-24.20319s, valid=True
2026-05-30T07:10:47.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:10:47.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:10:47.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:10:47.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050489.797647s, valid=True
2026-05-30T07:10:47.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:10:47.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:10:47.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:10:47.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:10:47.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:10:47.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:10:47.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:10:47.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:10:47.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:10:47.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:10:47.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:10:48.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:10:48.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:10:48.120 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:10:48.404 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:10:48.746 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:10:48.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:10:48.845 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:10:48.845 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:10:49.013 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:10:49.013 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:11:19.043 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:11:19.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:11:19.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:11:19.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:11:19.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:11:19.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:11:19.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-05-30T07:11:19.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:11:19.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-05-30T07:11:19.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:11:19.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:11:19.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:11:19.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-05-30T07:11:22.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T07:11:22.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:11:22.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:11:22.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:11:22.269 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:11:22.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:11:22.282 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:11:22.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:11:22.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:11:22.283 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:11:22.283 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:11:22.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:11:22.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:11:22.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:11:22.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:11:22.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:11:22.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:11:22.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:11:22.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:11:22.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:11:22.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:11:22.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:11:22.600 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:11:22.662 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:11:05
2026-05-30T07:11:22.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74063, datetime.datetime(2026, 5, 30, 7, 11, 5), datetime.datetime(2026, 5, 30, 7, 11, 4), 'salt', 11.68, 47.81, None, 13.41, 320.79, 10.69, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:11:22.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:11:22.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:11:22.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:11:04, diff=18.66986s, valid=True
2026-05-30T07:11:22.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:11:22.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:11:22.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:11:12, diff=10.673459s, valid=True
2026-05-30T07:11:22.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:11:22.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:11:22.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:11:02, diff=20.6818s, valid=True
2026-05-30T07:11:22.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:11:22.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:11:22.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:11:22.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:11:22.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:11:22.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:11:22.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:11:12, diff=10.685245s, valid=True
2026-05-30T07:11:22.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:11:22.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:11:22.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:11:22.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050524.68598s, valid=True
2026-05-30T07:11:22.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:11:22.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:11:22.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:11:22.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:11:22.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:11:22.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:11:22.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:11:22.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:11:22.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:11:22.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:11:22.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:11:22.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:11:22.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:11:23.007 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:11:23.215 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:11:23.553 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:11:23.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:11:23.653 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:11:23.653 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:11:23.811 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:11:23.811 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:11:53.841 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:11:53.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:11:53.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:11:54.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:11:54.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:11:54.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:11:54.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-05-30T07:11:54.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:11:54.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-05-30T07:11:54.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:11:54.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:11:54.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:11:54.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-05-30T07:11:57.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-05-30T07:11:57.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:11:57.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:11:57.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:11:57.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:11:57.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:11:57.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:11:57.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:11:57.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:11:57.085 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:11:57.086 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:11:57.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:11:57.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:11:57.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:11:57.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:11:57.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:11:57.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:11:57.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:11:57.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:11:57.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:11:57.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:11:57.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:11:57.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:11:57.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:11:35
2026-05-30T07:11:57.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74064, datetime.datetime(2026, 5, 30, 7, 11, 35), datetime.datetime(2026, 5, 30, 7, 11, 35), 'salt', 11.64, 47.81, None, 14.5, 330.37, 10.68, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:11:57.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:11:57.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:11:57.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:11:35, diff=22.475534s, valid=True
2026-05-30T07:11:57.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:11:57.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:11:57.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:12:12, diff=-14.52069s, valid=True
2026-05-30T07:11:57.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:11:57.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:11:57.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:11:34, diff=23.487455s, valid=True
2026-05-30T07:11:57.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:11:57.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:11:57.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:11:57.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:11:57.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:11:57.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:11:57.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:12:12, diff=-14.508855s, valid=True
2026-05-30T07:11:57.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:11:57.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:11:57.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:11:57.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050559.49196s, valid=True
2026-05-30T07:11:57.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:11:57.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:11:57.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:11:57.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:11:57.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:11:57.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:11:57.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:11:57.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:11:57.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:11:57.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:11:57.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:11:57.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:11:57.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:11:57.890 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:11:58.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:11:58.445 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:11:58.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:11:58.545 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:11:58.545 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:11:58.741 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:11:58.741 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:12:28.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:12:28.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:12:28.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:12:29.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:12:29.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:12:30.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:12:30.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-05-30T07:12:30.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:12:30.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-05-30T07:12:30.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:12:30.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:12:30.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:12:30.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-05-30T07:12:32.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-05-30T07:12:34.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:12:34.880 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:12:34.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:12:34.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:12:34.899 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:12:34.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:12:34.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:12:34.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:12:34.945 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:12:34.945 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:12:34.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:12:35.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:12:35.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:12:35.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:12:35.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:12:35.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:12:35.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:12:35.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:12:35.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:12:35.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:12:35.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:12:35.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:12:35.268 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:12:05
2026-05-30T07:12:35.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74065, datetime.datetime(2026, 5, 30, 7, 12, 5), datetime.datetime(2026, 5, 30, 7, 12, 5), 'salt', 11.55, 47.35, None, 14.82, 314.5, 10.82, 831.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:12:35.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:12:35.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:12:35.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:12:05, diff=30.278237s, valid=True
2026-05-30T07:12:35.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:12:35.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:12:35.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:12:12, diff=23.282423s, valid=True
2026-05-30T07:12:35.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:12:35.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:12:35.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:12:05, diff=30.292264s, valid=True
2026-05-30T07:12:35.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:12:35.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:12:35.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:12:35.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:12:35.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:12:35.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:12:35.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:12:12, diff=23.296259s, valid=True
2026-05-30T07:12:35.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:12:35.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:12:35.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:12:35.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050597.297163s, valid=True
2026-05-30T07:12:35.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:12:35.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:12:35.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:12:35.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:12:35.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:12:35.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:12:35.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:12:35.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:12:35.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:12:35.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:12:35.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:12:35.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:12:35.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:12:35.634 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:12:35.841 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:12:36.180 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:12:36.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:12: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-05-30T07:12: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-05-30T07:12:36.355 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:12:36.356 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:13:06.356 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:13:06.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:13:06.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:13:06.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:13:06.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:13:06.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:13:06.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-05-30T07:13:06.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:13:06.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-05-30T07:13:06.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:13:06.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:13:06.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:13:06.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-05-30T07:13:09.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-05-30T07:13:09.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:13:09.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:13:09.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:13:09.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:13:09.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:13:09.459 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:13:09.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:13:09.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:13:09.460 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:13:09.460 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:13:09.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:13:09.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:13:09.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:13:09.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:13:09.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:13:09.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:13:09.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:13:09.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:13:09.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:13:09.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:13:09.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:13:09.739 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:13:09.799 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:13:06
2026-05-30T07:13:09.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74067, datetime.datetime(2026, 5, 30, 7, 13, 6), datetime.datetime(2026, 5, 30, 7, 13, 5), 'salt', 11.55, 47.31, None, 12.99, 319.1, 10.83, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:13:09.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:13:09.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:13:09.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:13:05, diff=4.806093s, valid=True
2026-05-30T07:13:09.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:13:09.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:13:09.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:13:12, diff=-2.190845s, valid=True
2026-05-30T07:13:09.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:13:09.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:13:09.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:13:02, diff=7.816417s, valid=True
2026-05-30T07:13:09.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:13:09.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:13:09.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:13:09.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:13:09.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:13:09.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:13:09.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:13:12, diff=-2.180267s, valid=True
2026-05-30T07:13:09.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:13:09.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:13:09.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:13:09.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050631.820445s, valid=True
2026-05-30T07:13:09.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:13:09.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:13:09.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:13:09.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:13:09.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:13:09.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:13:09.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:13:09.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:13:09.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:13:09.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:13:10.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:13:10.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:13:10.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:13:10.236 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:13:10.459 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:13:10.799 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:13:10.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:13:10.900 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:13:10.900 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:13:11.148 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:13:11.148 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:13:41.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:13:41.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:13:41.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:13:41.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:13:41.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:13:41.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:13:41.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T07:13:41.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:13:41.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-05-30T07:13:41.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:13:41.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:13:41.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:13:41.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-05-30T07:13:44.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-05-30T07:13:44.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:13:44.536 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:13:44.536 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:13:44.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:13:44.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:13:44.560 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:13:44.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:13:44.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:13:44.561 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:13:44.561 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:13:44.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:13:44.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:13:44.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:13:44.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:13:44.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:13:44.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:13:44.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:13:44.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:13:44.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:13:44.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:13:44.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:13:44.884 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:13:44.945 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:13:37
2026-05-30T07:13:44.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74068, datetime.datetime(2026, 5, 30, 7, 13, 37), datetime.datetime(2026, 5, 30, 7, 13, 36), 'salt', 11.68, 47.31, None, 14.26, 330.48, 10.84, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:13:44.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:13:44.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:13:44.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:13:36, diff=8.953374s, valid=True
2026-05-30T07:13:44.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:13:44.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:13:44.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:14:12, diff=-27.043097s, valid=True
2026-05-30T07:13:44.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:13:44.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:13:44.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:13:32, diff=12.965286s, valid=True
2026-05-30T07:13:44.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:13:44.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:13:44.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:13:44.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:13:44.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:13:44.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:13:44.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:14:12, diff=-27.030964s, valid=True
2026-05-30T07:13:44.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:13:44.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:13:44.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:13:44.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050666.969876s, valid=True
2026-05-30T07:13:44.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:13:44.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:13:44.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:13:44.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:13:44.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:13:45.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:13:45.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:13:45.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:13:45.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:13:45.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:13:45.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:13:45.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:13:45.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:13:45.290 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:13:45.497 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:13:45.838 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:13:45.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:13:45.938 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:13:45.938 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:13:46.128 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:13:46.128 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:14:16.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:14:16.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:14:16.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:14:16.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:14:16.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:14:16.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:14:16.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-05-30T07:14:16.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:14:16.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-05-30T07:14:16.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:14:16.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:14:16.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:14:16.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-05-30T07:14:19.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-05-30T07:14:19.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:14:19.640 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:14:19.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:14:19.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:14:19.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:14:19.664 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:14:19.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:14:19.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:14:19.665 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:14:19.666 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:14:19.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:14:19.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:14:19.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:14:19.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:14:19.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:14:19.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:14:19.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:14:19.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:14:19.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:14:19.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:14:19.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:14:19.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:14:20.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:14:07
2026-05-30T07:14:20.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74069, datetime.datetime(2026, 5, 30, 7, 14, 7), datetime.datetime(2026, 5, 30, 7, 14, 6), 'salt', 11.71, 47.38, None, 13.16, 312.57, 10.82, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:14:20.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:14:20.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:14:20.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:14:06, diff=14.052026s, valid=True
2026-05-30T07:14:20.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:14:20.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:14:20.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:14:12, diff=8.055882s, valid=True
2026-05-30T07:14:20.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:14:20.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:14:20.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:14:02, diff=18.063863s, valid=True
2026-05-30T07:14:20.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:14:20.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:14:20.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:14:20.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:14:20.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:14:20.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:14:20.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:14:12, diff=8.067027s, valid=True
2026-05-30T07:14:20.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:14:20.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:14:20.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:14:20.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050702.067717s, valid=True
2026-05-30T07:14:20.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:14:20.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:14:20.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:14:20.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:14:20.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:14:20.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:14:20.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:14:20.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:14:20.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:14:20.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:14:20.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:14:20.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:14:20.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:14:20.452 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:14:20.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:14:20.999 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:14:21.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:14:21.100 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:14:21.100 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:14:21.348 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:14:21.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:14:51.358 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:14:51.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:14:51.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:14:51.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:14:51.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:14:52.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:14:52.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-05-30T07:14:52.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:14:52.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-05-30T07:14:52.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:14:52.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:14:52.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:14:52.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T07:14:54.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-05-30T07:14:54.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:14:54.993 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:14:54.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:14:55.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:14:55.018 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:14:55.019 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:14:55.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:14:55.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:14:55.020 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:14:55.020 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:14:55.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:14:55.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:14:55.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:14:55.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:14:55.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:14:55.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:14:55.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:14:55.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:14:55.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:14:55.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:14:55.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:14:55.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:14:55.411 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:14:37
2026-05-30T07:14:55.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74070, datetime.datetime(2026, 5, 30, 7, 14, 37), datetime.datetime(2026, 5, 30, 7, 14, 37), 'salt', 11.81, 47.54, None, 12.03, 324.31, 10.78, 831.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:14:55.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:14:55.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:14:55.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:14:37, diff=18.419363s, valid=True
2026-05-30T07:14:55.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:14:55.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:14:55.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:15:12, diff=-16.577136s, valid=True
2026-05-30T07:14:55.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:14:55.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:14:55.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:14:33, diff=22.431096s, valid=True
2026-05-30T07:14:55.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:14:55.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:14:55.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:14:55.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:14:55.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:14:55.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:14:55.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:15:12, diff=-16.565279s, valid=True
2026-05-30T07:14:55.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:14:55.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:14:55.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:14:55.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050737.435495s, valid=True
2026-05-30T07:14:55.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:14:55.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:14:55.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:14:55.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:14:55.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:14:55.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:14:55.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:14:55.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:14:55.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:14:55.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:14:55.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:14:55.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:14:55.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:14:55.761 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:14:55.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:14:56.309 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:14:56.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:14:56.409 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:14:56.409 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:14:56.588 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:14:56.588 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:15:26.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:15:26.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:15:26.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:15:26.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:15:26.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:15:27.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:15:27.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-05-30T07:15:27.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:15: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-05-30T07:15:27.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:15:27.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:15:27.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:15:27.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-05-30T07:16:04.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-05-30T07:16:04.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:16:04.892 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:16:04.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:16:04.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:16:04.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:16:04.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:16:04.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:16:04.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:16:04.915 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:16:04.915 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:16:04.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:16:05.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:16:05.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:16:05.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:16:05.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:16:05.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:16:05.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:16:05.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:16:05.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:16:05.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:16:05.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:16:05.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:16:05.268 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:15:38
2026-05-30T07:16:05.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74072, datetime.datetime(2026, 5, 30, 7, 15, 38), datetime.datetime(2026, 5, 30, 7, 15, 37), 'salt', 11.64, 47.84, None, 14.4, 324.56, 10.67, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:16:05.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:16:05.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:16:05.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:15:37, diff=28.274784s, valid=True
2026-05-30T07:16:05.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:16:05.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:16:05.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:16:12, diff=-6.722363s, valid=True
2026-05-30T07:16:05.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:16:05.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:16:05.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:15:34, diff=31.284248s, valid=True
2026-05-30T07:16:05.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:16:05.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:16:05.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:16:05.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:16:05.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:16:05.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:16:05.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:16:12, diff=-6.712695s, valid=True
2026-05-30T07:16:05.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:16:05.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:16:05.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:16:05.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050807.287989s, valid=True
2026-05-30T07:16:05.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:16:05.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:16:05.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:16:05.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:16:05.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:16:05.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:16:05.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:16:05.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:16:05.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:16:05.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:16:05.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:16:05.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:16:05.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:16:05.634 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:16:05.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:16:06.192 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:16:06.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:16:06.292 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:16:06.292 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:16:06.534 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:16:06.534 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:16:36.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:16:36.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:16:36.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:16:36.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:16:36.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:16:37.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:16:37.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T07:16:37.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:16:37.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-05-30T07:16:37.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:16:37.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:16:37.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:16:37.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-05-30T07:16:39.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-05-30T07:16:39.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:16:39.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:16:39.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:16:39.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:16:39.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:16:39.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:16:39.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:16:39.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:16:39.725 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:16:39.725 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:16:39.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:16:39.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:16:39.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:16:39.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:16:39.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:16:39.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:16:39.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:16:40.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:16:40.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:16:40.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:16:40.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:16:40.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:16:40.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:16:38
2026-05-30T07:16:40.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74074, datetime.datetime(2026, 5, 30, 7, 16, 38), datetime.datetime(2026, 5, 30, 7, 16, 38), 'salt', 11.58, 47.88, None, 13.13, 330.53, 10.66, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:16:40.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:16:40.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:16:40.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:16:38, diff=2.103474s, valid=True
2026-05-30T07:16:40.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:16:40.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:16:40.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:17:12, diff=-31.893154s, valid=True
2026-05-30T07:16:40.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:16:40.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:16:40.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:16:37, diff=3.114671s, valid=True
2026-05-30T07:16:40.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:16:40.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:16:40.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:16:40.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:16:40.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:16:40.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:16:40.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:17:12, diff=-31.881831s, valid=True
2026-05-30T07:16:40.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:16:40.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:16:40.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:16:40.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050842.118915s, valid=True
2026-05-30T07:16:40.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:16:40.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:16:40.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:16:40.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:16:40.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:16:40.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:16:40.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:16:40.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:16:40.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:16:40.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:16:40.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:16:40.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:16:40.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:16:40.440 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:16:40.646 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:16:40.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:16:41.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:16:41.144 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:16:41.144 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:16:41.341 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:16:41.341 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:17:11.357 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:17:11.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:17:11.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:17:11.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:17:11.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:17:11.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:17:11.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T07:17:11.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:17:11.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-05-30T07:17:11.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:17:11.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:17:11.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:17:11.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-05-30T07:17:25.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-05-30T07:17:25.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:17:25.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:17:25.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:17:25.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:17:25.609 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:17:25.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:17:25.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:17:25.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:17:25.610 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:17:25.611 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:17:25.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:17:25.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:17:25.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:17:25.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:17:25.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:17:25.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:17:25.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:17:25.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:17:25.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:17:25.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:17:25.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:17:25.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:17:26.003 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:17:08
2026-05-30T07:17:26.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74075, datetime.datetime(2026, 5, 30, 7, 17, 8), datetime.datetime(2026, 5, 30, 7, 17, 8), 'salt', 11.74, 47.74, None, 13.45, 324.99, 10.71, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:17:26.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:17:26.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:17:26.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:17:08, diff=18.011159s, valid=True
2026-05-30T07:17:26.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:17:26.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:17:26.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:17:12, diff=14.014705s, valid=True
2026-05-30T07:17:26.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:17:26.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:17:26.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:17:04, diff=22.022931s, valid=True
2026-05-30T07:17:26.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:17:26.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:17:26.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:17:26.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:17:26.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:17:26.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:17:26.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:17:12, diff=14.026716s, valid=True
2026-05-30T07:17:26.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:17:26.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:17:26.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:17:26.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050888.027529s, valid=True
2026-05-30T07:17:26.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:17:26.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:17:26.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:17:26.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:17:26.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:17:26.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:17:26.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:17:26.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:17:26.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:17:26.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:17:26.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:17:26.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:17:26.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:17:26.350 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:17:26.554 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:17:26.892 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:17:26.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:17:26.991 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:17:26.992 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:17:29.594 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:17:29.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:17:59.621 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:17:59.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:17:59.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:18:00.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:18:00.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:18:00.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:18:00.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-05-30T07:18:00.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:18:00.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-05-30T07:18:00.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:18:00.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:18:00.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:18:00.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-05-30T07:18:02.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-05-30T07:18:02.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:18:02.689 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:18:02.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:18:02.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:18:02.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:18:02.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:18:02.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:18:02.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:18:02.715 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:18:02.715 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:18:02.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:18:02.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:18:02.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:18:02.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:18:02.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:18:02.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:18:02.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:18:03.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:18:03.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:18:03.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:18:03.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:18:03.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:18:03.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:17:39
2026-05-30T07:18:03.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74076, datetime.datetime(2026, 5, 30, 7, 17, 39), datetime.datetime(2026, 5, 30, 7, 17, 38), 'salt', 11.71, 47.84, None, 13.55, 327.38, 10.68, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:18:03.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:18:03.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:18:03.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:17:38, diff=25.103893s, valid=True
2026-05-30T07:18:03.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:18:03.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:18:03.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:18:12, diff=-8.892911s, valid=True
2026-05-30T07:18:03.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:18:03.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:18:03.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:17:34, diff=29.114519s, valid=True
2026-05-30T07:18:03.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:18:03.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:18:03.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:18:03.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:18:03.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:18:03.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:18:03.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:18:12, diff=-8.882053s, valid=True
2026-05-30T07:18:03.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:18:03.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:18:03.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:18:03.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050925.118691s, valid=True
2026-05-30T07:18:03.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:18:03.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:18:03.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:18:03.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:18:03.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:18:03.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:18:03.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:18:03.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:18:03.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:18:03.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:18:03.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:18:03.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:18:03.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:18:03.438 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:18:03.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:18:04.066 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:18:04.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:18:04.166 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:18:04.166 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:18:04.434 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:18:04.434 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:18:34.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:18:34.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:18:34.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:18:34.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:18:34.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:18:35.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:18: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-05-30T07:18:35.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:18:35.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-05-30T07:18:35.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:18:35.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:18:35.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:18:35.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-05-30T07:18:37.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T07:18:37.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:18:37.606 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:18:37.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:18:37.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:18:37.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:18:37.631 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:18:37.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:18:37.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:18:37.633 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:18:37.633 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:18:37.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:18:37.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:18:37.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:18:37.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:18:37.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:18:37.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:18:37.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:18:37.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:18:37.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:18:37.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:18:37.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:18:37.957 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:18:38.026 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:18:09
2026-05-30T07:18:38.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74077, datetime.datetime(2026, 5, 30, 7, 18, 9), datetime.datetime(2026, 5, 30, 7, 18, 9), 'salt', 11.54, 48.11, None, 13.62, 330.29, 10.59, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:18:38.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:18:38.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:18:38.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:18:09, diff=29.033968s, valid=True
2026-05-30T07:18:38.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:18:38.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:18:38.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:18:12, diff=26.037456s, valid=True
2026-05-30T07:18:38.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:18:38.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:18:38.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:18:04, diff=34.045761s, valid=True
2026-05-30T07:18:38.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:18:38.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:18:38.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:18:38.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:18:38.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:18:38.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:18:38.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:18:12, diff=26.049475s, valid=True
2026-05-30T07:18:38.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:18:38.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:18:38.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:18:38.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1050960.050303s, valid=True
2026-05-30T07:18:38.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:18:38.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:18:38.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:18:38.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:18:38.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:18:38.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:18:38.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:18:38.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:18:38.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:18:38.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:18:38.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:18:38.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:18:38.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:18:38.375 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:18:38.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:18:38.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:18:39.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:18:39.020 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:18:39.020 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:18:39.194 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:18:39.194 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:19:09.223 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:19:09.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:19:09.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:19:09.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:19:09.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:19:09.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:19:09.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-05-30T07:19:09.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:19:09.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T07:19:09.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:19:09.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:19:09.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:19:09.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-05-30T07:19:20.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-05-30T07:19:20.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:19:20.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:19:20.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:19:20.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:19:20.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:19:20.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:19:20.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:19:20.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:19:20.795 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:19:20.795 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:19:20.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:19:20.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:19:20.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:19:21.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:19:21.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:19:21.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:19:21.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:19:21.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:19:21.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:19:21.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:19:21.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:19:21.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:19:21.180 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:19:09
2026-05-30T07:19:21.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74079, datetime.datetime(2026, 5, 30, 7, 19, 9), datetime.datetime(2026, 5, 30, 7, 19, 9), 'salt', 11.48, 48.74, None, 13.59, 329.54, 10.41, 831.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:19:21.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:19:21.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:19:21.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:19:09, diff=12.188217s, valid=True
2026-05-30T07:19:21.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:19:21.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:19:21.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:19:12, diff=9.191731s, valid=True
2026-05-30T07:19:21.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:19:21.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:19:21.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:19:05, diff=16.199842s, valid=True
2026-05-30T07:19:21.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:19:21.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:19:21.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:19:21.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:19:21.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:19:21.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:19:21.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:19:12, diff=9.203617s, valid=True
2026-05-30T07:19:21.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:19:21.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:19:21.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:19:21.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051003.204435s, valid=True
2026-05-30T07:19:21.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:19:21.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:19:21.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:19:21.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:19:21.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:19:21.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:19:21.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:19:21.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:19:21.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:19:21.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:19:21.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:19:21.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:19:21.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:19:21.599 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:19:21.806 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:19:22.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:19:22.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:19:22.244 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:19:22.244 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:19:22.433 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:19:22.433 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:19:52.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:19:52.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:19:52.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:19:52.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:19:52.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:19:52.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:19:52.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-05-30T07:19:52.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:19:52.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-05-30T07:19:53.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:19:53.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:19:53.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:19:53.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-05-30T07:19:55.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-05-30T07:19:55.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:19:55.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:19:55.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:19:55.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:19:55.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:19:55.989 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:19:55.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:19:55.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:19:55.990 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:19:55.990 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:19:55.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:19:56.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:19:56.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:19:56.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:19:56.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:19:56.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:19:56.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:19:56.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:19:56.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:19:56.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:19:56.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:19:56.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:19:56.374 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:19:40
2026-05-30T07:19:56.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74080, datetime.datetime(2026, 5, 30, 7, 19, 40), datetime.datetime(2026, 5, 30, 7, 19, 39), 'salt', 11.51, 49.04, None, 12.92, 324.89, 10.32, 831.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:19:56.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:19:56.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:19:56.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:19:39, diff=17.382323s, valid=True
2026-05-30T07:19:56.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:19:56.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:19:56.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:20:12, diff=-15.6142s, valid=True
2026-05-30T07:19:56.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:19:56.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:19:56.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:19:35, diff=21.393772s, valid=True
2026-05-30T07:19:56.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:19:56.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:19:56.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:19:56.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:19:56.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:19:56.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:19:56.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:20:12, diff=-15.602618s, valid=True
2026-05-30T07:19:56.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:19:56.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:19:56.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:19:56.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051038.39818s, valid=True
2026-05-30T07:19:56.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:19:56.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:19:56.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:19:56.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:19:56.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:19:56.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:19:56.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:19:56.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:19:56.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:19:56.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:19:56.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:19:56.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:19:56.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:19:56.720 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:19:56.925 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:19:57.263 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:19:57.363 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:19:57.363 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:19:57.363 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:19:57.646 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:19:57.646 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:20:27.676 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:20:27.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:20:27.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:20:27.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:20:27.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:20:28.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:20:28.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-05-30T07:20:28.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:20:28.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-05-30T07:20:28.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:20:28.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:20:28.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:20:28.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-05-30T07:20:30.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-05-30T07:20:30.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:20:30.682 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:20:30.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:20:30.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:20:30.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:20:30.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:20:30.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:20:30.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:20:30.706 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:20:30.706 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:20:30.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:20:30.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:20:30.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:20:30.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:20:30.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:20:30.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:20:30.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:20:31.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:20:31.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:20:31.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:20:31.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:20:31.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:20:31.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:20:10
2026-05-30T07:20:31.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74081, datetime.datetime(2026, 5, 30, 7, 20, 10), datetime.datetime(2026, 5, 30, 7, 20, 10), 'salt', 11.48, 49.14, None, 14.36, 323.93, 10.3, 832.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:20:31.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:20:31.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:20:31.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:20:10, diff=21.095594s, valid=True
2026-05-30T07:20:31.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:20:31.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:20:31.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:20:12, diff=19.099122s, valid=True
2026-05-30T07:20:31.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:20:31.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:20:31.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:20:07, diff=24.107367s, valid=True
2026-05-30T07:20:31.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:20:31.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:20:31.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:20:31.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:20:31.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:20:31.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:20:31.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:20:12, diff=19.111197s, valid=True
2026-05-30T07:20:31.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:20:31.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:20:31.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:20:31.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051073.112049s, valid=True
2026-05-30T07:20:31.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:20:31.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:20:31.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:20:31.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:20:31.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:20:31.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:20:31.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:20:31.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:20:31.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:20:31.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:20:31.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:20:31.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:20:31.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:20:31.511 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:20:31.722 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:20:32.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:20:32.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:20:32.174 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:20:32.174 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:20:32.608 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:20:32.609 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:21:02.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:21:02.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:21:02.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:21:02.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:21:02.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:21:03.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:21:03.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-05-30T07:21:03.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:21:03.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-05-30T07:21:03.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:21:03.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:21:03.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:21:03.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-05-30T07:21:05.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-05-30T07:21:05.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:21:05.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:21:05.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:21:05.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:21:05.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:21:05.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:21:05.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:21:05.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:21:05.491 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:21:05.492 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:21:05.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:21:05.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:21:05.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:21:05.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:21:05.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:21:05.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:21:05.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:21:05.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:21:05.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:21:05.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:21:05.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:21:05.785 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:21:05.845 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:20:40
2026-05-30T07:21:05.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74082, datetime.datetime(2026, 5, 30, 7, 20, 40), datetime.datetime(2026, 5, 30, 7, 20, 40), 'salt', 11.44, 49.17, None, 14.26, 324.12, 10.28, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:21:05.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:21:05.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:21:05.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:20:40, diff=25.852423s, valid=True
2026-05-30T07:21:05.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:21:05.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:21:05.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:21:12, diff=-6.144234s, valid=True
2026-05-30T07:21:05.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:21:05.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:21:05.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:20:38, diff=27.863721s, valid=True
2026-05-30T07:21:05.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:21:05.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:21:05.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:21:05.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:21:05.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:21:05.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:21:05.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:21:12, diff=-6.132692s, valid=True
2026-05-30T07:21:05.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:21:05.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:21:05.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:21:05.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051107.868095s, valid=True
2026-05-30T07:21:05.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:21:05.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:21:05.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:21:05.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:21:05.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:21:05.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:21:05.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:21:05.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:21:05.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:21:06.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:21:06.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:21:06.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:21:06.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:21:06.189 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:21:06.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:21:06.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:21:06.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:21:06.852 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:21:06.852 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:21:07.104 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:21:07.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:21:37.113 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:21:37.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:21:37.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:21:37.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:21:37.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:21:37.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:21:37.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-05-30T07:21:37.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:21:37.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-05-30T07:21:37.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:21:37.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:21:37.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:21:37.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-05-30T07:21:40.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-05-30T07:21:40.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:21:40.031 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:21:40.031 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:21:40.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:21:40.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:21:40.052 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:21:40.052 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:21:40.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:21:40.052 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:21:40.053 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:21:40.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:21:40.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:21:40.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:21:40.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:21:40.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:21:40.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:21:40.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:21:40.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:21:40.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:21:40.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:21:40.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:21:40.317 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:21:40.382 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:21:10
2026-05-30T07:21:40.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74083, datetime.datetime(2026, 5, 30, 7, 21, 10), datetime.datetime(2026, 5, 30, 7, 21, 10), 'salt', 11.61, 48.97, None, 14.29, 334.78, 10.35, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:21:40.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:21:40.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:21:40.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:21:10, diff=30.389716s, valid=True
2026-05-30T07:21:40.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:21:40.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:21:40.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:21:12, diff=28.392928s, valid=True
2026-05-30T07:21:40.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:21:40.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:21:40.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:21:10, diff=30.400454s, valid=True
2026-05-30T07:21:40.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:21:40.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:21:40.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:21:40.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:21:40.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:21:40.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:21:40.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:21:12, diff=28.40391s, valid=True
2026-05-30T07:21:40.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:21:40.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:21:40.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:21:40.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051142.404664s, valid=True
2026-05-30T07:21:40.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:21:40.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:21:40.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:21:40.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:21:40.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:21:40.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:21:40.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:21:40.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:21:40.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:21:40.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:21:40.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:21:40.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:21:40.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:21:40.795 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:21:41.003 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:21:41.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:21:41.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:21:41.445 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:21:41.445 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:21:41.968 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:21:41.968 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:22:11.999 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:22:11.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:22:11.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:22:12.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:22:12.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:22:12.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:22:12.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T07:22:12.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:22:12.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-05-30T07:22:12.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:22:12.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:22:12.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:22:12.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-05-30T07:22:40.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-05-30T07:22:40.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:22:40.309 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:22:40.309 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:22:40.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:22:40.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:22:40.333 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:22:40.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:22:40.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:22:40.334 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:22:40.334 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:22:40.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:22:40.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:22:40.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:22:40.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:22:40.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:22:40.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:22:40.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:22:40.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:22:40.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:22:40.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:22:40.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:22:40.650 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:22:40.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:22:11
2026-05-30T07:22:40.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74085, datetime.datetime(2026, 5, 30, 7, 22, 11), datetime.datetime(2026, 5, 30, 7, 22, 11), 'salt', 11.78, 48.47, None, 14.43, 325.65, 10.51, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:22:40.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:22:40.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:22:40.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:22:11, diff=29.718356s, valid=True
2026-05-30T07:22:40.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:22:40.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:22:40.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:22:12, diff=28.721272s, valid=True
2026-05-30T07:22:40.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:22:40.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:22:40.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:22:06, diff=34.728531s, valid=True
2026-05-30T07:22:40.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:22:40.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:22:40.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:22:40.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:22:40.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:22:40.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:22:40.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:22:12, diff=28.73214s, valid=True
2026-05-30T07:22:40.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:22:40.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:22:40.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:22:40.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051202.732957s, valid=True
2026-05-30T07:22:40.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:22:40.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:22:40.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:22:40.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:22:40.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:22:40.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:22:40.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:22:40.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:22:40.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:22:40.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:22:40.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:22:40.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:22:41.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:22:41.062 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:22:41.273 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:22:41.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:22:41.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:22:41.735 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:22:41.736 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:22:41.905 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:22:41.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:23:11.923 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:23:11.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:23:11.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:23:12.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:23:12.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:23:12.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:23:12.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-05-30T07:23:12.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:23:12.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-05-30T07:23:12.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:23:12.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:23:12.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:23:12.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-05-30T07:23:14.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-05-30T07:23:14.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:23:14.893 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:23:14.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:23:14.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:23:14.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:23:14.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:23:14.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:23:14.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:23:14.945 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:23:14.945 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:23:14.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:23:15.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:23:15.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:23:15.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:23:15.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:23:15.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:23:15.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:23:15.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:23:15.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:23:15.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:23:15.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:23:15.256 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:23:15.316 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:23:11
2026-05-30T07:23:15.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74087, datetime.datetime(2026, 5, 30, 7, 23, 11), datetime.datetime(2026, 5, 30, 7, 23, 11), 'salt', 11.71, 48.94, None, 14.86, 322.81, 10.37, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:23:15.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:23:15.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:23:15.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:23:11, diff=4.323736s, valid=True
2026-05-30T07:23:15.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:23:15.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:23:15.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:23:12, diff=3.327117s, valid=True
2026-05-30T07:23:15.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:23:15.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:23:15.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:23:07, diff=8.334928s, valid=True
2026-05-30T07:23:15.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:23:15.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:23:15.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:23:15.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:23:15.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:23:15.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:23:15.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:23:12, diff=3.338483s, valid=True
2026-05-30T07:23:15.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:23:15.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:23:15.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:23:15.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051237.339269s, valid=True
2026-05-30T07:23:15.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:23:15.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:23:15.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:23:15.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:23:15.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:23:15.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:23:15.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:23:15.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:23:15.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:23:15.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:23:15.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:23:15.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:23:15.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:23:15.661 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:23:15.866 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:23:16.207 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:23:16.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:23:16.306 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:23:16.306 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:23:16.500 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:23:16.500 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:23:46.519 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:23:46.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:23:46.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:23:46.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:23:46.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:23:47.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:23:47.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-05-30T07:23:47.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:23:47.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-05-30T07:23:47.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:23:47.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:23:47.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:23:47.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-05-30T07:23:51.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-05-30T07:23:51.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:23:51.149 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:23:51.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:23:51.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:23:51.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:23:51.175 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:23:51.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:23:51.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:23:51.176 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:23:51.176 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:23:51.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:23:51.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:23:51.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:23:51.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:23:51.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:23:51.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:23:51.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:23:51.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:23:51.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:23:51.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:23:51.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:23:51.493 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:23:51.555 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:23:42
2026-05-30T07:23:51.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74088, datetime.datetime(2026, 5, 30, 7, 23, 42), datetime.datetime(2026, 5, 30, 7, 23, 41), 'salt', 11.61, 49.0, None, 13.83, 326.63, 10.34, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:23:51.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:23:51.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:23:51.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:23:41, diff=10.562669s, valid=True
2026-05-30T07:23:51.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:23:51.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:23:51.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:24:12, diff=-20.43392s, valid=True
2026-05-30T07:23:51.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:23:51.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:23:51.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:23:37, diff=14.574072s, valid=True
2026-05-30T07:23:51.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:23:51.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:23:51.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:23:51.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:23:51.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:23:51.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:23:51.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:24:12, diff=-20.422255s, valid=True
2026-05-30T07:23:51.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:23:51.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:23:51.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:23:51.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051273.57852s, valid=True
2026-05-30T07:23:51.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:23:51.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:23:51.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:23:51.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:23:51.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:23:51.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:23:51.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:23:51.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:23:51.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:23:51.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:23:51.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:23:51.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:23:51.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:23:51.901 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:23:52.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:23:52.443 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:23:52.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:23:52.542 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:23:52.543 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:23:52.720 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:23:52.721 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:24:22.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:24:22.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:24:22.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:24:23.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:24:23.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:24:23.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:24:23.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-05-30T07:24:23.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:24:23.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-05-30T07:24:23.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:24:23.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:24:23.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:24: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-05-30T07:24:29.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T07:24:29.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:24:29.606 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:24:29.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:24:29.617 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:24:29.630 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:24:29.630 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:24:29.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:24:29.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:24:29.632 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:24:29.632 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:24:29.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:24:29.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:24:29.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:24:29.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:24:29.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:24:29.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:24:29.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:24:29.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:24:29.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:24:29.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:24:29.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:24:29.949 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:24:30.010 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:24:12
2026-05-30T07:24:30.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74089, datetime.datetime(2026, 5, 30, 7, 24, 12), datetime.datetime(2026, 5, 30, 7, 24, 11), 'salt', 11.54, 48.74, None, 14.54, 328.98, 10.41, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:24:30.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:24:30.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:24:30.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:24:11, diff=19.017281s, valid=True
2026-05-30T07:24:30.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:24:30.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:24:30.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:24:12, diff=18.020736s, valid=True
2026-05-30T07:24:30.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:24:30.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:24:30.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:24:08, diff=22.029632s, valid=True
2026-05-30T07:24:30.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:24:30.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:24:30.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:24:30.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:24:30.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:24:30.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:24:30.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:24:12, diff=18.033185s, valid=True
2026-05-30T07:24:30.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:24:30.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:24:30.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:24:30.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051312.033944s, valid=True
2026-05-30T07:24:30.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:24:30.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:24:30.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:24:30.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:24:30.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:24:30.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:24:30.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:24:30.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:24:30.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:24:30.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:24:30.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:24:30.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:24:30.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:24:30.364 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:24:30.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:24:30.906 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:24:31.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:24:31.007 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:24:31.007 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:24:31.255 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:24:31.255 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:25:01.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:25:01.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:25:01.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:25:01.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:25:01.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:25:01.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:25:01.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-05-30T07:25:01.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:25:01.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-05-30T07:25:01.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:25:01.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:25:01.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:25:01.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-05-30T07:25:04.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-05-30T07:25:04.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:25:04.048 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:25:04.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:25:04.059 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:25:04.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:25:04.072 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:25:04.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:25:04.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:25:04.073 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:25:04.073 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:25:04.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:25:04.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:25:04.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:25:04.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:25:04.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:25:04.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:25:04.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:25:04.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:25:04.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:25:04.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:25:04.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:25:04.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:25:04.446 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:24:42
2026-05-30T07:25:04.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74090, datetime.datetime(2026, 5, 30, 7, 24, 42), datetime.datetime(2026, 5, 30, 7, 24, 41), 'salt', 11.61, 48.44, None, 14.08, 321.89, 10.5, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:25:04.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:25:04.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:25:04.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:24:41, diff=23.454245s, valid=True
2026-05-30T07:25:04.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:25:04.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:25:04.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:25:12, diff=-7.542332s, valid=True
2026-05-30T07:25:04.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:25:04.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:25:04.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:24:39, diff=25.465705s, valid=True
2026-05-30T07:25:04.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:25:04.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:25:04.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:25:04.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:25:04.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:25:04.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:25:04.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:25:12, diff=-7.53065s, valid=True
2026-05-30T07:25:04.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:25:04.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:25:04.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:25:04.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051346.470149s, valid=True
2026-05-30T07:25:04.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:25:04.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:25:04.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:25:04.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:25:04.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:25:04.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:25:04.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:25:04.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:25:04.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:25:04.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:25:04.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:25:04.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:25:04.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:25:04.794 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:25:04.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:25:05.393 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:25:05.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:25:05.496 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:25:05.496 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:25:05.677 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:25:05.677 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:25:35.681 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:25:35.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:25:35.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:25:35.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:25:35.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:25:36.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:25:36.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-05-30T07:25:36.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:25:36.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T07:25:36.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:25:36.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:25:36.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:25:36.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-05-30T07:25:38.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T07:25:38.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:25:38.544 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:25:38.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:25:38.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:25:38.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:25:38.569 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:25:38.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:25:38.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:25:38.571 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:25:38.571 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:25:38.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:25:38.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:25:38.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:25:38.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:25:38.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:25:38.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:25:38.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:25:38.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:25:38.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:25:38.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:25:38.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:25:38.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:25:38.965 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:25:12
2026-05-30T07:25:38.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74091, datetime.datetime(2026, 5, 30, 7, 25, 12), datetime.datetime(2026, 5, 30, 7, 25, 12), 'salt', 11.61, 48.34, None, 14.29, 328.09, 10.53, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:25:38.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:25:38.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:25:38.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:25:12, diff=26.973919s, valid=True
2026-05-30T07:25:38.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:25:38.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:25:38.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:25:12, diff=26.977487s, valid=True
2026-05-30T07:25:38.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:25:38.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:25:38.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:25:11, diff=27.985654s, valid=True
2026-05-30T07:25:38.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:25:38.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:25:38.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:25:38.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:25:38.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:25:38.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:25:38.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:25:12, diff=26.989436s, valid=True
2026-05-30T07:25:38.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:25:38.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:25:38.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:25:38.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051380.990274s, valid=True
2026-05-30T07:25:38.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:25:38.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:25:38.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:25:38.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:25:38.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:25:39.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:25:39.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:25:39.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:25:39.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:25:39.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:25:39.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:25:39.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:25:39.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:25:39.312 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:25:39.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:25:39.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:25:39.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:25:39.970 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:25:39.970 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:25:40.187 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:25:40.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:26:10.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:26:10.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:26:10.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:26:10.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:26:10.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:26:10.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:26:10.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-05-30T07:26:10.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:26:10.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-05-30T07:26:10.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:26:10.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:26:10.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:26:10.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-05-30T07:26:16.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-05-30T07:26:16.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:26:16.309 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:26:16.309 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:26:16.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:26:16.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:26:16.333 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:26:16.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:26:16.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:26:16.334 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:26:16.335 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:26:16.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:26:16.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:26:16.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:26:16.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:26:16.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:26:16.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:26:16.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:26:16.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:26:16.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:26:16.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:26:16.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:26:16.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:26:16.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:26:13
2026-05-30T07:26:16.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74093, datetime.datetime(2026, 5, 30, 7, 26, 13), datetime.datetime(2026, 5, 30, 7, 26, 12), 'salt', 11.68, 47.91, None, 15.0, 322.36, 10.66, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:26:16.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:26:16.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:26:16.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:26:12, diff=4.721825s, valid=True
2026-05-30T07:26:16.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:26:16.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:26:16.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:26:12, diff=4.725479s, valid=True
2026-05-30T07:26:16.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:26:16.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:26:16.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:26:08, diff=8.733802s, valid=True
2026-05-30T07:26:16.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:26:16.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:26:16.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:26:16.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:26:16.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:26:16.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:26:16.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:26:12, diff=4.737596s, valid=True
2026-05-30T07:26:16.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:26:16.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:26:16.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:26:16.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051418.738484s, valid=True
2026-05-30T07:26:16.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:26:16.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:26:16.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:26:16.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:26:16.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:26:16.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:26:16.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:26:16.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:26:16.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:26:16.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:26:16.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:26:16.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:26:17.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:26:17.137 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:26:17.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:26:17.681 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:26:17.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:26:17.780 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:26:17.780 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:26:17.955 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:26:17.955 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:26:47.981 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:26:47.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:26:47.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:26:48.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:26:48.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:26:48.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:26:48.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-05-30T07:26:48.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:26:48.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-05-30T07:26:48.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:26:48.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:26:48.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:26:48.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T07:27:27.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-05-30T07:27:27.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:27:27.919 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:27:27.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:27:27.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:27:27.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:27:27.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:27:27.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:27:27.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:27:27.943 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:27:27.944 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:27:27.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:27:28.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:27:28.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:27:28.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:27:28.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:27:28.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:27:28.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:27:28.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:27:28.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:27:28.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:27:28.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:27:28.266 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:27:28.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:27:14
2026-05-30T07:27:28.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74095, datetime.datetime(2026, 5, 30, 7, 27, 14), datetime.datetime(2026, 5, 30, 7, 27, 13), 'salt', 11.64, 47.54, None, 14.15, 326.91, 10.76, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:27:28.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:27:28.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:27:28.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:27:13, diff=15.363213s, valid=True
2026-05-30T07:27:28.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:27:28.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:27:28.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:27:12, diff=16.366761s, valid=True
2026-05-30T07:27:28.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:27:28.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:27:28.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:27:09, diff=19.375164s, valid=True
2026-05-30T07:27:28.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:27:28.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:27:28.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:27:28.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:27:28.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:27:28.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:27:28.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:27:12, diff=16.378994s, valid=True
2026-05-30T07:27:28.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:27:28.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:27:28.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:27:28.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051490.379833s, valid=True
2026-05-30T07:27:28.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:27:28.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:27:28.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:27:28.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:27:28.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:27:28.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:27:28.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:27:28.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:27:28.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:27:28.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:27:28.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:27:28.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:27:28.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:27:28.702 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:27:28.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:27:29.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:27:29.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:27:29.343 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:27:29.343 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:27:29.518 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:27:29.518 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:27:59.548 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:27:59.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:27:59.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:28:00.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:28:00.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:28:00.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:28:00.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-05-30T07:28:00.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:28:00.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-05-30T07:28:00.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:28:00.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:28:00.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:28:00.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-05-30T07:28:02.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-05-30T07:28:02.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:28:02.652 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:28:02.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:28:02.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:28:02.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:28:02.675 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:28:02.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:28:02.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:28:02.676 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:28:02.676 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:28:02.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:28:02.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:28:02.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:28:02.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:28:02.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:28:02.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:28:02.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:28:02.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:28:02.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:28:03.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:28:03.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:28:03.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:28:03.069 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:27:44
2026-05-30T07:28:03.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74096, datetime.datetime(2026, 5, 30, 7, 27, 44), datetime.datetime(2026, 5, 30, 7, 27, 43), 'salt', 11.74, 47.44, None, 14.79, 323.67, 10.8, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:28:03.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:28:03.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:28:03.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:27:43, diff=20.077809s, valid=True
2026-05-30T07:28:03.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:28:03.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:28:03.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:28:12, diff=-8.918629s, valid=True
2026-05-30T07:28:03.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:28:03.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:28:03.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:27:39, diff=24.089843s, valid=True
2026-05-30T07:28:03.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:28:03.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:28:03.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:28:03.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:28:03.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:28:03.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:28:03.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:28:12, diff=-8.90636s, valid=True
2026-05-30T07:28:03.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:28:03.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:28:03.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:28:03.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051525.094452s, valid=True
2026-05-30T07:28:03.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:28:03.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:28:03.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:28:03.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:28:03.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:28:03.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:28:03.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:28:03.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:28:03.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:28:03.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:28:03.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:28:03.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:28:03.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:28:03.483 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:28:03.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:28:04.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:28:04.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:28:04.128 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:28:04.129 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:28:04.306 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:28:04.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:28:34.376 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:28:34.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:28:34.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:28:34.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:28:34.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:28:35.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:28:35.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-05-30T07:28:35.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:28:35.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-05-30T07:28:35.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:28:35.117 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:28:35.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:28:35.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T07:28:37.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T07:28:37.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:28:37.544 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:28:37.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:28:37.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:28:37.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:28:37.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:28:37.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:28:37.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:28:37.569 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:28:37.569 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:28:37.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:28:37.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:28:37.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:28:37.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:28:37.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:28:37.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:28:37.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:28:37.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:28:37.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:28:37.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:28:37.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:28:37.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:28:37.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:28:14
2026-05-30T07:28:37.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74097, datetime.datetime(2026, 5, 30, 7, 28, 14), datetime.datetime(2026, 5, 30, 7, 28, 14), 'salt', 11.71, 47.44, None, 14.43, 326.39, 10.8, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:28:37.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:28:37.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:28:37.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:28:14, diff=23.969758s, valid=True
2026-05-30T07:28:37.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:28:37.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:28:37.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:28:12, diff=25.973276s, valid=True
2026-05-30T07:28:37.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:28:37.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:28:37.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:28:09, diff=28.981553s, valid=True
2026-05-30T07:28:37.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:28:37.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:28:37.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:28:37.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:28:37.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:28:37.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:28:37.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:28:12, diff=25.985324s, valid=True
2026-05-30T07:28:37.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:28:37.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:28:37.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:28:37.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051559.986183s, valid=True
2026-05-30T07:28:37.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:28:37.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:28:37.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:28:37.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:28:37.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:28:38.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:28:38.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:28:38.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:28:38.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:28:38.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:28:38.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:28:38.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:28:38.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:28:38.312 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:28:38.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:28:38.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:28:38.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:28:38.960 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:28:38.960 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:28:39.131 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:28:39.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:29:09.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:29:09.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:29:09.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:29:09.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:29:09.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:29:09.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:29:09.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-05-30T07:29:09.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:29:09.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-05-30T07:29:09.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:29:09.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:29:09.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:29:09.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-05-30T07:29:11.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-05-30T07:29:11.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:29:11.990 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:29:11.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:29:12.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:29:12.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:29:12.014 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:29:12.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:29:12.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:29:12.015 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:29:12.015 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:29:12.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:29:12.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:29:12.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:29:12.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:29:12.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:29:12.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:29:12.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:29:12.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:29:12.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:29:12.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:29:12.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:29:12.337 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:29:12.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:28:44
2026-05-30T07:29:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74098, datetime.datetime(2026, 5, 30, 7, 28, 44), datetime.datetime(2026, 5, 30, 7, 28, 44), 'salt', 11.71, 47.48, None, 14.15, 323.93, 10.79, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:29:12.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:29:12.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:29:12.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:28:44, diff=28.407169s, valid=True
2026-05-30T07:29:12.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:29:12.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:29:12.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:29:12, diff=0.410638s, valid=True
2026-05-30T07:29:12.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:29:12.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:29:12.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:28:41, diff=31.418684s, valid=True
2026-05-30T07:29:12.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:29:12.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:29:12.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:29:12.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:29:12.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:29:12.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:29:12.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:29:12, diff=0.422423s, valid=True
2026-05-30T07:29:12.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:29:12.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:29:12.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:29:12.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051594.42324s, valid=True
2026-05-30T07:29:12.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:29:12.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:29:12.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:29:12.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:29:12.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:29:12.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:29:12.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:29:12.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:29:12.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:29:12.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:29:12.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:29:12.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:29:12.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:29:12.870 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:29:13.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:29:13.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:29:13.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:29:13.516 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:29:13.516 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:29:13.778 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:29:13.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:29:43.808 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:29:43.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:29:43.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:29:44.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:29:44.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:29:44.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:29:44.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-05-30T07:29:44.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:29:44.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-05-30T07:29:44.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:29:44.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:29:44.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:29:44.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-05-30T07:29:48.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-05-30T07:29:48.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:29:48.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:29:48.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:29:48.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:29:48.252 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:29:48.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:29:48.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:29:48.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:29:48.254 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:29:48.254 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:29:48.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:29:48.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:29:48.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:29:48.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:29:48.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:29:48.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:29:48.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:29:48.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:29:48.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:29:48.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:29:48.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:29:48.580 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:29:48.641 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:29:45
2026-05-30T07:29:48.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74100, datetime.datetime(2026, 5, 30, 7, 29, 45), datetime.datetime(2026, 5, 30, 7, 29, 45), 'salt', 11.61, 47.78, None, 13.55, 338.43, 10.69, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:29:48.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:29:48.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:29:48.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:29:45, diff=3.64904s, valid=True
2026-05-30T07:29:48.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:29:48.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:29:48.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:30:12, diff=-23.347389s, valid=True
2026-05-30T07:29:48.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:29:48.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:29:48.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:29:43, diff=5.661028s, valid=True
2026-05-30T07:29:48.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:29:48.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:29:48.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:29:48.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:29:48.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:29:48.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:29:48.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:30:12, diff=-23.335247s, valid=True
2026-05-30T07:29:48.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:29:48.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:29:48.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:29:48.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051630.665555s, valid=True
2026-05-30T07:29:48.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:29:48.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:29:48.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:29:48.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:29:48.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:29:48.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:29:48.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:29:48.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:29:48.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:29:48.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:29:48.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:29:48.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:29:48.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:29:48.988 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:29:49.192 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:29:49.532 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:29:49.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:29:49.634 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:29:49.634 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:29:49.812 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:29:49.812 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:30:19.841 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:30:19.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:30:19.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:30:19.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:30:19.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:30:20.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:30:20.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-05-30T07:30:20.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:30:20.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-05-30T07:30:20.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:30:20.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:30:20.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:30:20.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-05-30T07:30: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-05-30T07:30:49.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:30:49.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:30:49.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:30:49.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:30:49.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:30:49.637 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:30:49.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:30:49.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:30:49.638 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:30:49.638 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:30:49.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:30:49.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:30:49.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:30:49.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:30:49.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:30:49.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:30:49.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:30:49.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:30:49.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:30:49.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:30:49.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:30:49.991 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:30:50.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:30:45
2026-05-30T07:30:50.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74102, datetime.datetime(2026, 5, 30, 7, 30, 45), datetime.datetime(2026, 5, 30, 7, 30, 45), 'salt', 11.58, 48.01, None, 14.5, 322.47, 10.63, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:30:50.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:30:50.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:30:50.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:30:45, diff=5.068787s, valid=True
2026-05-30T07:30:50.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:30:50.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:30:50.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:31:12, diff=-21.924783s, valid=True
2026-05-30T07:30:50.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:30:50.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:30:50.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:30:40, diff=10.089067s, valid=True
2026-05-30T07:30:50.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:30:50.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:30:50.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:30:50.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:30:50.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:30:50.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:30:50.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:31:12, diff=-21.904999s, valid=True
2026-05-30T07:30:50.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:30:50.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:30:50.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:30:50.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051692.096175s, valid=True
2026-05-30T07:30:50.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:30:50.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:30:50.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:30:50.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:30:50.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:30:50.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:30:50.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:30:50.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:30:50.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:30:50.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:30:50.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:30:50.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:30:50.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:30:50.436 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:30:50.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:30:51.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:30:51.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:30:51.109 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:30:51.109 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:30:51.449 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:30:51.449 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:31:21.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:31:21.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:31:21.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:31:22.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:31:22.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:31:22.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:31:22.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-05-30T07:31:22.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:31:22.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-05-30T07:31:22.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:31:22.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:31:22.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:31:22.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-05-30T07:31:24.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-05-30T07:31:24.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:31:24.731 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:31:24.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:31:24.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:31:24.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:31:24.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:31:24.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:31:24.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:31:24.757 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:31:24.757 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:31:24.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:31:24.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:31:24.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:31:24.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:31:24.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:31:25.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:31:25.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:31:25.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:31:25.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:31:25.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:31:25.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:31:25.074 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:31:25.136 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:31:16
2026-05-30T07:31:25.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74103, datetime.datetime(2026, 5, 30, 7, 31, 16), datetime.datetime(2026, 5, 30, 7, 31, 15), 'salt', 11.51, 48.37, None, 13.55, 324.07, 10.51, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:31:25.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:31:25.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:31:25.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:31:15, diff=10.142945s, valid=True
2026-05-30T07:31:25.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:31:25.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:31:25.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:31:12, diff=13.145872s, valid=True
2026-05-30T07:31:25.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:31:25.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:31:25.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:31:10, diff=15.152537s, valid=True
2026-05-30T07:31:25.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:31:25.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:31:25.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:31:25.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:31:25.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:31:25.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:31:25.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:31:12, diff=13.15568s, valid=True
2026-05-30T07:31:25.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:31:25.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:31:25.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:31:25.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051727.156355s, valid=True
2026-05-30T07:31:25.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:31:25.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:31:25.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:31:25.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:31:25.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:31:25.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:31:25.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:31:25.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:31:25.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:31:25.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:31:25.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:31:25.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:31:25.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:31:25.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:31:25.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:31:26.026 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:31:26.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:31:26.186 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:31:26.186 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:31:26.357 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:31:26.357 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:31:56.387 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:31:56.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:31:56.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:31:56.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:31:56.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:31:56.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:31:56.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-05-30T07:31:56.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:31:56.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-05-30T07:31:56.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:31:56.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:31:56.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:31:56.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-05-30T07:32:25.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-05-30T07:32:25.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:32:25.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:32:25.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:32:25.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:32:25.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:32:25.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:32:25.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:32:25.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:32:25.321 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:32:25.321 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:32:25.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:32:25.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:32:25.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:32:25.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:32:25.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:32:25.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:32:25.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:32:25.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:32:25.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:32:25.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:32:25.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:32:25.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:32:25.698 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:32:16
2026-05-30T07:32:25.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74105, datetime.datetime(2026, 5, 30, 7, 32, 16), datetime.datetime(2026, 5, 30, 7, 32, 16), 'salt', 11.44, 48.7, None, 13.2, 324.63, 10.41, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:32:25.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:32:25.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:32:25.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:32:16, diff=9.706224s, valid=True
2026-05-30T07:32:25.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:32:25.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:32:25.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:32:12, diff=13.709646s, valid=True
2026-05-30T07:32:25.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:32:25.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:32:25.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:32:11, diff=14.717489s, valid=True
2026-05-30T07:32:25.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:32:25.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:32:25.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:32:25.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:32:25.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:32:25.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:32:25.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:32:12, diff=13.721098s, valid=True
2026-05-30T07:32:25.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:32:25.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:32:25.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:32:25.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051787.721889s, valid=True
2026-05-30T07:32:25.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:32:25.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:32:25.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:32:25.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:32:25.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:32:25.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:32:25.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:32:25.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:32:25.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:32:25.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:32:25.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:32:25.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:32:26.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:32:26.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:32:26.251 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:32:26.591 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:32:26.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:32:26.691 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:32:26.691 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:32:26.860 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:32:26.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:32:56.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:32:56.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:32:56.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:32:57.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:32:57.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:32:57.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:32:57.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-05-30T07:32:57.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:32:57.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-05-30T07:32:57.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:32:57.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:32:57.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:32:57.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-05-30T07:33:00.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-05-30T07:33:00.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:33:00.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:33:00.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:33:00.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:33:00.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:33:00.090 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:33:00.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:33:00.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:33:00.090 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:33:00.090 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:33:00.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:33:00.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:33:00.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:33:00.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:33:00.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:33:00.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:33:00.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:33:00.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:33:00.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:33:00.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:33:00.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:33:00.358 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:33:00.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:32:46
2026-05-30T07:33:00.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74106, datetime.datetime(2026, 5, 30, 7, 32, 46), datetime.datetime(2026, 5, 30, 7, 32, 46), 'salt', 11.31, 48.74, None, 13.41, 328.36, 10.39, 831.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:33:00.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:33:00.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:33:00.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:32:46, diff=14.427241s, valid=True
2026-05-30T07:33:00.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:33:00.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:33:00.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:33:12, diff=-11.569459s, valid=True
2026-05-30T07:33:00.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:33:00.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:33:00.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:32:41, diff=19.438297s, valid=True
2026-05-30T07:33:00.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:33:00.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:33:00.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:33:00.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:33:00.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:33:00.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:33:00.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:33:12, diff=-11.558132s, valid=True
2026-05-30T07:33:00.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:33:00.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:33:00.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:33:00.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051822.442639s, valid=True
2026-05-30T07:33:00.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:33:00.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:33:00.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:33:00.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:33:00.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:33:00.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:33:00.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:33:00.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:33:00.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:33:00.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:33:00.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:33:00.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:33:00.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:33:00.765 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:33:00.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:33:01.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:33:01.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:33:01.519 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:33:01.519 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:33:01.688 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:33:01.688 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:33:31.688 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:33:31.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:33:31.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:33:32.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:33:32.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:33:32.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:33:32.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-05-30T07:33:32.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:33:32.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-05-30T07:33:32.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:33:32.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:33:32.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:33:32.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-05-30T07:34:05.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-05-30T07:34:05.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:34:05.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:34:05.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:34:05.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:34:05.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:34:05.130 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:34:05.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:34:05.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:34:05.131 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:34:05.131 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:34:05.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:34:05.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:34:05.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:34:05.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:34:05.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:34:05.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:34:05.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:34:05.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:34:05.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:34:05.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:34:05.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:34:05.435 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:34:05.496 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:33:47
2026-05-30T07:34:05.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74108, datetime.datetime(2026, 5, 30, 7, 33, 47), datetime.datetime(2026, 5, 30, 7, 33, 47), 'salt', 11.18, 49.1, None, 13.87, 330.78, 10.28, 831.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:34:05.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:34:05.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:34:05.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:33:47, diff=18.504429s, valid=True
2026-05-30T07:34:05.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:34:05.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:34:05.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:34:12, diff=-6.491708s, valid=True
2026-05-30T07:34:05.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:34:05.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:34:05.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:33:44, diff=21.516827s, valid=True
2026-05-30T07:34:05.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:34:05.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:34:05.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:34:05.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:34:05.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:34:05.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:34:05.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:34:12, diff=-6.479224s, valid=True
2026-05-30T07:34:05.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:34:05.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:34:05.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:34:05.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051887.521669s, valid=True
2026-05-30T07:34:05.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:34:05.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:34:05.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:34:05.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:34:05.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:34:05.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:34:05.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:34:05.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:34:05.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:34:05.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:34:05.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:34:05.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:34:05.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:34:05.872 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:34:06.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:34:06.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:34:06.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:34:06.520 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:34:06.520 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:34:06.773 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:34:06.773 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:34:36.792 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:34:36.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:34:36.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:34:36.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:34:36.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:34:37.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:34:37.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-05-30T07:34:37.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:34:37.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-05-30T07:34:37.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:34:37.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:34:37.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:34:37.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-05-30T07:34:39.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-05-30T07:34:39.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:34:39.652 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:34:39.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:34:39.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:34:39.675 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:34:39.676 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:34:39.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:34:39.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:34:39.677 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:34:39.677 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:34:39.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:34:39.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:34:39.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:34:39.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:34:39.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:34:39.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:34:39.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:34:39.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:34:39.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:34:39.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:34:39.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:34:39.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:34:40.053 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:34:17
2026-05-30T07:34:40.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74109, datetime.datetime(2026, 5, 30, 7, 34, 17), datetime.datetime(2026, 5, 30, 7, 34, 16), 'salt', 11.21, 49.27, None, 13.66, 327.54, 10.23, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:34:40.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:34:40.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:34:40.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:34:16, diff=24.060426s, valid=True
2026-05-30T07:34:40.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:34:40.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:34:40.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:34:12, diff=28.064212s, valid=True
2026-05-30T07:34:40.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:34:40.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:34:40.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:34:16, diff=24.072683s, valid=True
2026-05-30T07:34:40.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:34:40.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:34:40.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:34:40.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:34:40.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:34:40.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:34:40.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:34:12, diff=28.075864s, valid=True
2026-05-30T07:34:40.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:34:40.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:34:40.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:34:40.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051922.076531s, valid=True
2026-05-30T07:34:40.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:34:40.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:34:40.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:34:40.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:34:40.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:34:40.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:34:40.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:34:40.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:34:40.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:34:40.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:34:40.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:34:40.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:34:40.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:34:40.403 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:34:40.678 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:34:41.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:34:41.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:34:41.126 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:34:41.126 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:34:41.283 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:34:41.283 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:35:11.313 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:35:11.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:35:11.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:35:11.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:35:11.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:35:12.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:35:12.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-05-30T07:35:12.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:35:12.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-05-30T07:35:12.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:35:12.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:35:12.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:35:12.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-05-30T07:35:40.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-05-30T07:35:40.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:35:40.883 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:35:40.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:35:40.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:35:40.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:35:40.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:35:40.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:35:40.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:35:40.908 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:35:40.908 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:35:40.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:35:41.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:35:41.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:35:41.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:35:41.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:35:41.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:35:41.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:35:41.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:35:41.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:35:41.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:35:41.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:35:41.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:35:41.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:35:18
2026-05-30T07:35:41.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74111, datetime.datetime(2026, 5, 30, 7, 35, 18), datetime.datetime(2026, 5, 30, 7, 35, 17), 'salt', 11.18, 49.3, None, 13.3, 329.02, 10.22, 831.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:35:41.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:35:41.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:35:41.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:35:17, diff=24.301796s, valid=True
2026-05-30T07:35:41.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:35:41.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:35:41.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:35:12, diff=29.305336s, valid=True
2026-05-30T07:35:41.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:35:41.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:35:41.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:35:12, diff=29.313603s, valid=True
2026-05-30T07:35:41.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:35:41.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:35:41.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:35:41.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:35:41.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:35:41.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:35:41.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:35:12, diff=29.317348s, valid=True
2026-05-30T07:35:41.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:35:41.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:35:41.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:35:41.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1051983.318168s, valid=True
2026-05-30T07:35:41.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:35:41.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:35:41.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:35:41.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:35:41.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:35:41.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:35:41.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:35:41.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:35:41.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:35:41.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:35:41.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:35:41.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:35:41.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:35:41.643 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:35:41.849 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:35:42.186 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:35:42.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:35:42.287 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:35:42.287 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:35:42.460 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:35:42.460 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:36:12.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:36:12.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:36:12.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:36:12.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:36:12.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:36:12.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:36:12.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-05-30T07:36:12.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:36:12.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-05-30T07:36:13.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:36:13.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:36:13.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:36:13.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-05-30T07:36:51.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-05-30T07:36:51.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:36:51.623 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:36:51.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:36:51.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:36:51.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:36:51.661 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:36:51.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:36:51.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:36:51.662 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:36:51.662 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:36:51.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:36:51.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:36:51.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:36:51.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:36:51.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:36:51.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:36:51.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:36:51.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:36:51.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:36:51.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:36:51.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:36:51.993 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:36:52.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:36:49
2026-05-30T07:36:52.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74114, datetime.datetime(2026, 5, 30, 7, 36, 49), datetime.datetime(2026, 5, 30, 7, 36, 48), 'salt', 11.21, 49.7, None, 13.8, 327.19, 10.11, 832.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:36:52.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:36:52.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:36:52.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:36:48, diff=4.067022s, valid=True
2026-05-30T07:36:52.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:36:52.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:36:52.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:37:12, diff=-19.929566s, valid=True
2026-05-30T07:36:52.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:36:52.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:36:52.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:36:43, diff=9.078516s, valid=True
2026-05-30T07:36:52.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:36:52.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:36:52.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:36:52.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:36:52.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:36:52.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:36:52.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:37:12, diff=-19.917871s, valid=True
2026-05-30T07:36:52.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:36:52.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:36:52.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:36:52.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052054.082923s, valid=True
2026-05-30T07:36:52.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:36:52.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:36:52.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:36:52.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:36:52.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:36:52.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:36:52.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:36:52.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:36:52.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:36:52.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:36:52.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:36:52.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:36:52.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:36:52.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:36:52.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:36:53.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:36:53.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:36:53.128 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:36:53.128 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:36:53.345 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:36:53.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:37:23.376 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:37:23.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:37:23.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:37:23.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:37:23.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:37:23.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:37:23.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-05-30T07:37:23.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:37:23.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-05-30T07:37:23.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:37:23.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:37:23.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:37:23.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-05-30T07:37:26.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-05-30T07:37:26.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:37:26.497 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:37:26.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:37:26.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:37:26.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:37:26.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:37:26.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:37:26.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:37:26.521 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:37:26.522 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:37:26.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:37:26.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:37:26.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:37:26.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:37:26.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:37:26.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:37:26.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:37:26.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:37:26.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:37:26.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:37:26.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:37:26.850 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:37:26.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:37:19
2026-05-30T07:37:26.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74115, datetime.datetime(2026, 5, 30, 7, 37, 19), datetime.datetime(2026, 5, 30, 7, 37, 19), 'salt', 11.21, 49.57, None, 13.06, 328.15, 10.15, 831.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:37:26.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:37:26.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:37:26.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:37:19, diff=7.921087s, valid=True
2026-05-30T07:37:26.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:37:26.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:37:26.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:37:12, diff=14.925808s, valid=True
2026-05-30T07:37:26.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:37:26.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:37:26.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:37:14, diff=12.935457s, valid=True
2026-05-30T07:37:26.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:37:26.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:37:26.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:37:26.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:37:26.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:37:26.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:37:26.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:37:12, diff=14.939874s, valid=True
2026-05-30T07:37:26.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:37:26.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:37:26.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:37:26.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052088.940836s, valid=True
2026-05-30T07:37:26.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:37:26.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:37:26.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:37:26.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:37:26.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:37:27.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:37:27.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:37:27.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:37:27.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:37:27.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:37:27.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:37:27.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:37:27.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:37:27.270 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:37:27.468 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:37:27.800 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:37:27.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:37:27.897 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:37:27.897 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:37:28.063 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:37:28.063 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:37:58.071 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:37:58.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:37:58.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:37:58.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:37:58.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:37:58.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:37:58.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-05-30T07:37:58.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:37:58.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-05-30T07:37:58.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:37:58.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:37:58.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:37:58.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-05-30T07:38:01.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T07:38:01.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:38:01.180 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:38:01.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:38:01.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:38:01.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:38:01.204 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:38:01.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:38:01.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:38:01.205 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:38:01.206 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:38:01.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:38:01.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:38:01.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:38:01.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:38:01.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:38:01.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:38:01.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:38:01.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:38:01.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:38:01.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:38:01.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:38:01.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:38:01.590 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:37:49
2026-05-30T07:38:01.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74116, datetime.datetime(2026, 5, 30, 7, 37, 49), datetime.datetime(2026, 5, 30, 7, 37, 49), 'salt', 11.21, 49.47, None, 13.27, 326.95, 10.18, 832.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:38:01.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:38:01.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:38:01.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:37:49, diff=12.597876s, valid=True
2026-05-30T07:38:01.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:38:01.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:38:01.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:38:12, diff=-10.398584s, valid=True
2026-05-30T07:38:01.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:38:01.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:38:01.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:37:46, diff=15.609732s, valid=True
2026-05-30T07:38:01.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:38:01.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:38:01.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:38:01.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:38:01.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:38:01.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:38:01.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:38:12, diff=-10.386486s, valid=True
2026-05-30T07:38:01.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:38:01.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:38:01.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:38:01.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052123.614346s, valid=True
2026-05-30T07:38:01.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:38:01.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:38:01.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:38:01.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:38:01.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:38:01.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:38:01.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:38:01.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:38:01.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:38:01.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:38:01.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:38:01.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:38:01.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:38:02.025 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:38:02.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:38:02.577 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:38:02.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:38:02.675 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:38:02.676 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:38:02.852 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:38:02.852 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:38:32.882 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:38:32.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:38:32.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:38:33.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:38:33.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:38:33.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:38:33.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-05-30T07:38:33.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:38:33.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-05-30T07:38:33.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:38:33.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:38:33.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:38:33.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-05-30T07:38:36.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-05-30T07:38:36.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:38:36.168 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:38:36.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:38:36.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:38:36.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:38:36.191 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:38:36.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:38:36.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:38:36.192 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:38:36.192 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:38:36.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:38:36.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:38:36.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:38:36.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:38:36.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:38:36.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:38:36.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:38:36.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:38:36.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:38:36.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:38:36.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:38:36.519 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:38:36.581 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:38:19
2026-05-30T07:38:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74117, datetime.datetime(2026, 5, 30, 7, 38, 19), datetime.datetime(2026, 5, 30, 7, 38, 19), 'salt', 11.31, 49.17, None, 12.46, 321.53, 10.27, 831.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:38:36.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:38:36.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:38:36.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:38:19, diff=17.589384s, valid=True
2026-05-30T07:38:36.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:38:36.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:38:36.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:38:12, diff=24.592981s, valid=True
2026-05-30T07:38:36.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:38:36.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:38:36.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:38:17, diff=19.601511s, valid=True
2026-05-30T07:38:36.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:38:36.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:38:36.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:38:36.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:38:36.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:38:36.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:38:36.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:38:12, diff=24.60532s, valid=True
2026-05-30T07:38:36.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:38:36.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:38:36.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:38:36.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052158.606152s, valid=True
2026-05-30T07:38:36.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:38:36.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:38:36.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:38:36.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:38:36.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:38:36.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:38:36.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:38:36.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:38:36.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:38:36.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:38:36.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:38:36.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:38:36.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:38:36.929 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:38:37.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:38:37.456 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:38:37.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:38:37.554 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:38:37.555 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:38:37.783 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:38:37.783 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:39:07.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:39:07.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:39:07.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:39:08.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:39:08.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:39:08.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:39: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-05-30T07:39:08.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:39: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-05-30T07:39:08.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:39:08.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:39:08.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:39: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-05-30T07:39:10.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-05-30T07:39:10.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:39:10.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:39:10.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:39:10.740 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:39:10.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:39:10.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:39:10.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:39:10.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:39:10.754 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:39:10.755 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:39:10.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:39:10.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:39:10.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:39:11.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:39:11.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:39:11.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:39:11.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:39:11.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:39:11.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:39:11.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:39:11.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:39:11.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:39:11.197 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:38:50
2026-05-30T07:39:11.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74118, datetime.datetime(2026, 5, 30, 7, 38, 50), datetime.datetime(2026, 5, 30, 7, 38, 49), 'salt', 11.48, 48.7, None, 12.18, 326.39, 10.42, 831.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:39:11.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:39:11.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:39:11.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:38:49, diff=22.203994s, valid=True
2026-05-30T07:39:11.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:39:11.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:39:11.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:39:12, diff=-0.793221s, valid=True
2026-05-30T07:39:11.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:39:11.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:39:11.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:38:49, diff=22.213337s, valid=True
2026-05-30T07:39:11.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:39:11.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:39:11.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:39:11.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:39:11.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:39:11.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:39:11.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:39:12, diff=-0.783629s, valid=True
2026-05-30T07:39:11.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:39:11.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:39:11.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:39:11.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052193.217037s, valid=True
2026-05-30T07:39:11.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:39:11.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:39:11.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:39:11.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:39:11.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:39:11.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:39:11.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:39:11.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:39:11.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:39:11.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:39:11.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:39:11.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:39:11.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:39:11.531 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:39:11.728 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:39:12.059 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:39:12.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:39:12.157 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:39:12.157 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:39:12.324 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:39:12.325 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:39:42.349 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:39:42.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:39:42.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:39:42.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:39:42.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:39:42.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:39:42.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-05-30T07:39:42.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:39:42.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-05-30T07:39:42.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:39:42.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:39:42.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:39:42.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-05-30T07:39:45.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-05-30T07:39:45.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:39:45.460 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:39:45.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:39:45.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:39:45.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:39:45.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:39:45.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:39:45.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:39:45.482 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:39:45.482 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:39:45.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:39:45.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:39:45.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:39:45.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:39:45.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:39:45.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:39:45.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:39:45.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:39:45.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:39:45.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:39:45.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:39:45.801 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:39:45.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:39:20
2026-05-30T07:39:45.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74119, datetime.datetime(2026, 5, 30, 7, 39, 20), datetime.datetime(2026, 5, 30, 7, 39, 20), 'salt', 11.51, 48.44, None, 12.77, 325.69, 10.49, 831.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:39:45.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:39:45.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:39:45.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:39:20, diff=25.870769s, valid=True
2026-05-30T07:39:45.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:39:45.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:39:45.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:39:12, diff=33.874285s, valid=True
2026-05-30T07:39:45.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:39:45.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:39:45.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:39:14, diff=31.882195s, valid=True
2026-05-30T07:39:45.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:39:45.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:39:45.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:39:45.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:39:45.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:39:45.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:39:45.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:39:12, diff=33.885994s, valid=True
2026-05-30T07:39:45.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:39:45.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:39:45.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:39:45.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052227.88686s, valid=True
2026-05-30T07:39:45.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:39:45.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:39:45.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:39:45.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:39:45.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:39:45.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:39:45.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:39:45.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:39:45.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:39:46.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:39:46.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:39:46.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:39:46.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:39:46.243 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:39:46.459 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:39:46.788 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:39:46.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:39:46.887 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:39:46.887 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:39:47.052 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:39:47.052 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:40:17.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:40:17.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:40:17.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:40:17.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:40:17.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:40:17.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:40:17.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-05-30T07:40:17.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:40:17.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-05-30T07:40:17.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:40:17.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:40:17.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:40:17.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-05-30T07:40:50.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-05-30T07:40:50.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:40:50.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:40:50.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:40:50.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:40:50.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:40:50.665 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:40:50.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:40:50.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:40:50.665 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:40:50.665 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:40:50.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:40:50.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:40:50.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:40:50.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:40:50.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:40:50.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:40:50.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:40:50.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:40:50.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:40:50.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:40:50.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:40:50.921 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:40:50.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:40:20
2026-05-30T07:40:50.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74121, datetime.datetime(2026, 5, 30, 7, 40, 20), datetime.datetime(2026, 5, 30, 7, 40, 20), 'salt', 11.61, 48.44, None, 12.46, 324.89, 10.5, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:40:50.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:40:50.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:40:50.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:40:50, diff=0.996169s, valid=True
2026-05-30T07:40:50.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:40:50.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:40:50.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:40:12, diff=38.999727s, valid=True
2026-05-30T07:40:50.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:40:50.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:40:51.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:40:45, diff=6.007544s, valid=True
2026-05-30T07:40:51.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:40:51.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:40:51.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:40:51.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:40:51.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:40:51.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:40:51.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:40:12, diff=39.010939s, valid=True
2026-05-30T07:40:51.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:40:51.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:40:51.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:40:51.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052293.011673s, valid=True
2026-05-30T07:40:51.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:40:51.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:40:51.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:40:51.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:40:51.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:40:51.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:40:51.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:40:51.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:40:51.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:40:51.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:40:51.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:40:51.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:40:51.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:40:51.345 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:40:51.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:40:51.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:40:51.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:40:51.986 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:40:51.986 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:40:52.243 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:40:52.243 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:41:22.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:41:22.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:41:22.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:41:22.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:41:22.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:41:22.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:41:22.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T07:41:22.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:41:22.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-05-30T07:41:22.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:41:22.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:41:22.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:41:22.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-05-30T07:41:26.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-05-30T07:41:26.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:41:26.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:41:26.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:41:26.376 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:41:26.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:41:26.411 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:41:26.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:41:26.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:41:26.412 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:41:26.412 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:41:26.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:41:26.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:41:26.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:41:26.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:41:26.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:41:26.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:41:26.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:41:26.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:41:26.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:41:26.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:41:26.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:41:26.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:41:26.791 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:41:21
2026-05-30T07:41:26.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74123, datetime.datetime(2026, 5, 30, 7, 41, 21), datetime.datetime(2026, 5, 30, 7, 41, 20), 'salt', 11.58, 48.37, None, 12.14, 325.05, 10.52, 831.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:41:26.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:41:26.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:41:26.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:41:20, diff=6.797544s, valid=True
2026-05-30T07:41:26.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:41:26.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:41:26.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:41:12, diff=14.800424s, valid=True
2026-05-30T07:41:26.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:41:26.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:41:26.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:41:15, diff=11.80725s, valid=True
2026-05-30T07:41:26.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:41:26.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:41:26.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:41:26.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:41:26.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:41:26.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:41:26.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:41:12, diff=14.810318s, valid=True
2026-05-30T07:41:26.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:41:26.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:41:26.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:41:26.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052328.810988s, valid=True
2026-05-30T07:41:26.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:41:26.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:41:26.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:41:26.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:41:26.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:41:26.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:41:26.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:41:26.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:41:26.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:41:26.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:41:27.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:41:27.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:41:27.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:41:27.267 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:41:27.463 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:41:27.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:41:27.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:41:27.947 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:41:27.947 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:41:28.119 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:41:28.119 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:41:58.149 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:41:58.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:41:58.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:41:58.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:41:58.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:41:58.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:41:58.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-05-30T07:41:58.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:41: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-05-30T07:41:58.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:41:58.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:41:58.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:41:58.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-05-30T07:42: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-05-30T07:42:01.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:42:01.228 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:42:01.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:42:01.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:42:01.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:42:01.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:42:01.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:42:01.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:42:01.257 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:42:01.257 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:42:01.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:42:01.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:42:01.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:42:01.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:42:01.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:42:01.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:42:01.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:42:01.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:42:01.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:42:01.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:42:01.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:42:01.621 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:42:01.683 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:41:51
2026-05-30T07:42:01.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74124, datetime.datetime(2026, 5, 30, 7, 41, 51), datetime.datetime(2026, 5, 30, 7, 41, 51), 'salt', 11.64, 48.57, None, 12.85, 327.35, 10.46, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:42:01.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:42:01.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:42:01.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:41:51, diff=10.689699s, valid=True
2026-05-30T07:42:01.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:42:01.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:42:01.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:42:12, diff=-10.307331s, valid=True
2026-05-30T07:42:01.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:42:01.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:42:01.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:41:47, diff=14.699687s, valid=True
2026-05-30T07:42:01.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:42:01.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:42:01.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:42:01.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:42:01.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:42:01.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:42:01.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:42:12, diff=-10.297143s, valid=True
2026-05-30T07:42:01.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:42:01.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:42:01.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:42:01.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052363.703537s, valid=True
2026-05-30T07:42:01.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:42:01.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:42:01.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:42:01.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:42:01.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:42:01.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:42:01.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:42:01.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:42:01.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:42:01.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:42:01.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:42:01.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:42:01.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:42:02.023 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:42:02.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:42:02.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:42:02.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:42:02.650 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:42:02.650 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:42:02.827 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:42:02.827 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:42:32.857 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:42:32.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:42:32.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:42:33.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:42:33.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:42:33.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:42:33.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-05-30T07:42:33.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:42:33.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-05-30T07:42:33.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:42:33.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:42:33.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:42:33.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-05-30T07:42:46.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-05-30T07:42:46.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:42:46.875 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:42:46.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:42:46.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:42:46.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:42:46.896 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:42:46.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:42:46.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:42:46.898 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:42:46.898 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:42:46.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:42:47.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:42:47.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:42:47.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:42:47.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:42:47.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:42:47.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:42:47.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:42:47.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:42:47.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:42:47.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:42:47.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:42:47.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:42:21
2026-05-30T07:42:47.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74125, datetime.datetime(2026, 5, 30, 7, 42, 21), datetime.datetime(2026, 5, 30, 7, 42, 21), 'salt', 11.54, 48.6, None, 12.03, 336.84, 10.45, 831.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:42:47.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:42:47.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:42:47.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:42:21, diff=26.305707s, valid=True
2026-05-30T07:42:47.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:42:47.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:42:47.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:42:12, diff=35.30925s, valid=True
2026-05-30T07:42:47.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:42:47.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:42:47.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:42:18, diff=29.317458s, valid=True
2026-05-30T07:42:47.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:42:47.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:42:47.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:42:47.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:42:47.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:42:47.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:42:47.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:42:12, diff=35.321288s, valid=True
2026-05-30T07:42:47.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:42:47.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:42:47.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:42:47.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052409.322133s, valid=True
2026-05-30T07:42:47.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:42:47.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:42:47.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:42:47.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:42:47.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:42:47.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:42:47.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:42:47.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:42:47.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:42:47.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:42:47.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:42:47.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:42:47.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:42:47.644 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:42:47.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:42:48.269 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:42:48.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:42:48.370 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:42:48.370 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:42:48.626 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:42:48.627 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:43:18.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:43:18.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:43:18.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:43:18.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:43:18.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:43:18.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:43:18.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-05-30T07:43:19.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:43:19.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-05-30T07:43:19.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:43:19.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:43:19.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:43:19.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-05-30T07:43:21.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-05-30T07:43:21.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:43:21.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:43:21.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:43:21.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:43:21.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:43:21.455 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:43:21.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:43:21.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:43:21.456 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:43:21.456 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:43:21.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:43:21.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:43:21.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:43:21.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:43:21.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:43:21.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:43:21.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:43:21.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:43:21.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:43:21.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:43:21.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:43:21.747 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:43:21.810 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:42:52
2026-05-30T07:43:21.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74126, datetime.datetime(2026, 5, 30, 7, 42, 52), datetime.datetime(2026, 5, 30, 7, 42, 50), 'salt', 11.61, 48.97, None, 11.82, 324.3, 10.35, 831.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:43:21.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:43:21.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:43:21.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:42:50, diff=31.816783s, valid=True
2026-05-30T07:43:21.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:43:21.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:43:21.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:43:12, diff=9.819573s, valid=True
2026-05-30T07:43:21.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:43:21.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:43:21.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:42:49, diff=32.826311s, valid=True
2026-05-30T07:43:21.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:43:21.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:43:21.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:43:21.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:43:21.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:43:21.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:43:21.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:43:12, diff=9.829357s, valid=True
2026-05-30T07:43:21.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:43:21.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:43:21.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:43:21.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052443.830032s, valid=True
2026-05-30T07:43:21.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:43:21.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:43:21.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:43:21.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:43:21.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:43:21.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:43:21.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:43:21.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:43:21.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:43:21.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:43:22.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:43:22.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:43:22.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:43:22.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:43:22.345 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:43:22.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:43:22.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:43:22.783 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:43:22.783 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:43:23.044 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:43:23.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:43:53.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:43:53.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:43:53.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:43:53.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:43:53.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:43:53.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:43:53.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T07:43:53.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:43:53.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T07:43:53.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:43:53.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:43:53.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:43:53.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-05-30T07:43:56.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-05-30T07:43:56.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:43:56.027 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:43:56.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:43:56.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:43:56.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:43:56.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:43:56.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:43:56.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:43:56.051 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:43:56.051 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:43:56.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:43:56.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:43:56.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:43:56.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:43:56.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:43:56.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:43:56.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:43:56.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:43:56.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:43:56.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:43:56.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:43:56.368 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:43:56.430 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:43:52
2026-05-30T07:43:56.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74128, datetime.datetime(2026, 5, 30, 7, 43, 52), datetime.datetime(2026, 5, 30, 7, 43, 51), 'salt', 11.54, 49.04, None, 12.77, 321.27, 10.32, 832.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:43:56.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:43:56.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:43:56.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:43:51, diff=5.438192s, valid=True
2026-05-30T07:43:56.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:43:56.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:43:56.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:44:12, diff=-15.55825s, valid=True
2026-05-30T07:43:56.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:43:56.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:43:56.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:43:46, diff=10.450014s, valid=True
2026-05-30T07:43:56.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:43:56.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:43:56.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:43:56.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:43:56.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:43:56.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:43:56.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:44:12, diff=-15.546226s, valid=True
2026-05-30T07:43:56.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:43:56.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:43:56.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:43:56.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052478.454592s, valid=True
2026-05-30T07:43:56.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:43:56.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:43:56.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:43:56.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:43:56.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:43:56.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:43:56.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:43:56.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:43:56.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:43:56.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:43:56.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:43:56.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:43:56.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:43:56.857 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:43:57.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:43:57.402 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:43:57.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:43:57.503 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:43:57.503 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:43:57.761 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:43:57.761 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:44:27.783 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:44:27.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:44:27.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:44:28.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:44:28.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:44:28.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:44:28.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-05-30T07:44:28.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:44:28.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-05-30T07:44:28.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:44:28.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:44:28.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:44:28.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-05-30T07:44:30.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-05-30T07:44:30.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:44:30.661 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:44:30.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:44:30.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:44:30.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:44:30.686 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:44:30.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:44:30.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:44:30.687 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:44:30.687 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:44:30.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:44:30.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:44:30.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:44:30.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:44:30.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:44:30.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:44:30.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:44:31.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:44:31.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:44:31.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:44:31.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:44:31.009 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:44:31.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:44:22
2026-05-30T07:44:31.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74129, datetime.datetime(2026, 5, 30, 7, 44, 22), datetime.datetime(2026, 5, 30, 7, 44, 22), 'salt', 11.48, 48.97, None, 11.54, 321.91, 10.34, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:44:31.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:44:31.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:44:31.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:44:22, diff=9.080615s, valid=True
2026-05-30T07:44:31.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:44:31.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:44:31.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:44:12, diff=19.084156s, valid=True
2026-05-30T07:44:31.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:44:31.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:44:31.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:44:16, diff=15.092542s, valid=True
2026-05-30T07:44:31.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:44:31.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:44:31.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:44:31.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:44:31.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:44:31.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:44:31.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:44:12, diff=19.096282s, valid=True
2026-05-30T07:44:31.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:44:31.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:44:31.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:44:31.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052513.097127s, valid=True
2026-05-30T07:44:31.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:44:31.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:44:31.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:44:31.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:44:31.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:44:31.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:44:31.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:44:31.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:44:31.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:44:31.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:44:31.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:44:31.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:44:31.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:44:31.423 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:44:31.622 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:44:31.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:44:32.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:44:32.059 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:44:32.059 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:44:32.343 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:44:32.343 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:45:02.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:45:02.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:45:02.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:45:02.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:45:02.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:45:02.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:45:02.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-05-30T07:45:02.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:45:02.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-05-30T07:45:02.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:45:02.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:45:02.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:45:02.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-05-30T07:45:05.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-05-30T07:45:05.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:45:05.274 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:45:05.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:45:05.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:45:05.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:45:05.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:45:05.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:45:05.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:45:05.296 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:45:05.296 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:45:05.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:45:05.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:45:05.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:45:05.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:45:05.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:45:05.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:45:05.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:45:05.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:45:05.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:45:05.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:45:05.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:45:05.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:45:05.637 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:44:53
2026-05-30T07:45:05.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74130, datetime.datetime(2026, 5, 30, 7, 44, 53), datetime.datetime(2026, 5, 30, 7, 44, 52), 'salt', 11.54, 49.33, None, 11.29, 322.09, 10.24, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:45:05.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:45:05.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:45:05.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:44:52, diff=13.644364s, valid=True
2026-05-30T07:45:05.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:45:05.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:45:05.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:45:12, diff=-6.352402s, valid=True
2026-05-30T07:45:05.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:45:05.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:45:05.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:44:47, diff=18.65523s, valid=True
2026-05-30T07:45:05.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:45:05.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:45:05.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:45:05.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:45:05.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:45:05.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:45:05.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:45:12, diff=-6.341322s, valid=True
2026-05-30T07:45:05.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:45:05.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:45:05.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:45:05.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052547.659418s, valid=True
2026-05-30T07:45:05.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:45:05.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:45:05.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:45:05.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:45:05.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:45:05.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:45:05.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:45:05.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:45:05.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:45:05.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:45:05.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:45:05.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:45:06.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:45:06.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:45:06.249 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:45:06.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:45:06.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:45:06.676 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:45:06.676 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:45:06.850 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:45:06.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:45:36.880 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:45:36.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:45:36.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:45:37.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:45:37.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:45:37.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:45:37.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-05-30T07:45:37.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:45:37.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-05-30T07:45:37.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:45:37.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:45:37.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:45:37.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-05-30T07:45:39.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-05-30T07:45:39.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:45:39.633 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:45:39.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:45:39.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:45:39.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:45:39.656 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:45:39.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:45:39.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:45:39.657 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:45:39.657 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:45:39.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:45:39.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:45:39.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:45:39.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:45:39.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:45:39.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:45:39.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:45:39.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-30T07:45:39.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:45:39.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:45:39.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:45:39.974 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:45:40.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:45:23
2026-05-30T07:45:40.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74131, datetime.datetime(2026, 5, 30, 7, 45, 23), datetime.datetime(2026, 5, 30, 7, 45, 22), 'salt', 11.48, 49.23, None, 11.29, 322.56, 10.27, 831.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:45:40.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:45:40.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:45:40.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:45:22, diff=18.048482s, valid=True
2026-05-30T07:45:40.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:45:40.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:45:40.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:45:12, diff=28.051851s, valid=True
2026-05-30T07:45:40.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:45:40.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:45:40.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:45:17, diff=23.059338s, valid=True
2026-05-30T07:45:40.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:45:40.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:45:40.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:45:40.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:45:40.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:45:40.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-30T07:45:40.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:45:12, diff=28.062723s, valid=True
2026-05-30T07:45:40.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:45:40.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:45:40.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:45:40.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052582.063474s, valid=True
2026-05-30T07:45:40.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:45:40.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:45:40.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:45:40.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:45:40.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:45:40.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:45:40.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:45:40.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:45:40.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:45:40.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:45:40.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:45:40.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:45:40.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:45:40.384 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:45:40.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:45:40.912 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:45:41.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:45:41.010 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:45:41.010 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:45:41.185 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:45:41.185 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:46:11.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:46:11.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:46:11.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:46:11.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:46:11.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:46:11.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:46:11.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-05-30T07:46:11.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:46:11.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-05-30T07:46:11.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:46:11.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:46:11.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:46:11.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-05-30T07:46:14.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-05-30T07:46:14.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:46:14.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:46:14.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:46:14.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:46:14.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:46:14.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:46:14.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:46:14.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:46:14.035 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:46:14.035 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:46:14.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:46:14.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:46:14.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:46:14.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:46:14.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:46:14.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:46:14.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:46:14.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:46:14.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:46:14.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:46:14.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:46:14.359 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:46:14.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:45:53
2026-05-30T07:46:14.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74132, datetime.datetime(2026, 5, 30, 7, 45, 53), datetime.datetime(2026, 5, 30, 7, 45, 52), 'salt', 11.38, 49.14, None, 11.82, 322.75, 10.29, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:46:14.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:46:14.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:46:14.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:45:52, diff=22.432104s, valid=True
2026-05-30T07:46:14.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:46:14.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:46:14.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:46:12, diff=2.435615s, valid=True
2026-05-30T07:46:14.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:46:14.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:46:14.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:45:48, diff=26.444017s, valid=True
2026-05-30T07:46:14.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:46:14.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:46:14.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:46:14.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:46:14.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:46:14.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:46:14.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:46:12, diff=2.44781s, valid=True
2026-05-30T07:46:14.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:46:14.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:46:14.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:46:14.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052616.448648s, valid=True
2026-05-30T07:46:14.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:46:14.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:46:14.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:46:14.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:46:14.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:46:14.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:46:14.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:46:14.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:46:14.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:46:14.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:46:14.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:46:14.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:46:14.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:46:14.835 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:46:15.033 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:46:15.366 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:46:15.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:46:15.466 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:46:15.466 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:46:15.725 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:46:15.725 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:46:45.728 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:46:45.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:46:45.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:46:46.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:46:46.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:46:46.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:46:46.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-05-30T07:46:46.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:46:46.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-05-30T07:46:46.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:46:46.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:46:46.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:46:46.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-05-30T07:46:48.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-05-30T07:46:48.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:46:48.562 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:46:48.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:46:48.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:46:48.584 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:46:48.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:46:48.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:46:48.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:46:48.586 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:46:48.586 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:46:48.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:46:48.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:46:48.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:46:48.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:46:48.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:46:48.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:46:48.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:46:48.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-30T07:46:48.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:46:48.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:46:48.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:46:48.915 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:46:48.977 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:46:23
2026-05-30T07:46:48.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74133, datetime.datetime(2026, 5, 30, 7, 46, 23), datetime.datetime(2026, 5, 30, 7, 46, 22), 'salt', 11.54, 49.27, None, 11.89, 326.41, 10.26, 832.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:46:48.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:46:48.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:46:48.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:46:22, diff=26.985609s, valid=True
2026-05-30T07:46:48.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:46:48.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:46:48.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:46:12, diff=36.989282s, valid=True
2026-05-30T07:46:48.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:46:48.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:46:48.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:46:19, diff=29.997775s, valid=True
2026-05-30T07:46:48.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:46:48.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:46:48.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:46:48.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:46:48.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:46:48.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-30T07:46:49.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:46:12, diff=37.001566s, valid=True
2026-05-30T07:46:49.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:46:49.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:46:49.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:46:49.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052651.002396s, valid=True
2026-05-30T07:46:49.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:46:49.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:46:49.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:46:49.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:46:49.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:46:49.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:46:49.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:46:49.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:46:49.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:46:49.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:46:49.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:46:49.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:46:49.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:46:49.325 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:46:49.522 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:46:49.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:46:49.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:46:49.966 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:46:49.966 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:46:50.257 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:46:50.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:47:20.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:47:20.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:47:20.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:47:20.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:47:20.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:47:21.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:47:21.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-05-30T07:47:21.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:47:21.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-05-30T07:47:21.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:47:21.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:47:21.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:47:21.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-05-30T07:47:23.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-05-30T07:47:23.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:47:23.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:47:23.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:47:23.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:47:23.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:47:23.772 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:47:23.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:47:23.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:47:23.773 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:47:23.773 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:47:23.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:47:23.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:47:23.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:47:23.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:47:23.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:47:23.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T07:47:23.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:47:24.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-30T07:47:24.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:47:24.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:47:24.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:47:24.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:47:24.093 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:46:54
2026-05-30T07:47:24.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74134, datetime.datetime(2026, 5, 30, 7, 46, 54), datetime.datetime(2026, 5, 30, 7, 46, 53), 'salt', 11.38, 49.4, None, 11.86, 324.79, 10.21, 832.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:47:24.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:47:24.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:47:24.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:46:53, diff=31.10047s, valid=True
2026-05-30T07:47:24.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:47:24.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T07:47:24.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:47:12, diff=12.103778s, valid=True
2026-05-30T07:47:24.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:47:24.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:47:24.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:46:50, diff=34.111452s, valid=True
2026-05-30T07:47:24.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:47:24.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:47:24.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:47:24.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:47:24.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:47:24.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-30T07:47:24.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:47:12, diff=12.114885s, valid=True
2026-05-30T07:47:24.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:47:24.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:47:24.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:47:24.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052686.115617s, valid=True
2026-05-30T07:47:24.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:47:24.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:47:24.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:47:24.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:47:24.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:47:24.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:47:24.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:47:24.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:47:24.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:47:24.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:47:24.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:47:24.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:47:24.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:47:24.435 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:47:24.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:47:24.964 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:47:25.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:47:25.062 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:47:25.062 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:47:25.326 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:47:25.327 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:47:55.357 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:47:55.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:47:55.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:47:55.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:47:55.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:47:55.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:47:55.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-05-30T07:47:55.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:47:55.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-05-30T07:47:55.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:47:55.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:47:55.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:47:55.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-05-30T07:47:58.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-05-30T07:47:58.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:47:58.266 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:47:58.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:47:58.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:47:58.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:47:58.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:47:58.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:47:58.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:47:58.291 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:47:58.291 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:47:58.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:47:58.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:47:58.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:47:58.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:47:58.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:47:58.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T07:47:58.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:47:58.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T07:47:58.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:47:58.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:47:58.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:47:58.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:47:58.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:47:54
2026-05-30T07:47:58.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74136, datetime.datetime(2026, 5, 30, 7, 47, 54), datetime.datetime(2026, 5, 30, 7, 47, 53), 'salt', 11.34, 49.73, None, 12.25, 333.31, 10.11, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:47:58.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:47:58.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:47:58.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:47:53, diff=5.684563s, valid=True
2026-05-30T07:47:58.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:47:58.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T07:47:58.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:48:12, diff=-13.311989s, valid=True
2026-05-30T07:47:58.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:47:58.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:47:58.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:47:53, diff=5.696252s, valid=True
2026-05-30T07:47:58.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:47:58.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:47:58.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:47:58.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:47:58.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:47:58.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T07:47:58.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:48:12, diff=-13.300026s, valid=True
2026-05-30T07:47:58.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:47:58.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:47:58.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:47:58.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052720.700781s, valid=True
2026-05-30T07:47:58.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:47:58.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:47:58.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:47:58.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:47:58.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:47:58.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:47:58.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:47:58.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:47:58.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:47:58.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:47:58.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:47:58.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:47:58.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:47:59.024 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:47:59.221 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:47:59.608 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:47:59.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:47:59.707 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:47:59.707 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:47:59.884 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:47:59.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:48:29.914 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:48:29.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:48:29.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:48:30.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:48:30.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:48:30.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:48:30.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-05-30T07:48:30.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:48:30.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-05-30T07:48:30.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:48:30.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:48:30.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:48:30.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-05-30T07:48:32.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-05-30T07:48:32.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:48:32.801 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:48:32.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:48:32.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:48:32.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:48:32.827 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:48:32.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:48:32.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:48:32.828 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:48:32.828 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:48:32.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:48:32.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:48:32.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:48:33.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:48:33.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:48:33.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T07:48:33.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:48:33.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T07:48:33.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:48:33.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:48:33.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:48:33.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:48:33.213 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:48:25
2026-05-30T07:48:33.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74137, datetime.datetime(2026, 5, 30, 7, 48, 25), datetime.datetime(2026, 5, 30, 7, 48, 24), 'salt', 11.48, 49.9, None, 11.19, 328.2, 10.08, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:48:33.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:48:33.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:48:33.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:48:24, diff=9.219825s, valid=True
2026-05-30T07:48:33.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:48:33.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T07:48:33.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:48:12, diff=21.223011s, valid=True
2026-05-30T07:48:33.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:48:33.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:48:33.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:48:18, diff=15.231058s, valid=True
2026-05-30T07:48:33.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:48:33.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:48:33.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:48:33.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:48:33.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:48:33.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T07:48:33.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:48:12, diff=21.234772s, valid=True
2026-05-30T07:48:33.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:48:33.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:48:33.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:48:33.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052755.235576s, valid=True
2026-05-30T07:48:33.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:48:33.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:48:33.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:48:33.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:48:33.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:48:33.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:48:33.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:48:33.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:48:33.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:48:33.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:48:33.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:48:33.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:48:33.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:48:33.559 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:48:33.756 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:48:34.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:48:34.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:48:34.186 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:48:34.186 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:48:34.363 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:48:34.363 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:49:04.368 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:49:04.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:49:04.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:49:05.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:49:05.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:49:05.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:49:05.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-05-30T07:49:05.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:49:05.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-05-30T07:49:05.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:49:05.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:49:05.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:49:05.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-05-30T07:49:07.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-05-30T07:49:07.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:49:07.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:49:07.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:49:07.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:49:07.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:49:07.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:49:07.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:49:07.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:49:07.738 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:49:07.738 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:49:07.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:49:07.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:49:07.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:49:07.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:49:07.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:49:08.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T07:49:08.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:49:08.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T07:49:08.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:49:08.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:49:08.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:49:08.062 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:49:08.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:48:55
2026-05-30T07:49:08.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74138, datetime.datetime(2026, 5, 30, 7, 48, 55), datetime.datetime(2026, 5, 30, 7, 48, 53), 'salt', 11.51, 50.2, None, 12.46, 330.24, 10.0, 832.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:49:08.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:49:08.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:49:08.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:48:53, diff=15.130593s, valid=True
2026-05-30T07:49:08.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:49:08.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T07:49:08.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:49:12, diff=-3.866072s, valid=True
2026-05-30T07:49:08.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:49:08.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:49:08.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:48:48, diff=20.142046s, valid=True
2026-05-30T07:49:08.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:49:08.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:49:08.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:49:08.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:49:08.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:49:08.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T07:49:08.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:49:12, diff=-3.854429s, valid=True
2026-05-30T07:49:08.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:49:08.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:49:08.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:49:08.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052790.146343s, valid=True
2026-05-30T07:49:08.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:49:08.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:49:08.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:49:08.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:49:08.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:49:08.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:49:08.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:49:08.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:49:08.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:49:08.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:49:08.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:49:08.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:49:08.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:49:08.469 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:49:08.739 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:49:09.069 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:49:09.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:49:09.168 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:49:09.168 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:49:09.374 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:49:09.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:49:39.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:49:39.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:49:39.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:49:39.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:49:39.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:49:39.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:49:39.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-05-30T07:49:39.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:49:39.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-05-30T07:49:39.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:49:39.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:49:39.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:49:39.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-05-30T07:49:42.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-05-30T07:49:42.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:49:42.264 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:49:42.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:49:42.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:49:42.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:49:42.289 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:49:42.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:49:42.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:49:42.290 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:49:42.290 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:49:42.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:49:42.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:49:42.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:49:42.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:49:42.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:49:42.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T07:49:42.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:49:42.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T07:49:42.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:49:42.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:49:42.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:49:42.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:49:42.743 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:49:25
2026-05-30T07:49:42.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74139, datetime.datetime(2026, 5, 30, 7, 49, 25), datetime.datetime(2026, 5, 30, 7, 49, 25), 'salt', 11.38, 50.16, None, 13.23, 324.06, 10.0, 832.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:49:42.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:49:42.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:49:42.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:49:25, diff=17.751173s, valid=True
2026-05-30T07:49:42.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:49:42.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T07:49:42.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:49:12, diff=30.754727s, valid=True
2026-05-30T07:49:42.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:49:42.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:49:42.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:49:19, diff=23.763182s, valid=True
2026-05-30T07:49:42.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:49:42.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:49:42.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:49:42.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:49:42.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:49:42.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T07:49:42.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:49:12, diff=30.767029s, valid=True
2026-05-30T07:49:42.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:49:42.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:49:42.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:49:42.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052824.767871s, valid=True
2026-05-30T07:49:42.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:49:42.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:49:42.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:49:42.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:49:42.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:49:42.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:49:42.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:49:42.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:49:42.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:49:42.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:49:42.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:49:43.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:49:43.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:49:43.100 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:49:43.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:49:43.634 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:49:43.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:49:43.733 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:49:43.733 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:49:43.988 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:49:43.989 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:50:14.019 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:50:14.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:50:14.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:50:14.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:50:14.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:50:14.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:50:14.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-05-30T07:50:14.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:50:14.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-05-30T07:50:14.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:50:14.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:50:14.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:50:14.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-05-30T07:50:16.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T07:50:16.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:50:16.998 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:50:16.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:50:17.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:50:17.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:50:17.022 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:50:17.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:50:17.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:50:17.023 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:50:17.023 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:50:17.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:50:17.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:50:17.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:50:17.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:50:17.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:50:17.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:50:17.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:50:17.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:50:17.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:50:17.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:50:17.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:50:17.360 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:50:17.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:49:55
2026-05-30T07:50:17.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74140, datetime.datetime(2026, 5, 30, 7, 49, 55), datetime.datetime(2026, 5, 30, 7, 49, 54), 'salt', 11.48, 50.3, None, 12.63, 323.99, 9.97, 832.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:50:17.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:50:17.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:50:17.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:49:54, diff=23.428003s, valid=True
2026-05-30T07:50:17.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:50:17.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:50:17.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:50:12, diff=5.431543s, valid=True
2026-05-30T07:50:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:50:17.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:50:17.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:49:49, diff=28.44005s, valid=True
2026-05-30T07:50:17.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:50:17.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:50:17.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:50:17.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:50:17.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:50:17.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:50:17.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:50:12, diff=5.44382s, valid=True
2026-05-30T07:50:17.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:50:17.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:50:17.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:50:17.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052859.444647s, valid=True
2026-05-30T07:50:17.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:50:17.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:50:17.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:50:17.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:50:17.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:50:17.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:50:17.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:50:17.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:50:17.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:50:17.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:50:17.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:50:17.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:50:17.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:50:17.844 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:50:18.050 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:50:18.391 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:50:18.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:50:18.491 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:50:18.491 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:50:18.644 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:50:18.644 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:50:48.671 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:50:48.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:50:48.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:50:48.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:50:48.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:50:49.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:50:49.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-05-30T07:50:49.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:50:49.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-05-30T07:50:49.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:50:49.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:50:49.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:50:49.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T07:50:51.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-05-30T07:50:52.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:50:52.661 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:50:52.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:50:52.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:50:52.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:50:52.782 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:50:52.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:50:52.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:50:52.784 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:50:52.784 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:50:52.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:50:52.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:50:52.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:50:53.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:50:53.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:50:53.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T07:50:53.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:50:53.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T07:50:53.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:50:53.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:50:53.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:50:53.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:50:53.175 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:50:26
2026-05-30T07:50:53.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74141, datetime.datetime(2026, 5, 30, 7, 50, 26), datetime.datetime(2026, 5, 30, 7, 50, 25), 'salt', 11.38, 50.46, None, 14.26, 330.45, 9.92, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:50:53.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:50:53.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:50:53.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:50:25, diff=28.182265s, valid=True
2026-05-30T07:50:53.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:50:53.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T07:50:53.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:50:12, diff=41.185576s, valid=True
2026-05-30T07:50:53.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:50:53.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:50:53.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:50:20, diff=33.193468s, valid=True
2026-05-30T07:50:53.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:50:53.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:50:53.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:50:53.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:50:53.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:50:53.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T07:50:53.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:50:12, diff=41.197018s, valid=True
2026-05-30T07:50:53.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:50:53.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:50:53.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:50:53.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052895.197799s, valid=True
2026-05-30T07:50:53.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:50:53.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:50:53.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:50:53.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:50:53.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:50:53.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:50:53.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:50:53.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:50:53.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:50:53.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:50:54.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:50:55.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:50:55.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:50:55.119 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:50:55.326 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:50:55.668 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:50:55.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:50:55.770 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:50:55.770 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:50:57.055 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:50:57.055 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:51:27.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:51:27.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:51:27.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:51:27.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:51:27.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:51:27.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:51:27.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-05-30T07:51:27.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:51:27.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-05-30T07:51:27.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:51:27.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:51:27.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:51:27.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-05-30T07:51:30.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-05-30T07:51:30.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:51:30.400 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:51:30.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:51:30.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:51:30.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:51:30.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:51:30.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:51:30.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:51:30.423 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:51:30.423 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:51:30.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:51:30.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:51:30.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:51:30.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:51:30.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:51:30.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:51:30.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:51:30.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:51:30.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:51:30.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:51:30.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:51:30.761 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:51:30.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:51:26
2026-05-30T07:51:30.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74143, datetime.datetime(2026, 5, 30, 7, 51, 26), datetime.datetime(2026, 5, 30, 7, 51, 26), 'salt', 11.41, 50.99, None, 14.22, 327.7, 9.77, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:51:30.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:51:30.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:51:30.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:51:26, diff=4.838146s, valid=True
2026-05-30T07:51:30.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:51:30.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:51:30.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:51:12, diff=18.841692s, valid=True
2026-05-30T07:51:30.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:51:30.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:51:30.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:51:23, diff=7.850068s, valid=True
2026-05-30T07:51:30.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:51:30.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:51:30.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:51:30.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:51:30.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:51:30.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:51:30.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:51:12, diff=18.853917s, valid=True
2026-05-30T07:51:30.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:51:30.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:51:30.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:51:30.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052932.854747s, valid=True
2026-05-30T07:51:30.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:51:30.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:51:30.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:51:30.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:51:30.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:51:30.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:51:30.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:51:30.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:51:30.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:51:30.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:51:31.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:51:31.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:51:31.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:51:31.249 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:51:31.456 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:51:31.805 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:51:31.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:51:31.907 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:51:31.907 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:51:32.084 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:51:32.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:52:02.111 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:52:02.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:52:02.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:52:02.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:52:02.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:52:02.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:52:02.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T07:52:02.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:52:02.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-05-30T07:52:02.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:52:02.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:52:02.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:52:02.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-05-30T07:52:04.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-05-30T07:52:04.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:52:04.999 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:52:04.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:52:05.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:52:05.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:52:05.023 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:52:05.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:52:05.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:52:05.025 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:52:05.025 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:52:05.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:52:05.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:52:05.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:52:05.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:52:05.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:52:05.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:52:05.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:52:05.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:52:05.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:52:05.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:52:05.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:52:05.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:52:05.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:51:56
2026-05-30T07:52:05.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74144, datetime.datetime(2026, 5, 30, 7, 51, 56), datetime.datetime(2026, 5, 30, 7, 51, 55), 'salt', 11.44, 51.03, None, 14.72, 327.0, 9.76, 832.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:52:05.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:52:05.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:52:05.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:51:55, diff=10.397537s, valid=True
2026-05-30T07:52:05.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:52:05.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:52:05.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:52:12, diff=-6.599596s, valid=True
2026-05-30T07:52:05.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:52:05.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:52:05.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:51:55, diff=10.407279s, valid=True
2026-05-30T07:52:05.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:52:05.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:52:05.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:52:05.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:52:05.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:52:05.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:52:05.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:52:12, diff=-6.589613s, valid=True
2026-05-30T07:52:05.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:52:05.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:52:05.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:52:05.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1052967.411053s, valid=True
2026-05-30T07:52:05.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:52:05.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:52:05.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:52:05.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:52:05.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:52:05.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:52:05.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:52:05.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:52:05.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:52:05.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:52:05.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:52:05.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:52:05.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:52:05.758 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:52:05.969 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:52:06.309 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:52:06.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:52:06.410 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:52:06.410 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:52:06.591 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:52:06.591 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:52:36.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:52:36.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:52:36.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:52:36.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:52:36.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:52:37.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:52:37.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-05-30T07:52:37.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:52:37.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-05-30T07:52:37.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:52:37.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:52:37.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:52:37.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T07:52:39.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-05-30T07:52:39.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:52:39.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:52:39.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:52:39.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:52:39.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:52:39.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:52:39.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:52:39.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:52:39.724 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:52:39.724 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:52:39.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:52:39.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:52:39.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:52:39.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:52:39.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:52:39.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:52:39.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:52:40.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:52:40.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:52:40.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:52:40.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:52:40.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:52:40.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:52:27
2026-05-30T07:52:40.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74145, datetime.datetime(2026, 5, 30, 7, 52, 27), datetime.datetime(2026, 5, 30, 7, 52, 26), 'salt', 11.28, 51.06, None, 15.24, 322.78, 9.74, 832.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:52:40.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:52:40.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:52:40.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:52:26, diff=14.10926s, valid=True
2026-05-30T07:52:40.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:52:40.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:52:40.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:52:12, diff=28.112236s, valid=True
2026-05-30T07:52:40.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:52:40.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:52:40.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:52:26, diff=14.119488s, valid=True
2026-05-30T07:52:40.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:52:40.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:52:40.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:52:40.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:52:40.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:52:40.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:52:40.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:52:12, diff=28.122992s, valid=True
2026-05-30T07:52:40.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:52:40.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:52:40.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:52:40.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053002.123731s, valid=True
2026-05-30T07:52:40.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:52:40.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:52:40.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:52:40.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:52:40.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:52:40.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:52:40.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:52:40.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:52:40.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:52:40.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:52:40.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:52:40.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:52:40.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:52:40.509 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:52:40.717 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:52:41.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:52:41.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:52:41.160 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:52:41.160 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:52:41.338 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:52:41.339 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:53:11.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:53:11.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:53:11.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:53:11.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:53:11.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:53:12.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:53:12.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-05-30T07:53:12.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:53:12.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-05-30T07:53:12.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:53:12.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:53:12.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:53:12.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-05-30T07:53:14.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-05-30T07:53:14.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:53:14.791 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:53:14.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:53:14.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:53:14.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:53:14.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:53:14.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:53:14.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:53:14.817 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:53:14.817 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:53:14.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:53:14.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:53:14.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:53:15.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:53:15.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:53:15.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:53:15.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:53:15.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:53:15.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:53:15.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:53:15.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:53:15.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:53:15.200 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:52:57
2026-05-30T07:53:15.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74146, datetime.datetime(2026, 5, 30, 7, 52, 57), datetime.datetime(2026, 5, 30, 7, 52, 56), 'salt', 11.41, 51.13, None, 14.68, 330.15, 9.73, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:53:15.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:53:15.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:53:15.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:52:56, diff=19.208686s, valid=True
2026-05-30T07:53:15.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:53:15.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:53:15.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:53:12, diff=3.212312s, valid=True
2026-05-30T07:53:15.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:53:15.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:53:15.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:52:50, diff=25.220774s, valid=True
2026-05-30T07:53:15.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:53:15.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:53:15.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:53:15.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:53:15.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:53:15.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:53:15.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:53:12, diff=3.224574s, valid=True
2026-05-30T07:53:15.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:53:15.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:53:15.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:53:15.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053037.225408s, valid=True
2026-05-30T07:53:15.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:53:15.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:53:15.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:53:15.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:53:15.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:53:15.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:53:15.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:53:15.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:53:15.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:53:15.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:53:15.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:53:15.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:53:15.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:53:15.547 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:53:15.774 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:53:16.113 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:53:16.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:53: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-05-30T07:53: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-05-30T07:53:16.399 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:53:16.399 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:53:46.429 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:53:46.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:53:46.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:53:46.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:53:46.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:53:47.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:53:47.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-05-30T07:53:47.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:53:47.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-05-30T07:53:47.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:53:47.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:53:47.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:53:47.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T07:53:49.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-05-30T07:53:49.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:53:49.563 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:53:49.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:53:49.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:53:49.585 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:53:49.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:53:49.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:53:49.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:53:49.587 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:53:49.587 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:53:49.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:53:49.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:53:49.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:53:49.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:53:49.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:53:49.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T07:53:49.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:53:49.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T07:53:49.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:53:49.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:53:49.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:53:49.906 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:53:49.966 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:53:27
2026-05-30T07:53:49.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74147, datetime.datetime(2026, 5, 30, 7, 53, 27), datetime.datetime(2026, 5, 30, 7, 53, 26), 'salt', 11.48, 50.89, None, 14.64, 333.67, 9.81, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:53:49.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:53:49.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:53:49.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:53:26, diff=23.972928s, valid=True
2026-05-30T07:53:49.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:53:49.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T07:53:49.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:53:12, diff=37.975912s, valid=True
2026-05-30T07:53:49.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:53:49.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:53:49.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:53:21, diff=28.983063s, valid=True
2026-05-30T07:53:49.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:53:49.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:53:49.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:53:49.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:53:49.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:53:49.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T07:53:49.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:53:12, diff=37.986258s, valid=True
2026-05-30T07:53:49.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:53:49.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:53:49.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:53:49.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053071.986962s, valid=True
2026-05-30T07:53:49.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:53:49.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:53:49.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:53:49.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:53:49.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:53:50.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:53:50.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:53:50.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:53:50.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:53:50.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:53:50.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:53:50.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:53:50.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:53:50.476 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:53:50.681 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:53:51.026 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:53:51.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:53:51.127 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:53:51.128 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:53:51.291 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:53:51.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:54:21.321 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:54:21.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:54:21.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:54:21.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:54:21.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:54:21.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:54:21.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-05-30T07:54:21.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:54:21.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-05-30T07:54:21.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:54:21.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:54:21.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:54:21.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-05-30T07:54:24.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-05-30T07:54:24.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:54:24.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:54:24.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:54:24.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:54:24.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:54:24.347 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:54:24.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:54:24.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:54:24.348 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:54:24.348 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:54:24.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:54:24.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:54:24.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:54:24.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:54:24.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:54:24.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:54:24.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:54:24.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:54:24.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:54:24.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:54:24.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:54:24.663 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:54:24.725 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:53:57
2026-05-30T07:54:24.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74148, datetime.datetime(2026, 5, 30, 7, 53, 57), datetime.datetime(2026, 5, 30, 7, 53, 57), 'salt', 11.51, 50.83, None, 13.3, 326.27, 9.82, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:54:24.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:54:24.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:54:24.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:53:57, diff=27.732878s, valid=True
2026-05-30T07:54:24.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:54:24.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:54:24.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:54:12, diff=12.736264s, valid=True
2026-05-30T07:54:24.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:54:24.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:54:24.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:53:51, diff=33.744216s, valid=True
2026-05-30T07:54:24.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:54:24.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:54:24.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:54:24.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:54:24.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:54:24.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:54:24.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:54:12, diff=12.747836s, valid=True
2026-05-30T07:54:24.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:54:24.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:54:24.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:54:24.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053106.74861s, valid=True
2026-05-30T07:54:24.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:54:24.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:54:24.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:54:24.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:54:24.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:54:24.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:54:24.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:54:24.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:54:24.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:54:24.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:54:24.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:54:24.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:54:25.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:54:25.071 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:54:25.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:54:25.614 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:54:25.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:54:25.776 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:54:25.776 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:54:25.969 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:54:25.969 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:54:56.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:54:56.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:54:56.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:54:56.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:54:56.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:54:56.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:54:56.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-05-30T07:54:56.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:54:56.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-05-30T07:54:56.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:54:56.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:54:56.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:54:56.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T07:54:58.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-05-30T07:54:58.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:54:58.990 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:54:58.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:54:59.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:54:59.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:54:59.027 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:54:59.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:54:59.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:54:59.028 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:54:59.029 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:54:59.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:54:59.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:54:59.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:54:59.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:54:59.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:54:59.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:54:59.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:54:59.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:54:59.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:54:59.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:54:59.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:54:59.342 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:54:59.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:54:58
2026-05-30T07:54:59.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74150, datetime.datetime(2026, 5, 30, 7, 54, 58), datetime.datetime(2026, 5, 30, 7, 54, 57), 'salt', 11.51, 50.43, None, 14.68, 332.82, 9.93, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:54:59.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:54:59.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:54:59.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:54:57, diff=2.409613s, valid=True
2026-05-30T07:54:59.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:54:59.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:54:59.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:55:12, diff=-12.58747s, valid=True
2026-05-30T07:54:59.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:54:59.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:54:59.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:54:53, diff=6.419344s, valid=True
2026-05-30T07:54:59.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:54:59.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:54:59.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:54:59.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:54:59.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:54:59.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:54:59.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:55:12, diff=-12.577487s, valid=True
2026-05-30T07:54:59.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:54:59.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:54:59.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:54:59.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053141.423304s, valid=True
2026-05-30T07:54:59.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:54:59.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:54:59.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:54:59.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:54:59.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:54:59.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:54:59.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:54:59.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:54:59.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:54:59.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:54:59.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:54:59.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:54:59.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:54:59.839 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:55:00.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:55:00.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:55:00.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:55:00.516 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:55:00.516 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:55:03.046 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:55:03.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:55:33.077 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:55:33.077 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:55:33.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:55:33.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:55:33.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:55:33.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:55:33.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-05-30T07:55:33.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:55:33.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T07:55:33.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:55:33.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:55:33.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:55:33.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-05-30T07:55:36.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-05-30T07:55:36.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:55:36.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:55:36.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:55:36.126 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:55:36.139 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:55:36.139 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:55:36.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:55:36.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:55:36.141 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:55:36.141 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:55:36.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:55:36.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:55:36.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:55:36.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:55:36.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:55:36.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:55:36.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:55:36.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:55:36.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:55:36.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:55:36.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:55:36.465 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:55:36.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:55:28
2026-05-30T07:55:36.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74151, datetime.datetime(2026, 5, 30, 7, 55, 28), datetime.datetime(2026, 5, 30, 7, 55, 27), 'salt', 11.71, 50.4, None, 14.19, 328.43, 9.96, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:55:36.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:55:36.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:55:36.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:55:27, diff=9.536714s, valid=True
2026-05-30T07:55:36.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:55:36.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:55:36.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:55:12, diff=24.540235s, valid=True
2026-05-30T07:55:36.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:55:36.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:55:36.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:55:25, diff=11.548473s, valid=True
2026-05-30T07:55:36.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:55:36.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:55:36.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:55:36.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:55:36.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:55:36.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:55:36.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:55:12, diff=24.552272s, valid=True
2026-05-30T07:55:36.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:55:36.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:55:36.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:55:36.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053178.553102s, valid=True
2026-05-30T07:55:36.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:55:36.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:55:36.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:55:36.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:55:36.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:55:36.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:55:36.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:55:36.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:55:36.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:55:36.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:55:36.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:55:36.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:55:36.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:55:36.879 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:55:37.083 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:55:37.493 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:55:37.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:55:37.593 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:55:37.593 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:55:37.775 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:55:37.776 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:56:07.805 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:56:07.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:56:07.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:56:08.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:56:08.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:56:08.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:56:08.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-05-30T07:56:08.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:56:08.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-05-30T07:56:08.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:56:08.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:56:08.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:56:08.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-05-30T07:56:11.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-05-30T07:56:11.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:56:11.581 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:56:11.582 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:56:11.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:56:11.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:56:11.606 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:56:11.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:56:11.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:56:11.607 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:56:11.608 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:56:11.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:56:11.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:56:11.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:56:11.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:56:11.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:56:11.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:56:11.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:56:11.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:56:11.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:56:11.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:56:11.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:56:11.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:56:11.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:55:58
2026-05-30T07:56:11.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74152, datetime.datetime(2026, 5, 30, 7, 55, 58), datetime.datetime(2026, 5, 30, 7, 55, 58), 'salt', 11.61, 50.16, None, 14.36, 323.27, 10.02, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:56:11.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:56:11.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:56:12.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:55:58, diff=14.003535s, valid=True
2026-05-30T07:56:12.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:56:12.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:56:12.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:56:12, diff=0.00711s, valid=True
2026-05-30T07:56:12.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:56:12.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:56:12.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:55:56, diff=16.015682s, valid=True
2026-05-30T07:56:12.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:56:12.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:56:12.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:56:12.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:56:12.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:56:12.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:56:12.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:56:12, diff=0.01944s, valid=True
2026-05-30T07:56:12.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:56:12.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:56:12.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:56:12.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053214.02027s, valid=True
2026-05-30T07:56:12.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:56:12.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:56:12.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:56:12.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:56:12.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:56:12.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:56:12.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:56:12.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:56:12.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:56:12.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:56:12.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:56:12.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:56:12.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:56:12.344 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:56:12.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:56:12.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:56:12.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:56:12.990 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:56:12.990 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:56:13.167 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:56:13.167 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:56:43.197 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:56:43.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:56:43.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:56:43.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:56:43.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:56:43.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:56:43.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-05-30T07:56:43.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:56:43.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-05-30T07:56:43.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:56:43.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:56:43.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:56:43.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-05-30T07:56:46.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-05-30T07:56:46.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:56:46.643 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:56:46.643 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:56:46.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:56:46.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:56:46.665 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:56:46.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:56:46.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:56:46.666 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:56:46.666 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:56:46.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:56:46.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:56:46.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:56:46.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:56:46.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:56:46.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T07:56:46.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:56:46.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T07:56:46.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:56:46.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:56:46.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:56:46.998 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:56:47.064 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:56:30
2026-05-30T07:56:47.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74153, datetime.datetime(2026, 5, 30, 7, 56, 30), datetime.datetime(2026, 5, 30, 7, 56, 29), 'salt', 11.78, 49.93, None, 15.07, 326.65, 10.1, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:56:47.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:56:47.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:56:47.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:56:29, diff=18.071668s, valid=True
2026-05-30T07:56:47.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:56:47.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T07:56:47.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:56:12, diff=35.075131s, valid=True
2026-05-30T07:56:47.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:56:47.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:56:47.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:56:28, diff=19.083322s, valid=True
2026-05-30T07:56:47.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:56:47.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:56:47.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:56:47.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:56:47.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:56:47.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T07:56:47.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:56:12, diff=35.087003s, valid=True
2026-05-30T07:56:47.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:56:47.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:56:47.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:56:47.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053249.087808s, valid=True
2026-05-30T07:56:47.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:56:47.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:56:47.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:56:47.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:56:47.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:56:47.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:56:47.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:56:47.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:56:47.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:56:47.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:56:47.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:56:47.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:56:47.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:56:47.412 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:56:47.689 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:56:48.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:56:48.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:56:48.132 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:56:48.132 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:56:48.394 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:56:48.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:57:18.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:57:18.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:57:18.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:57:18.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:57:18.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:57:18.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:57:18.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-05-30T07:57:18.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:57:18.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-05-30T07:57:18.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:57:18.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:57:18.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:57:18.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-05-30T07:57:21.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-05-30T07:57:21.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:57:21.408 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:57:21.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:57:21.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:57:21.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:57:21.432 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:57:21.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:57:21.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:57:21.433 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:57:21.433 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:57:21.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:57:21.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:57:21.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:57:21.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:57:21.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:57:21.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:57:21.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:57:21.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:57:21.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:57:21.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:57:21.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:57:21.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:57:21.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:57:00
2026-05-30T07:57:21.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74154, datetime.datetime(2026, 5, 30, 7, 57), datetime.datetime(2026, 5, 30, 7, 56, 59), 'salt', 11.88, 50.0, None, 12.77, 318.5, 10.09, 832.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:57:21.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:57:21.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:57:21.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:56:59, diff=22.838446s, valid=True
2026-05-30T07:57:21.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:57:21.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:57:21.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:57:12, diff=9.841999s, valid=True
2026-05-30T07:57:21.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:57:21.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:57:21.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:56:59, diff=22.85041s, valid=True
2026-05-30T07:57:21.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:57:21.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:57:21.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:57:21.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:57:21.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:57:21.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:57:21.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:57:12, diff=9.854243s, valid=True
2026-05-30T07:57:21.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:57:21.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:57:21.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:57:21.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053283.855086s, valid=True
2026-05-30T07:57:21.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:57:21.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:57:21.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:57:21.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:57:21.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:57:21.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:57:21.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:57:21.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:57:21.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:57:21.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:57:22.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:57:22.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:57:22.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:57:22.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:57:22.382 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:57:22.718 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:57:22.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:57:22.819 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:57:22.819 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:57:22.999 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:57:22.999 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:57:53.030 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:57:53.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:57:53.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:57:53.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:57:53.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:57:53.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:57:53.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-05-30T07:57:53.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:57:53.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-05-30T07:57:53.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:57:53.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:57:53.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:57:53.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-05-30T07:57:55.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-05-30T07:57:55.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:57:55.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:57:55.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:57:55.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:57:55.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:57:55.933 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:57:55.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:57:55.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:57:55.934 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:57:55.934 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:57:55.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:57:56.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T07:57:56.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:57:56.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T07:57:56.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:57:56.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T07:57:56.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:57:56.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T07:57:56.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:57:56.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:57:56.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:57:56.248 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:57:56.311 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:57:30
2026-05-30T07:57:56.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74155, datetime.datetime(2026, 5, 30, 7, 57, 30), datetime.datetime(2026, 5, 30, 7, 57, 29), 'salt', 11.98, 49.43, None, 12.88, 323.45, 10.25, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:57:56.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:57:56.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T07:57:56.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:57:29, diff=27.319087s, valid=True
2026-05-30T07:57:56.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:57:56.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T07:57:56.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:57:12, diff=44.322599s, valid=True
2026-05-30T07:57:56.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:57:56.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T07:57:56.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:57:22, diff=34.33099s, valid=True
2026-05-30T07:57:56.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:57:56.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:57:56.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:57:56.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:57:56.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:57:56.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T07:57:56.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:57:12, diff=44.334765s, valid=True
2026-05-30T07:57:56.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:57:56.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:57:56.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:57:56.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053318.335584s, valid=True
2026-05-30T07:57:56.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:57:56.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:57:56.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:57:56.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:57:56.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:57:56.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:57:56.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:57:56.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:57:56.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:57:56.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:57:56.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:57:56.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:57:56.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:57:56.725 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:57:56.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:57:57.267 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:57:57.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:57:57.367 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:57:57.367 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:57:57.524 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:57:57.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:58:27.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:58:27.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:58:27.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:58:28.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:58:28.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:58:28.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:58:28.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T07:58:28.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:58:28.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-05-30T07:58:28.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:58:28.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:58:28.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:58:28.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-05-30T07:58:30.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-05-30T07:58:30.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:58:30.668 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:58:30.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:58:30.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:58:30.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:58:30.691 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:58:30.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:58:30.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:58:30.692 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:58:30.693 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:58:30.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:58:30.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:58:30.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:58:30.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:58:30.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:58:30.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:58:30.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:58:31.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:58:31.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:58:31.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:58:31.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:58:31.019 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:58:31.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:58:31
2026-05-30T07:58:31.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74157, datetime.datetime(2026, 5, 30, 7, 58, 31), datetime.datetime(2026, 5, 30, 7, 58, 29), 'salt', 12.07, 49.3, None, 15.03, 315.05, 10.29, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:58:31.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:58:31.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:58:31.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:58:29, diff=2.088208s, valid=True
2026-05-30T07:58:31.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:58:31.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:58:31.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:58:12, diff=19.09144s, valid=True
2026-05-30T07:58:31.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:58:31.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:58:31.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:58:23, diff=8.099006s, valid=True
2026-05-30T07:58:31.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:58:31.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:58:31.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:58:31.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:58:31.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:58:31.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:58:31.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:58:12, diff=19.102607s, valid=True
2026-05-30T07:58:31.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:58:31.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:58:31.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:58:31.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053353.103357s, valid=True
2026-05-30T07:58:31.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:58:31.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:58:31.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:58:31.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:58:31.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:58:31.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:58:31.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:58:31.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:58:31.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:58:31.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:58:31.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:58:31.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:58:31.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:58:31.425 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:58:31.649 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:58:31.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:58:32.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:58:32.091 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:58:32.091 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:58:32.448 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:58:32.449 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:59:02.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:59:02.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:59:02.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:59:02.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:59:02.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:59:02.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:59: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-05-30T07:59:03.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:59:03.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-05-30T07:59:03.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:59:03.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:59:03.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:59:03.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-05-30T07:59:05.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-05-30T07:59:05.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:59:05.287 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:59:05.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:59:05.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:59:05.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:59:05.308 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:59:05.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:59:05.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:59:05.308 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:59:05.308 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:59:05.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:59:05.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:59:05.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:59:05.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:59:05.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:59:05.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:59:05.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:59:05.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:59:05.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:59:05.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:59:05.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:59:05.583 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:59:05.646 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:59:01
2026-05-30T07:59:05.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74158, datetime.datetime(2026, 5, 30, 7, 59, 1), datetime.datetime(2026, 5, 30, 7, 59), 'salt', 12.14, 49.63, None, 14.93, 327.65, 10.2, 832.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:59:05.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:59:05.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:59:05.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:59:00, diff=5.653745s, valid=True
2026-05-30T07:59:05.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:59:05.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:59:05.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:59:12, diff=-6.343s, valid=True
2026-05-30T07:59:05.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:59:05.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:59:05.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:58:54, diff=11.664985s, valid=True
2026-05-30T07:59:05.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:59:05.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:59:05.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:59:05.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:59:05.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:59:05.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:59:05.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:59:12, diff=-6.33146s, valid=True
2026-05-30T07:59:05.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:59:05.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:59:05.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:59:05.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053387.669275s, valid=True
2026-05-30T07:59:05.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:59:05.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:59:05.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:59:05.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:59:05.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:59:05.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:59:05.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:59:05.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:59:05.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:59:05.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:59:05.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:59:05.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:59:06.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:59:06.067 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:59:06.276 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:59:06.618 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:59:06.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:59:06.721 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:59:06.721 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:59:06.896 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:59:06.896 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T07:59:36.927 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T07:59:36.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T07:59:36.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T07:59:37.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T07:59:37.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T07:59:37.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T07:59:37.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-05-30T07:59:37.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T07:59:37.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-05-30T07:59:37.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T07:59:37.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T07:59:37.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T07:59:37.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-05-30T07:59:40.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-05-30T07:59:40.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T07:59:40.251 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-30T07:59:40.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T07:59:40.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-30T07:59:40.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-30T07:59:40.279 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T07:59:40.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T07:59:40.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T07:59:40.280 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T07:59:40.280 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T07:59:40.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T07:59:40.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T07:59:40.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T07:59:40.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T07:59:40.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:59:40.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:59:40.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T07:59:40.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T07:59:40.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T07:59:40.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T07:59:40.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T07:59:40.604 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T07:59:40.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 07:59:32
2026-05-30T07:59:40.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74159, datetime.datetime(2026, 5, 30, 7, 59, 32), datetime.datetime(2026, 5, 30, 7, 59, 30), 'salt', 12.17, 49.37, None, 14.05, 321.48, 10.28, 832.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T07:59:40.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T07:59:40.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T07:59:40.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:59:30, diff=10.673157s, valid=True
2026-05-30T07:59:40.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T07:59:40.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:59:40.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:59:12, diff=28.676668s, valid=True
2026-05-30T07:59:40.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T07:59:40.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T07:59:40.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:59:26, diff=14.684933s, valid=True
2026-05-30T07:59:40.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T07:59:40.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:59:40.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T07:59:40.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T07:59:40.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T07:59:40.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T07:59:40.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:59:12, diff=28.688696s, valid=True
2026-05-30T07:59:40.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T07:59:40.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T07:59:40.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T07:59:40.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053422.689512s, valid=True
2026-05-30T07:59:40.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T07:59:40.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T07:59:40.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T07:59:40.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T07:59:40.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T07:59:40.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T07:59:40.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T07:59:40.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T07:59:40.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T07:59:40.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T07:59:40.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T07:59:40.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T07:59:40.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T07:59:41.014 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T07:59:41.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:59:41.560 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T07:59:41.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T07:59:41.663 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T07:59:41.663 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T07:59:41.819 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T07:59:41.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:00:11.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:00:11.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:00:11.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:00:12.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:00:12.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:00:12.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:00:12.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-05-30T08:00:12.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:00:12.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-05-30T08:00:12.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:00:12.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:00:12.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:00:12.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-05-30T08:00:14.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-05-30T08:00:14.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:00:14.676 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:00:14.676 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:00:14.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:00:14.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:00:14.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:00:14.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:00:14.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:00:14.701 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:00:14.702 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:00:14.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:00:14.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:00:14.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:00:14.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:00:14.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:00:14.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:00:14.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:00:15.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:00:15.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:00:15.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:00:15.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:00:15.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:00:15.090 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:00:03
2026-05-30T08:00:15.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74160, datetime.datetime(2026, 5, 30, 8, 0, 3), datetime.datetime(2026, 5, 30, 8, 0, 2), 'salt', 12.21, 49.3, None, 15.39, 320.17, 10.31, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:00:15.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:00:15.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:00:15.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:00:02, diff=13.097651s, valid=True
2026-05-30T08:00:15.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:00:15.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:00:15.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:59:12, diff=63.10118s, valid=True
2026-05-30T08:00:15.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:00:15.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:00:15.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:59:57, diff=18.109415s, valid=True
2026-05-30T08:00:15.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:00:15.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:00:15.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:00:15.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:00:15.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:00:15.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:00:15.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:59:12, diff=63.113154s, valid=True
2026-05-30T08:00:15.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:00:15.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:00:15.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:00:15.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053457.113975s, valid=True
2026-05-30T08:00:15.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:00:15.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:00:15.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:00:15.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:00:15.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:00:15.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:00:15.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:00:15.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:00:15.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:00:15.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:00:15.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:00:15.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:00:15.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:00:15.502 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:00:15.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:00:16.045 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:00:16.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:00:16.144 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:00:16.145 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:00:16.314 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:00:16.315 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:00:46.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:00:46.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:00:46.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:00:46.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:00:46.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:00:46.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:00:46.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-05-30T08:00:46.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:00:46.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-05-30T08:00:46.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:00:46.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:00:46.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:00:46.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-05-30T08:00:49.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-05-30T08:00:49.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:00:49.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:00:49.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:00:49.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:00:49.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:00:49.460 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:00:49.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:00:49.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:00:49.461 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:00:49.461 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:00:49.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:00:49.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:00:49.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:00:49.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:00:49.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:00:49.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:00:49.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:00:49.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:00:49.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:00:49.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:00:49.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:00:49.796 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:00:49.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:00:33
2026-05-30T08:00:49.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74161, datetime.datetime(2026, 5, 30, 8, 0, 33), datetime.datetime(2026, 5, 30, 8, 0, 32), 'salt', 12.14, 49.4, None, 16.09, 327.37, 10.27, 832.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:00:49.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:00:49.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:00:49.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:00:32, diff=17.86981s, valid=True
2026-05-30T08:00:49.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:00:49.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:00:49.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:59:12, diff=97.872864s, valid=True
2026-05-30T08:00:49.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:00:49.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:00:49.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:00:28, diff=21.879714s, valid=True
2026-05-30T08:00:49.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:00:49.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:00:49.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:00:49.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:00:49.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:00:49.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:00:49.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:59:12, diff=97.88298s, valid=True
2026-05-30T08:00:49.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:00:49.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:00:49.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:00:49.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053491.883686s, valid=True
2026-05-30T08:00:49.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:00:49.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:00:49.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:00:49.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:00:49.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:00:49.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:00:49.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:00:49.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:00:49.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:00:50.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:00:50.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:00:50.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:00:50.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:00:50.310 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:00:50.515 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:00:50.873 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:00:50.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:00:50.975 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:00:50.975 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:00:51.170 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:00:51.170 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:01:21.199 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:01:21.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:01:21.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:01:21.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:01:21.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:01:21.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:01:21.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-05-30T08:01:21.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:01:21.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-05-30T08:01:21.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:01:21.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:01:21.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:01:21.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-05-30T08:01:24.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-05-30T08:01:24.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:01:24.502 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:01:24.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:01:24.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:01:24.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:01:24.527 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:01:24.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:01:24.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:01:24.529 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:01:24.529 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:01:24.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:01:24.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:01:24.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:01:24.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:01:24.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:01:24.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:01:24.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:01:24.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:01:24.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:01:24.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:01:24.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:01:24.861 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:01:24.925 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:01:03
2026-05-30T08:01:24.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74162, datetime.datetime(2026, 5, 30, 8, 1, 3), datetime.datetime(2026, 5, 30, 8, 1, 2), 'salt', 12.21, 49.63, None, 16.44, 323.03, 10.21, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:01:24.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:01:24.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:01:24.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:01:02, diff=22.932663s, valid=True
2026-05-30T08:01:24.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:01:24.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:01:24.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:59:12, diff=132.936146s, valid=True
2026-05-30T08:01:24.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:01:24.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:01:24.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:01:00, diff=24.94427s, valid=True
2026-05-30T08:01:24.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:01:24.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:01:24.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:01:24.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:01:24.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:01:24.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:01:24.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 07:59:12, diff=132.947985s, valid=True
2026-05-30T08:01:24.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:01:24.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:01:24.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:01:24.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053526.948795s, valid=True
2026-05-30T08:01:24.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:01:24.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:01:24.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:01:24.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:01:24.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:01:25.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:01:25.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:01:25.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:01:25.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:01:25.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:01:25.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:01:25.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:01:25.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:01:25.274 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:01:25.482 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:01:25.826 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:01:25.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:01:25.926 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:01:25.926 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:01:26.186 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:01:26.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:01:56.202 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:01:56.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:01:56.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:01:56.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:01:56.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:01:56.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:01:56.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-05-30T08:01:56.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:01:56.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-05-30T08:01:56.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:01:56.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:01:56.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:01:56.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-05-30T08:01:59.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-05-30T08:01:59.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:01:59.203 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:01:59.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:01:59.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:01:59.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:01:59.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:01:59.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:01:59.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:01:59.228 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:01:59.228 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:01:59.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:01:59.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:01:59.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:01:59.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:01:59.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:01:59.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:01:59.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:01:59.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:01:59.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:01:59.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:01:59.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:01:59.552 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:01:59.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:01:33
2026-05-30T08:01:59.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74163, datetime.datetime(2026, 5, 30, 8, 1, 33), datetime.datetime(2026, 5, 30, 8, 1, 32), 'salt', 12.17, 49.77, None, 15.42, 322.7, 10.17, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:01:59.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:01:59.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:01:59.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:01:32, diff=27.622898s, valid=True
2026-05-30T08:01:59.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:01:59.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:01:59.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:02:12, diff=-12.373669s, valid=True
2026-05-30T08:01:59.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:01:59.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:01:59.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:01:31, diff=28.634404s, valid=True
2026-05-30T08:01:59.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:01:59.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:01:59.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:01:59.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:01:59.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:01:59.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:01:59.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:02:12, diff=-12.36193s, valid=True
2026-05-30T08:01:59.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:01:59.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:01:59.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:01:59.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053561.638876s, valid=True
2026-05-30T08:01:59.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:01:59.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:01:59.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:01:59.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:01:59.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:01:59.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:01:59.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:01:59.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:01:59.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:01:59.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:01:59.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:01:59.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:01:59.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:01:59.976 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:02:00.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:02:00.607 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:02:00.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:02:00.707 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:02:00.707 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:02:00.954 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:02:00.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:02:30.984 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:02:30.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:02:30.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:02:31.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:02:31.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:02:31.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:02:31.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-05-30T08:02:31.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:02:31.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-05-30T08:02:31.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:02:31.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:02:31.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:02:31.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-05-30T08:02:33.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-05-30T08:02:33.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:02:33.935 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:02:33.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:02:33.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:02:33.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:02:33.958 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:02:33.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:02:33.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:02:33.960 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:02:33.960 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:02:33.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:02:34.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:02:34.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:02:34.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:02:34.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:02:34.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:02:34.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:02:34.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:02:34.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:02:34.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:02:34.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:02:34.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:02:34.352 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:02:34
2026-05-30T08:02:34.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74165, datetime.datetime(2026, 5, 30, 8, 2, 34), datetime.datetime(2026, 5, 30, 8, 2, 33), 'salt', 12.04, 50.13, None, 16.06, 325.03, 10.06, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:02:34.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:02:34.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:02:34.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:02:33, diff=1.360546s, valid=True
2026-05-30T08:02:34.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:02:34.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:02:34.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:03:12, diff=-37.635887s, valid=True
2026-05-30T08:02:34.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:02:34.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:02:34.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:02:25, diff=9.372595s, valid=True
2026-05-30T08:02:34.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:02:34.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:02:34.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:02:34.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:02:34.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:02:34.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:02:34.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:03:12, diff=-37.623527s, valid=True
2026-05-30T08:02:34.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:02:34.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:02:34.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:02:34.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053596.377318s, valid=True
2026-05-30T08:02:34.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:02:34.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:02:34.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:02:34.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:02:34.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:02:34.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:02:34.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:02:34.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:02:34.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:02:34.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:02:34.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:02:34.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:02:34.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:02:34.702 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:02:34.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:02:35.248 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:02:35.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:02:35.348 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:02:35.348 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:02:35.516 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:02:35.516 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:03:05.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:03:05.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:03:05.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:03:05.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:03:05.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:03:06.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:03:06.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-05-30T08:03:06.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:03:06.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T08:03:06.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:03:06.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:03:06.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:03:06.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-05-30T08:03:08.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-05-30T08:03:08.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:03:08.767 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:03:08.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:03:08.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:03:08.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:03:08.789 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:03:08.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:03:08.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:03:08.790 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:03:08.790 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:03:08.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:03:08.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:03:08.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:03:08.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:03:08.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:03:09.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:03:09.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:03:09.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:03:09.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:03:09.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:03:09.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:03:09.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:03:09.109 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:03:04
2026-05-30T08:03:09.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74166, datetime.datetime(2026, 5, 30, 8, 3, 4), datetime.datetime(2026, 5, 30, 8, 3, 3), 'salt', 12.04, 50.43, None, 13.94, 329.74, 9.97, 832.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:03:09.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:03:09.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:03:09.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:03:03, diff=6.116643s, valid=True
2026-05-30T08:03:09.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:03:09.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:03:09.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:03:12, diff=-2.880195s, valid=True
2026-05-30T08:03:09.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:03:09.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:03:09.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:02:55, diff=14.127166s, valid=True
2026-05-30T08:03:09.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:03:09.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:03:09.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:03:09.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:03:09.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:03:09.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:03:09.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:03:12, diff=-2.869467s, valid=True
2026-05-30T08:03:09.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:03:09.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:03:09.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:03:09.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053631.131284s, valid=True
2026-05-30T08:03:09.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:03:09.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:03:09.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:03:09.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:03:09.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:03:09.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:03:09.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:03:09.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:03:09.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:03:09.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:03:10.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:03:10.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:03:11.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:03:11.065 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:03:11.342 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:03:11.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:03:11.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:03:11.782 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:03:11.783 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:03:13.718 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:03:13.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:03:43.749 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:03:43.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:03:43.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:03:43.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:03:43.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:03:44.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:03:44.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-05-30T08:03:44.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:03:44.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-05-30T08:03:44.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:03:44.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:03:44.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:03:44.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-05-30T08:03:46.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-05-30T08:03:46.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:03:46.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:03:46.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:03:46.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:03:46.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:03:46.789 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:03:46.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:03:46.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:03:46.790 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:03:46.790 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:03:46.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:03:46.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:03:46.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:03:47.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:03:47.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:03:47.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:03:47.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:03:47.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:03:47.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:03:47.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:03:47.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:03:47.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:03:47.180 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:03:34
2026-05-30T08:03:47.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74167, datetime.datetime(2026, 5, 30, 8, 3, 34), datetime.datetime(2026, 5, 30, 8, 3, 33), 'salt', 11.91, 50.66, None, 14.68, 333.94, 9.9, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:03:47.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:03:47.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:03:47.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:03:33, diff=14.18794s, valid=True
2026-05-30T08:03:47.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:03:47.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:03:47.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:04:12, diff=-24.808657s, valid=True
2026-05-30T08:03:47.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:03:47.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:03:47.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:03:27, diff=20.199364s, valid=True
2026-05-30T08:03:47.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:03:47.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:03:47.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:03:47.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:03:47.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:03:47.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:03:47.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:04:12, diff=-24.79699s, valid=True
2026-05-30T08:03:47.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:03:47.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:03:47.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:03:47.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053669.203802s, valid=True
2026-05-30T08:03:47.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:03:47.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:03:47.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:03:47.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:03:47.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:03:47.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:03:47.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:03:47.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:03:47.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:03:47.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:03:47.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:03:47.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:03:47.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:03:47.525 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:03:47.729 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:03:48.067 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:03:48.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:03:48.169 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:03:48.169 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:03:48.416 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:03:48.417 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:04:18.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:04:18.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:04:18.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:04:18.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:04:18.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:04:18.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:04:18.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-05-30T08:04:18.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:04:18.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-05-30T08:04:18.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:04:18.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:04:18.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:04:18.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-05-30T08:04: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-05-30T08:04:21.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:04:21.533 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:04:21.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:04:21.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:04:21.553 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:04:21.553 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:04:21.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:04:21.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:04:21.554 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:04:21.554 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:04:21.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:04:21.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:04:21.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:04:21.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:04:21.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:04:21.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:04:21.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:04:21.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:04:21.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:04:21.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:04:21.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:04:21.981 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:04:22.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:04:05
2026-05-30T08:04:22.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74168, datetime.datetime(2026, 5, 30, 8, 4, 5), datetime.datetime(2026, 5, 30, 8, 4, 4), 'salt', 11.91, 50.79, None, 15.07, 327.25, 9.86, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:04:22.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:04:22.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:04:22.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:04:04, diff=18.047335s, valid=True
2026-05-30T08:04:22.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:04:22.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:04:22.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:04:12, diff=10.050239s, valid=True
2026-05-30T08:04:22.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:04:22.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:04:22.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:03:58, diff=24.057172s, valid=True
2026-05-30T08:04:22.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:04:22.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:04:22.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:04:22.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:04:22.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:04:22.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:04:22.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:04:12, diff=10.060292s, valid=True
2026-05-30T08:04:22.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:04:22.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:04:22.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:04:22.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053704.060962s, valid=True
2026-05-30T08:04:22.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:04:22.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:04:22.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:04:22.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:04:22.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:04:22.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:04:22.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:04:22.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:04:22.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:04:22.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:04:22.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:04:22.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:04:22.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:04:22.460 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:04:22.677 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:04:23.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:04:23.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:04:23.130 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:04:23.131 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:04:23.401 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:04:23.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:04:53.428 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:04:53.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:04:53.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:04:53.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:04:53.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:04:53.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:04:53.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-05-30T08:04:53.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:04:53.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-05-30T08:04:53.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:04:53.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:04:53.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:04:53.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-05-30T08:04:56.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-05-30T08:04:56.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:04:56.463 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:04:56.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:04:56.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:04:56.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:04:56.485 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:04:56.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:04:56.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:04:56.485 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:04:56.485 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:04:56.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:04:56.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:04:56.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:04:56.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:04:56.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:04:57.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:04:57.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:04:57.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:04:57.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:04:57.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:04:57.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:04:57.099 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:04:57.162 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:04:35
2026-05-30T08:04:57.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74169, datetime.datetime(2026, 5, 30, 8, 4, 35), datetime.datetime(2026, 5, 30, 8, 4, 33), 'salt', 11.94, 51.13, None, 15.17, 327.94, 9.77, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:04:57.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:04:57.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:04:57.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:04:33, diff=24.170685s, valid=True
2026-05-30T08:04:57.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:04:57.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:04:57.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:05:12, diff=-14.825417s, valid=True
2026-05-30T08:04:57.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:04:57.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:04:57.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:04:29, diff=28.183334s, valid=True
2026-05-30T08:04:57.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:04:57.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:04:57.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:04:57.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:04:57.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:04:57.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:04:57.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:05:12, diff=-14.813067s, valid=True
2026-05-30T08:04:57.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:04:57.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:04:57.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:04:57.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053739.18766s, valid=True
2026-05-30T08:04:57.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:04:57.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:04:57.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:04:57.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:04:57.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:04:57.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:04:57.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:04:57.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:04:57.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:04:57.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:04:57.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:04:57.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:04:57.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:04:57.516 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:04:57.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:04:58.105 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:04:58.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:04:58.215 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:04:58.216 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:04:58.435 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:04:58.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:05:28.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:05:28.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:05:28.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:05:28.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:05:28.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:05:28.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:05:28.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-05-30T08:05:28.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:05:28.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-05-30T08:05:28.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:05:28.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:05:28.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:05:28.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-05-30T08:05:31.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-05-30T08:05:31.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:05:31.295 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:05:31.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:05:31.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:05:31.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:05:31.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:05:31.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:05:31.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:05:31.316 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:05:31.316 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:05:31.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:05:31.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:05:31.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:05:31.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:05:31.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:05:32.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:05:32.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:05:32.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:05:32.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:05:32.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:05:32.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:05:32.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:05:32.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:05:05
2026-05-30T08:05:32.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74170, datetime.datetime(2026, 5, 30, 8, 5, 5), datetime.datetime(2026, 5, 30, 8, 5, 5), 'salt', 11.81, 51.19, None, 15.14, 330.63, 9.75, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:05:32.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:05:32.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:05:32.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:05:05, diff=27.184649s, valid=True
2026-05-30T08:05:32.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:05:32.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:05:32.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:05:12, diff=20.187542s, valid=True
2026-05-30T08:05:32.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:05:32.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:05:32.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:05:01, diff=31.194367s, valid=True
2026-05-30T08:05:32.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:05:32.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:05:32.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:05:32.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:05:32.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:05:32.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:05:32.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:05:12, diff=20.197458s, valid=True
2026-05-30T08:05:32.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:05:32.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:05:32.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:05:32.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053774.198138s, valid=True
2026-05-30T08:05:32.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:05:32.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:05:32.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:05:32.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:05:32.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:05:32.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:05:32.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:05:32.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:05:32.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:05:32.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:05:32.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:05:32.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:05:32.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:05:32.733 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:05:32.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:05:33.299 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:05:33.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:05:33.407 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:05:33.407 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:05:33.658 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:05:33.658 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:06:03.688 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:06:03.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:06:03.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:06:03.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:06:03.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:06:04.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:06:04.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-05-30T08:06:04.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:06:04.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-05-30T08:06:04.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:06:04.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:06:04.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:06:04.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-05-30T08:06:06.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-05-30T08:06:06.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:06:06.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:06:06.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:06:06.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:06:06.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:06:06.298 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:06:06.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:06:06.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:06:06.298 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:06:06.298 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:06:06.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:06:06.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:06:06.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:06:06.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:06:06.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:06:06.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:06:06.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:06:06.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:06:06.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:06:06.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:06:06.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:06:06.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:06:06.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:06:06
2026-05-30T08:06:06.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74172, datetime.datetime(2026, 5, 30, 8, 6, 6), datetime.datetime(2026, 5, 30, 8, 6, 5), 'salt', 11.84, 51.39, None, 14.96, 329.27, 9.69, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:06:06.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:06:06.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:06:06.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:06:05, diff=1.640371s, valid=True
2026-05-30T08:06:06.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:06:06.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:06:06.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:06:12, diff=-5.356632s, valid=True
2026-05-30T08:06:06.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:06:06.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:06:06.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:06:04, diff=2.650536s, valid=True
2026-05-30T08:06:06.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:06:06.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:06:06.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:06:06.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:06:06.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:06:06.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:06:06.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:06:12, diff=-5.346238s, valid=True
2026-05-30T08:06:06.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:06:06.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:06:06.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:06:06.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053808.654456s, valid=True
2026-05-30T08:06:06.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:06:06.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:06:06.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:06:06.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:06:06.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:06:06.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:06:06.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:06:06.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:06:06.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:06:06.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:06:06.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:06:06.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:06:06.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:06:06.991 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:06:07.209 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:06:07.564 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:06:07.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:06:07.673 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:06:07.673 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:06:07.897 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:06:07.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:06:37.927 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:06:37.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:06:37.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:06:38.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:06:38.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:06:38.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:06:38.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-05-30T08:06:38.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:06:38.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-05-30T08:06:38.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:06:38.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:06:38.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:06:38.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-05-30T08:06:40.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T08:06:40.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:06:40.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:06:40.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:06:40.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:06:40.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:06:40.806 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:06:40.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:06:40.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:06:40.806 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:06:40.806 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:06:40.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:06:40.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:06:40.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:06:41.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:06:41.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:06:41.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:06:41.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:06:41.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:06:41.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:06:41.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:06:41.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:06:41.172 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:06:41.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:06:36
2026-05-30T08:06:41.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74173, datetime.datetime(2026, 5, 30, 8, 6, 36), datetime.datetime(2026, 5, 30, 8, 6, 35), 'salt', 11.81, 51.36, None, 13.97, 330.82, 9.7, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:06:41.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:06:41.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:06:41.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:06:35, diff=6.24281s, valid=True
2026-05-30T08:06:41.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:06:41.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:06:41.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:07:12, diff=-30.754089s, valid=True
2026-05-30T08:06:41.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:06:41.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:06:41.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:06:35, diff=6.253236s, valid=True
2026-05-30T08:06:41.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:06:41.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:06:41.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:06:41.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:06:41.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:06:41.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:06:41.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:07:12, diff=-30.743394s, valid=True
2026-05-30T08:06:41.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:06:41.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:06:41.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:06:41.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053843.25738s, valid=True
2026-05-30T08:06:41.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:06:41.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:06:41.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:06:41.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:06:41.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:06:41.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:06:41.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:06:41.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:06:41.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:06:41.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:06:41.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:06:41.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:06:41.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:06:41.669 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:06:41.890 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:06:42.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:06:42.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:06:42.362 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:06:42.362 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:06:42.605 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:06:42.605 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:07:12.635 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:07:12.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:07:12.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:07:12.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:07:12.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:07:13.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:07:13.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T08:07:13.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:07:13.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-05-30T08:07:13.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:07:13.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:07:13.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:07:13.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-05-30T08:07:15.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-05-30T08:07:15.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:07:15.381 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:07:15.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:07:15.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:07:15.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:07:15.404 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:07:15.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:07:15.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:07:15.405 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:07:15.405 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:07:15.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:07:15.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:07:15.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:07:15.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:07:15.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:07:15.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:07:15.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:07:15.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:07:15.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:07:15.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:07:15.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:07:15.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:07:15.735 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:07:06
2026-05-30T08:07:15.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74174, datetime.datetime(2026, 5, 30, 8, 7, 6), datetime.datetime(2026, 5, 30, 8, 7, 5), 'salt', 11.81, 51.52, None, 15.32, 328.0, 9.66, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:07:15.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:07:15.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:07:15.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:07:05, diff=10.742601s, valid=True
2026-05-30T08:07:15.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:07:15.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:07:15.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:07:12, diff=3.745633s, valid=True
2026-05-30T08:07:15.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:07:15.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:07:15.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:06:57, diff=18.753146s, valid=True
2026-05-30T08:07:15.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:07:15.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:07:15.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:07:15.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:07:15.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:07:15.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:07:15.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:07:12, diff=3.756406s, valid=True
2026-05-30T08:07:15.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:07:15.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:07:15.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:07:15.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053877.75718s, valid=True
2026-05-30T08:07:15.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:07:15.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:07:15.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:07:15.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:07:15.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:07:15.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:07:15.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:07:15.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:07:15.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:07:15.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:07:15.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:07:16.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:07:16.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:07:16.102 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:07:16.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:07:16.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:07:16.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:07:16.791 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:07:16.791 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:07:17.050 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:07:17.050 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:07:47.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:07:47.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:07:47.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:07:47.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:07:47.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:07:47.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:07:47.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-05-30T08:07:47.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:07:47.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-05-30T08:07:47.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:07:47.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:07:47.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:07:47.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-05-30T08:07:50.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-05-30T08:07:50.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:07:50.148 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:07:50.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:07:50.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:07:50.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:07:50.189 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:07:50.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:07:50.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:07:50.191 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:07:50.191 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:07:50.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:07:50.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:07:50.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:07:50.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:07:50.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:07:50.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:07:50.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:07:50.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:07:50.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:07:50.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:07:50.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:07:50.503 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:07:50.564 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:07:36
2026-05-30T08:07:50.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74175, datetime.datetime(2026, 5, 30, 8, 7, 36), datetime.datetime(2026, 5, 30, 8, 7, 36), 'salt', 11.78, 51.56, None, 15.63, 328.52, 9.65, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:07:50.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:07:50.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:07:50.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:07:36, diff=14.571328s, valid=True
2026-05-30T08:07:50.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:07:50.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:07:50.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:08:12, diff=-21.425658s, valid=True
2026-05-30T08:07:50.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:07:50.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:07:50.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:07:28, diff=22.581416s, valid=True
2026-05-30T08:07:50.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:07:50.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:07:50.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:07:50.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:07:50.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:07:50.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:07:50.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:08:12, diff=-21.415359s, valid=True
2026-05-30T08:07:50.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:07:50.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:07:50.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:07:50.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053912.585341s, valid=True
2026-05-30T08:07:50.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:07:50.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:07:50.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:07:50.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:07:50.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:07:50.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:07:50.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:07:50.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:07:50.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:07:50.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:07:50.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:07:50.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:07:50.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:07:50.920 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:07:51.139 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:07:51.497 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:07:51.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:07:51.607 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:07:51.607 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:07:51.836 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:07:51.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:08:21.866 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:08:21.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:08:21.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:08:22.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:08:22.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:08:22.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:08:22.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T08:08:22.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:08:22.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T08:08:22.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:08:22.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:08:22.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:08:22.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-05-30T08:08:24.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-05-30T08:08:24.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:08:24.696 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:08:24.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:08:24.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:08:24.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:08:24.717 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:08:24.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:08:24.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:08:24.717 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:08:24.717 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:08:24.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:08:24.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:08:24.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:08:24.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:08:24.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:08:24.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:08:24.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:08:24.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:08:24.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:08:24.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:08:24.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:08:24.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:08:25.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:08:07
2026-05-30T08:08:25.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74176, datetime.datetime(2026, 5, 30, 8, 8, 7), datetime.datetime(2026, 5, 30, 8, 8, 6), 'salt', 11.81, 51.49, None, 14.29, 332.72, 9.67, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:08:25.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:08:25.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:08:25.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:08:06, diff=19.053579s, valid=True
2026-05-30T08:08:25.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:08:25.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:08:25.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:08:12, diff=13.05666s, valid=True
2026-05-30T08:08:25.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:08:25.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:08:25.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:07:59, diff=26.063922s, valid=True
2026-05-30T08:08:25.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:08:25.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:08:25.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:08:25.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:08:25.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:08:25.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:08:25.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:08:12, diff=13.06711s, valid=True
2026-05-30T08:08:25.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:08:25.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:08:25.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:08:25.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053947.067834s, valid=True
2026-05-30T08:08:25.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:08:25.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:08:25.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:08:25.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:08:25.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:08:25.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:08:25.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:08:25.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:08:25.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:08:25.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:08:25.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:08:25.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:08:25.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:08:25.408 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:08:25.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:08:25.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:08:26.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:08:26.153 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:08:26.153 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:08:26.393 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:08:26.394 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:08:56.423 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:08:56.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:08:56.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:08:56.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:08:56.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:08:56.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:08:56.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-05-30T08:08:56.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:08:56.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-05-30T08:08:56.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:08:56.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:08:56.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:08:56.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-05-30T08:08:59.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-05-30T08:08:59.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:08:59.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:08:59.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:08:59.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:08:59.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:08:59.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:08:59.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:08:59.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:08:59.321 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:08:59.321 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:08:59.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:08:59.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:08:59.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:08:59.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:08:59.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:08:59.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:08:59.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:08:59.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:08:59.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:08:59.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:08:59.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:08:59.579 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:08:59.640 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:08:37
2026-05-30T08:08:59.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74177, datetime.datetime(2026, 5, 30, 8, 8, 37), datetime.datetime(2026, 5, 30, 8, 8, 36), 'salt', 11.81, 51.49, None, 14.5, 325.52, 9.67, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:08:59.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:08:59.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:08:59.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:08:36, diff=23.647092s, valid=True
2026-05-30T08:08:59.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:08:59.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:08:59.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:09:12, diff=-12.349984s, valid=True
2026-05-30T08:08:59.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:08:59.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:08:59.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:08:30, diff=29.656928s, valid=True
2026-05-30T08:08:59.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:08:59.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:08:59.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:08:59.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:08:59.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:08:59.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:08:59.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:09:12, diff=-12.339998s, valid=True
2026-05-30T08:08:59.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:08:59.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:08:59.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:08:59.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1053981.66074s, valid=True
2026-05-30T08:08:59.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:08:59.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:08:59.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:08:59.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:08:59.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:08:59.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:08:59.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:08:59.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:08:59.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:08:59.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:08:59.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:08:59.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:08:59.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:09:00.000 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:09:00.222 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:09:00.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:09:00.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:09:00.671 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:09:00.671 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:09:00.934 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:09:00.934 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:09:30.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:09:30.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:09:30.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:09:31.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:09:31.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:09:31.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:09:31.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-05-30T08:09:31.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:09:31.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-05-30T08:09:31.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:09:31.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:09:31.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:09:31.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-05-30T08:09:34.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-05-30T08:09:34.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:09:34.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:09:34.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:09:34.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:09:34.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:09:34.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:09:34.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:09:34.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:09:34.522 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:09:34.522 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:09:34.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:09:34.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:09:34.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:09:34.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:09:34.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:09:34.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:09:34.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:09:34.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:09:34.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:09:34.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:09:34.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:09:34.816 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:09:34.877 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:09:07
2026-05-30T08:09:34.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74178, datetime.datetime(2026, 5, 30, 8, 9, 7), datetime.datetime(2026, 5, 30, 8, 9, 6), 'salt', 11.88, 51.46, None, 15.42, 329.81, 9.68, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:09:34.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:09:34.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:09:34.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:09:06, diff=28.883852s, valid=True
2026-05-30T08:09:34.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:09:34.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:09:34.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:09:12, diff=22.886786s, valid=True
2026-05-30T08:09:34.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:09:34.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:09:34.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:09:02, diff=32.893691s, valid=True
2026-05-30T08:09:34.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:09:34.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:09:34.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:09:34.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:09:34.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:09:34.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:09:34.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:09:12, diff=22.89678s, valid=True
2026-05-30T08:09:34.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:09:34.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:09:34.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:09:34.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054016.897449s, valid=True
2026-05-30T08:09:34.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:09:34.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:09:34.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:09:34.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:09:34.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:09:34.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:09:34.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:09:34.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:09:34.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:09:35.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:09:35.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:09:35.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:09:35.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:09:35.222 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:09:35.432 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:09:35.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:09:35.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:09:35.961 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:09: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-05-30T08:09:36.200 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:09:36.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:10:06.207 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:10:06.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:10:06.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:10:06.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:10:06.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:10:06.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:10:06.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T08:10:06.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:10:06.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-05-30T08:10:06.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:10:06.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:10:06.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:10:06.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-05-30T08:10:08.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-05-30T08:10:08.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:10:08.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:10:08.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:10:08.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:10:08.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:10:08.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:10:08.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:10:08.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:10:08.945 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:10:08.945 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:10:08.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:10:09.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:10:09.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:10:09.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:10:09.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:10:09.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:10:09.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:10:09.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:10:09.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:10:09.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:10:09.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:10:09.202 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:10:09.262 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:10:08
2026-05-30T08:10:09.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74180, datetime.datetime(2026, 5, 30, 8, 10, 8), datetime.datetime(2026, 5, 30, 8, 10, 7), 'salt', 11.84, 51.26, None, 14.43, 330.12, 9.73, 832.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:10:09.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:10:09.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:10:09.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:10:07, diff=2.268518s, valid=True
2026-05-30T08:10:09.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:10:09.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:10:09.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:10:12, diff=-2.728549s, valid=True
2026-05-30T08:10:09.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:10:09.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:10:09.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:10:05, diff=4.278296s, valid=True
2026-05-30T08:10:09.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:10:09.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:10:09.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:10:09.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:10:09.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:10:09.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:10:09.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:10:12, diff=-2.718604s, valid=True
2026-05-30T08:10:09.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:10:09.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:10:09.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:10:09.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054051.282058s, valid=True
2026-05-30T08:10:09.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:10:09.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:10:09.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:10:09.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:10:09.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:10:09.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:10:09.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:10:09.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:10:09.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:10:09.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:10:09.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:10:09.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:10:09.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:10:09.606 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:10:09.813 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:10:10.164 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:10:10.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:10:10.280 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:10:10.280 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:10:10.517 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:10:10.517 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:10:40.525 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:10:40.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:10:40.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:10:40.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:10:40.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:10:41.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:10:41.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-05-30T08:10:41.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:10:41.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-05-30T08:10:41.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:10:41.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:10:41.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:10:41.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-05-30T08:10:43.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-05-30T08:10:43.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:10:43.395 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:10:43.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:10:43.402 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:10:43.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:10:43.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:10:43.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:10:43.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:10:43.415 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:10:43.415 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:10:43.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:10:43.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:10:43.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:10:43.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:10:43.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:10:43.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:10:43.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:10:43.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:10:43.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:10:43.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:10:43.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:10:43.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:10:43.733 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:10:38
2026-05-30T08:10:43.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74181, datetime.datetime(2026, 5, 30, 8, 10, 38), datetime.datetime(2026, 5, 30, 8, 10, 37), 'salt', 11.91, 51.42, None, 14.93, 331.13, 9.69, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:10:43.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:10:43.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:10:43.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:10:37, diff=6.740149s, valid=True
2026-05-30T08:10:43.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:10:43.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:10:43.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:11:12, diff=-28.25687s, valid=True
2026-05-30T08:10:43.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:10:43.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:10:43.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:10:36, diff=7.750092s, valid=True
2026-05-30T08:10:43.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:10:43.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:10:43.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:10:43.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:10:43.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:10:43.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:10:43.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:11:12, diff=-28.246814s, valid=True
2026-05-30T08:10:43.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:10:43.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:10:43.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:10:43.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054085.753887s, valid=True
2026-05-30T08:10:43.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:10:43.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:10:43.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:10:43.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:10:43.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:10:43.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:10:43.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:10:43.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:10:43.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:10:43.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:10:43.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:10:43.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:10:44.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:10:44.092 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:10:44.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:10:44.735 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:10:44.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:10:44.841 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:10:44.841 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:10:45.032 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:10:45.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:11:15.063 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:11:15.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:11:15.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:11:15.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:11:15.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:11:15.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:11:15.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-05-30T08:11:15.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:11: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-05-30T08:11:15.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:11:15.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:11:15.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:11:15.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-05-30T08:11:18.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-05-30T08:11:18.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:11:18.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:11:18.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:11:18.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:11:18.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:11:18.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:11:18.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:11:18.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:11:18.093 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:11:18.093 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:11:18.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:11:18.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:11:18.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:11:18.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:11:18.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:11:18.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:11:18.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:11:18.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:11:18.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:11:18.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:11:18.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:11:18.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:11:18.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:11:08
2026-05-30T08:11:18.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74182, datetime.datetime(2026, 5, 30, 8, 11, 8), datetime.datetime(2026, 5, 30, 8, 11, 8), 'salt', 11.91, 51.36, None, 13.83, 327.42, 9.71, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:11:18.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:11:18.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:11:18.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:11:08, diff=10.670341s, valid=True
2026-05-30T08:11:18.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:11:18.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:11:18.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:11:12, diff=6.67328s, valid=True
2026-05-30T08:11:18.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:11:18.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:11:18.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:11:00, diff=18.680048s, valid=True
2026-05-30T08:11:18.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:11:18.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:11:18.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:11:18.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:11:18.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:11:18.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:11:18.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:11:12, diff=6.683159s, valid=True
2026-05-30T08:11:18.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:11:18.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:11:18.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:11:18.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054120.683853s, valid=True
2026-05-30T08:11:18.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:11:18.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:11:18.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:11:18.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:11:18.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:11:18.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:11:18.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:11:18.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:11:18.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:11:18.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:11:18.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:11:18.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:11:18.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:11:19.002 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:11:19.210 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:11:19.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:11:19.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:11:19.651 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:11:19.652 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:11:19.924 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:11:19.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:11:49.953 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:11:49.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:11:49.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:11:50.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:11:50.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:11:50.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:11:50.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-05-30T08:11:50.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:11:50.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-05-30T08:11:50.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:11:50.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:11:50.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:11:50.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T08:11:53.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-05-30T08:11:53.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:11:53.070 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:11:53.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:11:53.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:11:53.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:11:53.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:11:53.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:11:53.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:11:53.095 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:11:53.096 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:11:53.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:11:53.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:11:53.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:11:53.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:11:53.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:11:53.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:11:53.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:11:53.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:11:53.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:11:53.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:11:53.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:11:53.350 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:11:53.426 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:11:38
2026-05-30T08:11:53.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74183, datetime.datetime(2026, 5, 30, 8, 11, 38), datetime.datetime(2026, 5, 30, 8, 11, 37), 'salt', 11.84, 51.06, None, 13.9, 331.2, 9.78, 832.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:11:53.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:11:53.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:11:53.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:11:37, diff=16.432518s, valid=True
2026-05-30T08:11:53.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:11:53.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:11:53.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:12:12, diff=-18.564599s, valid=True
2026-05-30T08:11:53.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:11:53.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:11:53.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:11:30, diff=23.442336s, valid=True
2026-05-30T08:11:53.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:11:53.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:11:53.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:11:53.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:11:53.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:11:53.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:11:53.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:12:12, diff=-18.5545s, valid=True
2026-05-30T08:11:53.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:11:53.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:11:53.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:11:53.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054155.446244s, valid=True
2026-05-30T08:11:53.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:11:53.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:11:53.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:11:53.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:11:53.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:11:53.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:11:53.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:11:53.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:11:53.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:11:53.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:11:53.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:11:53.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:11:53.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:11:53.846 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:11:54.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:11:54.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:11:54.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:11:54.514 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:11:54.514 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:11:54.807 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:11:54.807 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:12:24.837 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:12:24.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:12:24.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:12:25.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:12:25.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:12:25.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:12:25.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-05-30T08:12:25.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:12:25.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-05-30T08:12:25.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:12:25.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:12:25.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:12:25.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-05-30T08:12:28.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-05-30T08:12:28.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:12:28.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:12:28.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:12:28.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:12:28.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:12:28.276 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:12:28.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:12:28.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:12:28.277 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:12:28.277 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:12:28.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:12:28.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:12:28.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:12:28.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:12:28.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:12:28.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:12:28.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:12:28.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:12:28.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:12:28.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:12:28.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:12:28.538 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:12:28.600 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:12:09
2026-05-30T08:12:28.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74184, datetime.datetime(2026, 5, 30, 8, 12, 9), datetime.datetime(2026, 5, 30, 8, 12, 7), 'salt', 11.91, 51.03, None, 14.08, 327.35, 9.8, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:12:28.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:12:28.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:12:28.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:12:07, diff=21.606438s, valid=True
2026-05-30T08:12:28.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:12:28.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:12:28.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:12:12, diff=16.609368s, valid=True
2026-05-30T08:12:28.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:12:28.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:12:28.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:12:00, diff=28.61629s, valid=True
2026-05-30T08:12:28.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:12:28.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:12:28.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:12:28.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:12:28.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:12:28.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:12:28.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:12:12, diff=16.619399s, valid=True
2026-05-30T08:12:28.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:12:28.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:12:28.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:12:28.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054190.620086s, valid=True
2026-05-30T08:12:28.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:12:28.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:12:28.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:12:28.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:12:28.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:12:28.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:12:28.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:12:28.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:12:28.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:12:28.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:12:28.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:12:28.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:12:28.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:12:28.939 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:12:29.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:12:29.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:12:29.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:12: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-05-30T08:12: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-05-30T08:12:29.817 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:12:29.817 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:12:59.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:12:59.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:12:59.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:13:00.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:13:00.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:13:00.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:13:00.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-05-30T08:13:00.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:13:00.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-05-30T08:13:00.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:13:00.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:13:00.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:13:00.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-05-30T08:13:02.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-05-30T08:13:02.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:13:02.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:13:02.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:13:02.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:13:02.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:13:02.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:13:02.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:13:02.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:13:02.762 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:13:02.762 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:13:02.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:13:02.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:13:02.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:13:02.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:13:02.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:13:03.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:13:03.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:13:03.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:13:03.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:13:03.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:13:03.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:13:03.083 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:13:03.145 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:12:39
2026-05-30T08:13:03.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74185, datetime.datetime(2026, 5, 30, 8, 12, 39), datetime.datetime(2026, 5, 30, 8, 12, 37), 'salt', 11.94, 50.93, None, 13.55, 325.89, 9.83, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:13:03.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:13:03.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:13:03.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:12:37, diff=26.15376s, valid=True
2026-05-30T08:13:03.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:13:03.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:13:03.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:13:12, diff=-8.842665s, valid=True
2026-05-30T08:13:03.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:13:03.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:13:03.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:12:32, diff=31.165758s, valid=True
2026-05-30T08:13:03.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:13:03.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:13:03.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:13:03.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:13:03.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:13:03.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:13:03.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:13:12, diff=-8.830444s, valid=True
2026-05-30T08:13:03.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:13:03.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:13:03.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:13:03.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054225.170385s, valid=True
2026-05-30T08:13:03.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:13:03.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:13:03.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:13:03.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:13:03.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:13:03.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:13:03.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:13:03.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:13:03.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:13:03.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:13:03.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:13:03.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:13:03.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:13:03.560 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:13:03.769 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:13:04.112 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:13:04.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:13: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-05-30T08:13: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-05-30T08:13:04.417 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:13:04.417 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:13:34.447 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:13:34.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:13:34.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:13:34.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:13:34.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:13:35.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:13:35.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-05-30T08:13:35.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:13:35.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-05-30T08:13:35.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:13:35.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:13:35.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:13:35.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-05-30T08:13:37.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-05-30T08:13:37.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:13:37.740 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:13:37.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:13:37.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:13:37.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:13:37.763 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:13:37.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:13:37.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:13:37.764 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:13:37.764 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:13:37.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:13:37.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:13:37.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:13:37.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:13:37.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:13:38.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:13:38.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:13:38.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:13:38.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:13:38.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:13:38.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:13:38.080 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:13:38.141 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:13:09
2026-05-30T08:13:38.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74186, datetime.datetime(2026, 5, 30, 8, 13, 9), datetime.datetime(2026, 5, 30, 8, 13, 8), 'salt', 11.97, 51.13, None, 13.45, 326.95, 9.77, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:13:38.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:13:38.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:13:38.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:13:08, diff=30.147841s, valid=True
2026-05-30T08:13:38.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:13:38.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:13:38.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:13:12, diff=26.150668s, valid=True
2026-05-30T08:13:38.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:13:38.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:13:38.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:13:03, diff=35.157495s, valid=True
2026-05-30T08:13:38.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:13:38.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:13:38.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:13:38.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:13:38.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:13:38.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:13:38.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:13:12, diff=26.160535s, valid=True
2026-05-30T08:13:38.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:13:38.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:13:38.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:13:38.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054260.161206s, valid=True
2026-05-30T08:13:38.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:13:38.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:13:38.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:13:38.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:13:38.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:13:38.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:13:38.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:13:38.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:13:38.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:13:38.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:13:38.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:13:38.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:13:38.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:13:38.477 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:13:38.699 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:13:39.041 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:13:39.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:13:39.143 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:13:39.143 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:13:39.419 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:13:39.419 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:14:09.422 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:14:09.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:14:09.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:14:09.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:14:09.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:14:09.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:14:09.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-05-30T08:14:09.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:14:09.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-05-30T08:14:09.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:14:09.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:14:09.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:14:09.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-05-30T08:14:12.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-05-30T08:14:12.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:14:12.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:14:12.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:14:12.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:14:12.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:14:12.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:14:12.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:14:12.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:14:12.421 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:14:12.421 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:14:12.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:14:12.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:14:12.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:14:12.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:14:12.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:14:12.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:14:12.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:14:12.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:14:12.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:14:12.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:14:12.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:14:12.685 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:14:12.748 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:14:09
2026-05-30T08:14:12.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74188, datetime.datetime(2026, 5, 30, 8, 14, 9), datetime.datetime(2026, 5, 30, 8, 14, 9), 'salt', 11.87, 50.63, None, 13.27, 329.67, 9.9, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:14:12.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:14:12.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:14:12.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:14:09, diff=3.755434s, valid=True
2026-05-30T08:14:12.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:14:12.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:14:12.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:14:12, diff=0.758583s, valid=True
2026-05-30T08:14:12.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:14:12.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:14:12.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:14:06, diff=6.766021s, valid=True
2026-05-30T08:14:12.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:14:12.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:14:12.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:14:12.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:14:12.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:14:12.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:14:12.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:14:12, diff=0.769389s, valid=True
2026-05-30T08:14:12.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:14:12.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:14:12.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:14:12.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054294.770129s, valid=True
2026-05-30T08:14:12.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:14:12.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:14:12.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:14:12.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:14:12.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:14:12.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:14:12.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:14:12.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:14:12.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:14:12.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:14:13.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:14:13.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:14:13.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:14:13.157 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:14:13.365 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:14:13.707 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:14:13.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:14:13.808 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:14:13.808 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:14:14.063 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:14:14.063 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:14:44.093 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:14:44.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:14:44.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:14:44.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:14:44.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:14:44.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:14:44.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-05-30T08:14:44.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:14:44.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-05-30T08:14:44.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:14:44.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:14:44.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:14:44.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-05-30T08:14:46.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-05-30T08:14:46.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:14:46.984 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:14:46.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:14:46.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:14:47.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:14:47.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:14:47.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:14:47.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:14:47.011 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:14:47.011 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:14:47.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:14:47.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:14:47.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:14:47.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:14:47.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:14:47.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:14:47.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:14:47.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:14:47.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:14:47.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:14:47.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:14:47.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:14:47.397 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:14:40
2026-05-30T08:14:47.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74189, datetime.datetime(2026, 5, 30, 8, 14, 40), datetime.datetime(2026, 5, 30, 8, 14, 39), 'salt', 11.94, 50.56, None, 13.76, 325.12, 9.93, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:14:47.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:14:47.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:14:47.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:14:39, diff=8.405283s, valid=True
2026-05-30T08:14:47.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:14:47.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:14:47.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:15:12, diff=-24.591227s, valid=True
2026-05-30T08:14:47.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:14:47.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:14:47.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:14:37, diff=10.417164s, valid=True
2026-05-30T08:14:47.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:14:47.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:14:47.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:14:47.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:14:47.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:14:47.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:14:47.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:15:12, diff=-24.579091s, valid=True
2026-05-30T08:14:47.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:14:47.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:14:47.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:14:47.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054329.421731s, valid=True
2026-05-30T08:14:47.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:14:47.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:14:47.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:14:47.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:14:47.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:14:47.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:14:47.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:14:47.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:14:47.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:14:47.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:14:47.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:14:47.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:14:47.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:14:47.746 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:14:47.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:14:48.290 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:14:48.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:14:48.391 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:14:48.391 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:14:48.584 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:14:48.584 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:15:18.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:15:18.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:15:18.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:15:18.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:15:18.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:15:19.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:15:19.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-05-30T08:15:19.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:15:19.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-05-30T08:15:19.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:15:19.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:15:19.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:15:19.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-05-30T08:15:21.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-05-30T08:15:21.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:15:21.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:15:21.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:15:21.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:15:21.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:15:21.637 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:15:21.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:15:21.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:15:21.638 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:15:21.638 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:15:21.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:15:21.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:15:21.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:15:21.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:15:21.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:15:21.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:15:21.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:15:21.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:15:21.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:15:21.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:15:21.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:15:21.959 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:15:22.023 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:15:10
2026-05-30T08:15:22.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74190, datetime.datetime(2026, 5, 30, 8, 15, 10), datetime.datetime(2026, 5, 30, 8, 15, 9), 'salt', 11.94, 50.56, None, 14.01, 322.35, 9.93, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:15:22.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:15:22.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:15:22.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:15:09, diff=13.031229s, valid=True
2026-05-30T08:15:22.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:15:22.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:15:22.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:15:12, diff=10.034617s, valid=True
2026-05-30T08:15:22.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:15:22.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:15:22.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:15:09, diff=13.042461s, valid=True
2026-05-30T08:15:22.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:15:22.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:15:22.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:15:22.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:15:22.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:15:22.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:15:22.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:15:12, diff=10.046211s, valid=True
2026-05-30T08:15:22.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:15:22.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:15:22.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:15:22.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054364.047009s, valid=True
2026-05-30T08:15:22.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:15:22.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:15:22.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:15:22.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:15:22.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:15:22.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:15:22.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:15:22.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:15:22.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:15:22.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:15:22.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:15:22.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:15:22.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:15:22.368 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:15:22.575 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:15:22.916 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:15:23.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:15:23.019 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:15:23.019 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:15:23.200 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:15:23.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:15:53.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:15:53.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:15:53.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:15:53.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:15:53.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:15:53.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:15:53.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-05-30T08:15:53.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:15:53.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-05-30T08:15:53.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:15:53.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:15:53.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:15:53.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-05-30T08:15:56.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T08:15:56.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:15:56.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:15:56.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:15:56.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:15:56.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:15:56.308 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:15:56.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:15:56.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:15:56.310 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:15:56.310 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:15:56.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:15:56.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:15:56.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:15:56.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:15:56.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:15:56.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:15:56.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:15:56.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:15:56.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:15:56.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:15:56.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:15:56.636 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:15:56.698 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:15:40
2026-05-30T08:15:56.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74191, datetime.datetime(2026, 5, 30, 8, 15, 40), datetime.datetime(2026, 5, 30, 8, 15, 39), 'salt', 11.94, 50.76, None, 13.69, 334.93, 9.87, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:15:56.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:15:56.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:15:56.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:15:39, diff=17.705657s, valid=True
2026-05-30T08:15:56.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:15:56.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:15:56.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:16:12, diff=-15.290781s, valid=True
2026-05-30T08:15:56.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:15:56.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:15:56.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:15:32, diff=24.7176s, valid=True
2026-05-30T08:15:56.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:15:56.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:15:56.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:15:56.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:15:56.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:15:56.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:15:56.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:16:12, diff=-15.278613s, valid=True
2026-05-30T08:15:56.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:15:56.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:15:56.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:15:56.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054398.722233s, valid=True
2026-05-30T08:15:56.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:15:56.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:15:56.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:15:56.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:15:56.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:15:56.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:15:56.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:15:56.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:15:56.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:15:56.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:15:56.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:15:56.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:15:57.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:15:57.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:15:57.251 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:15:57.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:15:57.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:15:57.761 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:15:57.761 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:15:57.945 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:15:57.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:16:27.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:16:27.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:16:27.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:16:28.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:16:28.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:16:28.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:16:28.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-05-30T08:16:28.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:16:28.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-05-30T08:16:28.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:16:28.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:16:28.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:16:28.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-05-30T08:16:31.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-05-30T08:16:31.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:16:31.454 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:16:31.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:16:31.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:16:31.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:16:31.478 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:16:31.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:16:31.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:16:31.479 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:16:31.479 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:16:31.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:16:31.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:16:31.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:16:31.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:16:31.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:16:31.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:16:31.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:16:31.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:16:31.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:16:31.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:16:31.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:16:31.811 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:16:31.872 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:16:10
2026-05-30T08:16:31.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74192, datetime.datetime(2026, 5, 30, 8, 16, 10), datetime.datetime(2026, 5, 30, 8, 16, 10), 'salt', 11.94, 50.69, None, 13.76, 341.08, 9.89, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:16:31.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:16:31.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:16:31.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:16:10, diff=21.87901s, valid=True
2026-05-30T08:16:31.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:16:31.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:16:31.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:16:12, diff=19.881892s, valid=True
2026-05-30T08:16:31.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:16:31.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:16:31.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:16:02, diff=29.888656s, valid=True
2026-05-30T08:16:31.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:16:31.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:16:31.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:16:31.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:16:31.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:16:31.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:16:31.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:16:12, diff=19.891759s, valid=True
2026-05-30T08:16:31.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:16:31.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:16:31.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:16:31.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054433.892423s, valid=True
2026-05-30T08:16:31.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:16:31.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:16:31.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:16:31.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:16:31.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:16:31.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:16:31.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:16:31.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:16:31.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:16:32.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:16:32.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:16:32.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:16:32.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:16:32.213 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:16:32.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:16:32.871 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:16:32.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:16:32.970 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:16:32.970 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:16:33.933 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:16:33.933 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:17:03.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:17:03.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:17:03.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:17:04.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:17:04.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:17:04.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:17:04.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-05-30T08:17:04.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:17:04.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-05-30T08:17:04.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:17:04.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:17:04.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:17:04.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-05-30T08:17:06.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-05-30T08:17:06.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:17:06.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:17:06.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:17:06.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:17:06.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:17:06.975 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:17:06.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:17:06.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:17:06.976 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:17:06.977 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:17:06.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:17:07.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:17:07.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:17:07.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:17:07.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:17:07.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:17:07.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:17:07.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:17:07.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:17:07.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:17:07.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:17:07.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:17:07.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:16:41
2026-05-30T08:17:07.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74193, datetime.datetime(2026, 5, 30, 8, 16, 41), datetime.datetime(2026, 5, 30, 8, 16, 40), 'salt', 11.97, 50.53, None, 14.12, 336.33, 9.94, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:17:07.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:17:07.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:17:07.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:16:40, diff=27.418486s, valid=True
2026-05-30T08:17:07.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:17:07.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:17:07.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:17:12, diff=-4.577798s, valid=True
2026-05-30T08:17:07.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:17:07.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:17:07.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:16:33, diff=34.430878s, valid=True
2026-05-30T08:17:07.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:17:07.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:17:07.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:17:07.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:17:07.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:17:07.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:17:07.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:17:12, diff=-4.565138s, valid=True
2026-05-30T08:17:07.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:17:07.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:17:07.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:17:07.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054469.435736s, valid=True
2026-05-30T08:17:07.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:17:07.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:17:07.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:17:07.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:17:07.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:17:07.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:17:07.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:17:07.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:17:07.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:17:07.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:17:07.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:17:07.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:17:07.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:17:07.760 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:17:07.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:17:08.383 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:17:08.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:17:08.484 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:17:08.484 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:17:08.660 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:17:08.660 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:17:38.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:17:38.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:17:38.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:17:39.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:17:39.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:17:39.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:17:39.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-05-30T08:17:39.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:17:39.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-05-30T08:17:39.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:17:39.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:17:39.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:17:39.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-05-30T08:17:41.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-05-30T08:17:41.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:17:41.780 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:17:41.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:17:41.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:17:41.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:17:41.804 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:17:41.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:17:41.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:17:41.805 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:17:41.805 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:17:41.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:17:41.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:17:41.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:17:42.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:17:42.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:17:42.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:17:42.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:17:42.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:17:42.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:17:42.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:17:42.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:17:42.143 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:17:42.209 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:17:41
2026-05-30T08:17:42.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74195, datetime.datetime(2026, 5, 30, 8, 17, 41), datetime.datetime(2026, 5, 30, 8, 17, 40), 'salt', 11.97, 50.2, None, 10.94, 336.22, 10.03, 832.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:17:42.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:17:42.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:17:42.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:17:40, diff=2.217038s, valid=True
2026-05-30T08:17:42.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:17:42.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:17:42.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:18:12, diff=-29.779462s, valid=True
2026-05-30T08:17:42.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:17:42.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:17:42.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:17:36, diff=6.22878s, valid=True
2026-05-30T08:17:42.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:17:42.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:17:42.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:17:42.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:17:42.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:17:42.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:17:42.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:18:12, diff=-29.767477s, valid=True
2026-05-30T08:17:42.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:17:42.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:17:42.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:17:42.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054504.233355s, valid=True
2026-05-30T08:17:42.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:17:42.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:17:42.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:17:42.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:17:42.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:17:42.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:17:42.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:17:42.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:17:42.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:17:42.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:17:42.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:17:42.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:17:42.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:17:42.557 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:17:42.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:17:43.122 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:17:43.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:17:43.223 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:17:43.223 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:17:43.392 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:17:43.392 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:18:13.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:18:13.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:18:13.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:18:13.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:18:13.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:18:13.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:18:13.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-05-30T08:18:13.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:18:13.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T08:18:13.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:18:13.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:18:13.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:18:13.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-05-30T08:18:16.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T08:18:16.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:18:16.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:18:16.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:18:16.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:18:16.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:18:16.242 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:18:16.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:18:16.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:18:16.243 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:18:16.243 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:18:16.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:18:16.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:18:16.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:18:16.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:18:16.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:18:16.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:18:16.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:18:16.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:18:16.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:18:16.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:18:16.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:18:16.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:18:16.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:18:12
2026-05-30T08:18:16.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74196, datetime.datetime(2026, 5, 30, 8, 18, 12), datetime.datetime(2026, 5, 30, 8, 18, 11), 'salt', 12.07, 49.8, None, 12.95, 343.91, 10.15, 832.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:18:16.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:18:16.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:18:16.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:18:11, diff=5.645986s, valid=True
2026-05-30T08:18:16.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:18:16.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:18:16.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:18:12, diff=4.649498s, valid=True
2026-05-30T08:18:16.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:18:16.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:18:16.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:18:07, diff=9.65785s, valid=True
2026-05-30T08:18:16.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:18:16.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:18:16.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:18:16.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:18:16.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:18:16.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:18:16.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:18:12, diff=4.661645s, valid=True
2026-05-30T08:18:16.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:18:16.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:18:16.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:18:16.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054538.662461s, valid=True
2026-05-30T08:18:16.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:18:16.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:18:16.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:18:16.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:18:16.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:18:16.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:18:16.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:18:16.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:18:16.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:18:16.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:18:16.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:18:16.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:18:16.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:18:16.988 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:18:17.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:18:17.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:18:17.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:18:17.707 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:18:17.707 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:18:17.881 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:18:17.882 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:18:47.912 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:18:47.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:18:47.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:18:48.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:18:48.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:18:48.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:18:48.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-05-30T08:18:48.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:18:48.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-05-30T08:18:48.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:18:48.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:18:48.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:18:48.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-05-30T08:18:50.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-05-30T08:18:50.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:18:50.743 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:18:50.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:18:50.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:18:50.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:18:50.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:18:50.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:18:50.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:18:50.767 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:18:50.767 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:18:50.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:18:50.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:18:50.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:18:51.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:18:51.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:18:51.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:18:51.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:18:51.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:18:51.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:18:51.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:18:51.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:18:51.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:18:51.163 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:18:42
2026-05-30T08:18:51.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74197, datetime.datetime(2026, 5, 30, 8, 18, 42), datetime.datetime(2026, 5, 30, 8, 18, 41), 'salt', 12.14, 49.9, None, 9.56, 341.0, 10.13, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:18:51.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:18:51.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:18:51.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:18:41, diff=10.17109s, valid=True
2026-05-30T08:18:51.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:18:51.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:18:51.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:19:12, diff=-20.825383s, valid=True
2026-05-30T08:18:51.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:18:51.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:18:51.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:18:38, diff=13.183012s, valid=True
2026-05-30T08:18:51.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:18:51.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:18:51.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:18:51.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:18:51.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:18:51.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:18:51.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:19:12, diff=-20.813202s, valid=True
2026-05-30T08:18:51.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:18:51.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:18:51.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:18:51.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054573.187606s, valid=True
2026-05-30T08:18:51.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:18:51.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:18:51.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:18:51.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:18:51.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:18:51.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:18:51.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:18:51.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:18:51.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:18:51.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:18:51.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:18:51.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:18:51.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:18:51.518 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:18:51.724 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:18:52.063 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:18:52.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:18:52.164 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:18:52.164 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:18:52.333 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:18:52.333 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:19:22.337 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:19:22.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:19:22.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:19:22.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:19:22.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:19:22.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:19:22.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-05-30T08:19:23.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:19:23.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-05-30T08:19:23.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:19:23.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:19:23.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:19:23.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T08:19:25.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-05-30T08:19:25.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:19:25.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:19:25.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:19:25.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:19:25.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:19:25.473 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:19:25.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:19:25.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:19:25.474 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:19:25.474 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:19:25.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:19:25.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:19:25.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:19:25.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:19:25.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:19:25.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:19:25.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:19:25.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:19:25.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:19:25.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:19:25.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:19:25.788 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:19:25.850 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:19:12
2026-05-30T08:19:25.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74198, datetime.datetime(2026, 5, 30, 8, 19, 12), datetime.datetime(2026, 5, 30, 8, 19, 11), 'salt', 12.21, 49.83, None, 7.66, 308.87, 10.16, 832.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:19:25.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:19:25.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:19:25.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:19:11, diff=14.858329s, valid=True
2026-05-30T08:19:25.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:19:25.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:19:25.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:19:12, diff=13.861801s, valid=True
2026-05-30T08:19:25.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:19:25.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:19:25.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:19:10, diff=15.870121s, valid=True
2026-05-30T08:19:25.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:19:25.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:19:25.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:19:25.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:19:25.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:19:25.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:19:25.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:19:12, diff=13.877071s, valid=True
2026-05-30T08:19:25.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:19:25.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:19:25.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:19:25.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054607.878775s, valid=True
2026-05-30T08:19:25.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:19:25.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:19:25.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:19:25.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:19:25.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:19:25.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:19:25.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:19:25.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:19:25.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:19:26.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:19:26.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:19:26.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:19:26.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:19:26.271 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:19:26.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:19:26.828 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:19:26.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:19:26.934 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:19:26.934 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:19:27.174 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:19:27.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:19:57.191 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:19:57.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:19:57.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:19:57.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:19:57.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:19:57.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:19:57.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T08:19:57.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:19:57.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-05-30T08:19:57.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:19:57.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:19:57.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:19:57.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-05-30T08:20:00.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-05-30T08:20:00.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:20:00.144 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:20:00.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:20:00.150 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:20:00.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:20:00.163 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:20:00.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:20:00.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:20:00.163 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:20:00.163 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:20:00.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:20:00.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:20:00.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:20:00.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:20:00.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:20:00.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:20:00.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:20:00.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:20:00.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:20:00.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:20:00.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:20:00.482 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:20:00.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:19:42
2026-05-30T08:20:00.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74199, datetime.datetime(2026, 5, 30, 8, 19, 42), datetime.datetime(2026, 5, 30, 8, 19, 42), 'salt', 12.17, 49.7, None, 12.21, 332.48, 10.19, 832.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:20:00.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:20:00.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:20:00.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:19:42, diff=18.553112s, valid=True
2026-05-30T08:20:00.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:20:00.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:20:00.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:20:12, diff=-11.443386s, valid=True
2026-05-30T08:20:00.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:20:00.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:20:00.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:19:41, diff=19.564733s, valid=True
2026-05-30T08:20:00.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:20:00.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:20:00.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:20:00.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:20:00.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:20:00.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:20:00.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:20:12, diff=-11.431668s, valid=True
2026-05-30T08:20:00.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:20:00.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:20:00.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:20:00.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054642.569138s, valid=True
2026-05-30T08:20:00.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:20:00.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:20:00.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:20:00.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:20:00.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:20:00.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:20:00.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:20:00.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:20:00.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:20:00.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:20:00.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:20:00.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:20:00.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:20:00.893 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:20:01.099 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:20:01.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:20:01.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:20:01.540 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:20:01.540 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:20:04.414 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:20:04.414 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:20:34.429 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:20:34.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:20:34.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:20:34.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:20:34.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:20:34.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:20:34.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-05-30T08:20:34.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:20:34.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-05-30T08:20:34.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:20:34.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:20:35.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:20:35.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-05-30T08:20:37.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-05-30T08:20:37.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:20:37.731 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:20:37.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:20:37.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:20:37.754 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:20:37.754 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:20:37.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:20:37.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:20:37.755 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:20:37.756 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:20:37.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:20:37.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:20:37.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:20:38.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:20:38.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:20:38.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:20:38.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:20:38.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:20:38.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:20:38.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:20:38.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:20:38.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:20:38.175 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:20:13
2026-05-30T08:20:38.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74200, datetime.datetime(2026, 5, 30, 8, 20, 13), datetime.datetime(2026, 5, 30, 8, 20, 11), 'salt', 12.37, 49.4, None, 9.71, 324.1, 10.29, 832.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:20:38.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:20:38.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:20:38.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:20:11, diff=27.181497s, valid=True
2026-05-30T08:20:38.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:20:38.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:20:38.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:20:12, diff=26.184401s, valid=True
2026-05-30T08:20:38.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:20:38.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:20:38.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:20:04, diff=34.191249s, valid=True
2026-05-30T08:20:38.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:20:38.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:20:38.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:20:38.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:20:38.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:20:38.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:20:38.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:20:12, diff=26.194349s, valid=True
2026-05-30T08:20:38.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:20:38.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:20:38.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:20:38.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054680.195028s, valid=True
2026-05-30T08:20:38.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:20:38.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:20:38.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:20:38.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:20:38.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:20:38.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:20:38.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:20:38.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:20:38.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:20:38.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:20:38.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:20:38.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:20:38.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:20:38.579 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:20:38.784 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:20:39.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:20:39.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:20:39.228 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:20:39.228 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:20:39.395 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:20:39.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:21:09.426 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:21:09.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:21:09.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:21:09.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:21:09.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:21:09.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:21:09.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-05-30T08:21:09.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:21:09.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-05-30T08:21:09.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:21:09.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:21:09.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:21:09.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-05-30T08:21:12.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-05-30T08:21:12.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:21:12.438 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:21:12.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:21:12.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:21:12.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:21:12.462 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:21:12.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:21:12.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:21:12.463 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:21:12.463 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:21:12.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:21:12.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:21:12.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:21:12.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:21:12.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:21:12.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:21:12.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:21:12.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:21:12.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:21:12.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:21:12.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:21:12.740 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:21:12.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:20:43
2026-05-30T08:21:12.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74201, datetime.datetime(2026, 5, 30, 8, 20, 43), datetime.datetime(2026, 5, 30, 8, 20, 42), 'salt', 12.37, 48.93, None, 10.06, 336.66, 10.42, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:21:12.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:21:12.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:21:12.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:20:42, diff=30.807291s, valid=True
2026-05-30T08:21:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:21:12.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:21:12.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:21:12, diff=0.810484s, valid=True
2026-05-30T08:21:12.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:21:12.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:21:12.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:20:34, diff=38.818027s, valid=True
2026-05-30T08:21:12.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:21:12.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:21:12.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:21:12.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:21:12.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:21:12.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:21:12.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:21:12, diff=0.821459s, valid=True
2026-05-30T08:21:12.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:21:12.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:21:12.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:21:12.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054714.822241s, valid=True
2026-05-30T08:21:12.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:21:12.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:21:12.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:21:12.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:21:12.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:21:12.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:21:12.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:21:12.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:21:12.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:21:12.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:21:13.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:21:13.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:21:13.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:21:13.147 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:21:13.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:21:13.695 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:21:13.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:21:13.797 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:21:13.797 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:21:13.968 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:21:13.968 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:21:43.984 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:21:43.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:21:43.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:21:44.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:21:44.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:21:44.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:21:44.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-05-30T08:21:44.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:21:44.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-05-30T08:21:44.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:21:44.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:21:44.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:21:44.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-05-30T08:21:47.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-05-30T08:21:47.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:21:47.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:21:47.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:21:47.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:21:47.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:21:47.318 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:21:47.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:21:47.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:21:47.319 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:21:47.319 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:21:47.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:21:47.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:21:47.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:21:47.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:21:47.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:21:47.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:21:47.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:21:47.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:21:47.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:21:47.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:21:47.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:21:47.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:21:47.710 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:21:43
2026-05-30T08:21:47.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74203, datetime.datetime(2026, 5, 30, 8, 21, 43), datetime.datetime(2026, 5, 30, 8, 21, 43), 'salt', 12.47, 49.1, None, 14.26, 325.37, 10.38, 832.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:21:47.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:21:47.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:21:47.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:21:43, diff=4.718516s, valid=True
2026-05-30T08:21:47.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:21:47.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:21:47.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:22:12, diff=-24.277848s, valid=True
2026-05-30T08:21:47.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:21:47.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:21:47.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:21:36, diff=11.730318s, valid=True
2026-05-30T08:21:47.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:21:47.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:21:47.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:21:47.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:21:47.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:21:47.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:21:47.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:22:12, diff=-24.26584s, valid=True
2026-05-30T08:21:47.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:21:47.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:21:47.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:21:47.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054749.734993s, valid=True
2026-05-30T08:21:47.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:21:47.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:21:47.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:21:47.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:21:47.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:21:47.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:21:47.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:21:47.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:21:47.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:21:47.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:21:48.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:21:48.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:21:48.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:21:48.123 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:21:48.329 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:21:48.667 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:21:48.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:21:48.767 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:21:48.767 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:21:49.017 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:21:49.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:22:19.036 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:22:19.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:22:19.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:22:19.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:22:19.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:22:19.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:22:19.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-05-30T08:22:19.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:22:19.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-05-30T08:22:19.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:22:19.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:22:19.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:22:19.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-05-30T08:22:22.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T08:22:22.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:22:22.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:22:22.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:22:22.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:22:22.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:22:22.279 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:22:22.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:22:22.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:22:22.280 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:22:22.280 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:22:22.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:22:22.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:22:22.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:22:22.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:22:22.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:22:22.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:22:22.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:22:22.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:22:22.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:22:22.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:22:22.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:22:22.605 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:22:22.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:22:14
2026-05-30T08:22:22.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74204, datetime.datetime(2026, 5, 30, 8, 22, 14), datetime.datetime(2026, 5, 30, 8, 22, 13), 'salt', 12.47, 48.87, None, 10.94, 347.1, 10.45, 832.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:22:22.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:22:22.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:22:22.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:22:13, diff=9.675947s, valid=True
2026-05-30T08:22:22.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:22:22.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:22:22.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:22:12, diff=10.679477s, valid=True
2026-05-30T08:22:22.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:22:22.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:22:22.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:22:08, diff=14.68776s, valid=True
2026-05-30T08:22:22.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:22:22.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:22:22.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:22:22.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:22:22.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:22:22.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:22:22.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:22:12, diff=10.691503s, valid=True
2026-05-30T08:22:22.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:22:22.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:22:22.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:22:22.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054784.692337s, valid=True
2026-05-30T08:22:22.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:22:22.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:22:22.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:22:22.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:22:22.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:22:22.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:22:22.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:22:22.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:22:22.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:22:22.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:22:22.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:22:22.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:22:22.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:22:23.017 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:22:23.225 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:22:23.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:22:23.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:22:23.669 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:22:23.669 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:22:23.836 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:22:23.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:22:53.866 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:22:53.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:22:53.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:22:54.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:22:54.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:22:54.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:22:54.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-05-30T08:22:54.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:22:54.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-05-30T08:22:54.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:22:54.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:22:54.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:22:54.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-05-30T08:22:57.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-05-30T08:22:57.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:22:57.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:22:57.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:22:57.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:22:57.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:22:57.181 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:22:57.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:22:57.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:22:57.182 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:22:57.182 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:22:57.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:22:57.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:22:57.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:22:57.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:22:57.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:22:57.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:22:57.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:22:57.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:22:57.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:22:57.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:22:57.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:22:57.502 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:22:57.564 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:22:44
2026-05-30T08:22:57.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74205, datetime.datetime(2026, 5, 30, 8, 22, 44), datetime.datetime(2026, 5, 30, 8, 22, 42), 'salt', 12.5, 49.2, None, 13.37, 338.79, 10.35, 832.39, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:22:57.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:22:57.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:22:57.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:22:42, diff=15.572169s, valid=True
2026-05-30T08:22:57.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:22:57.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:22:57.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:23:12, diff=-14.424284s, valid=True
2026-05-30T08:22:57.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:22:57.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:22:57.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:22:39, diff=18.583923s, valid=True
2026-05-30T08:22:57.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:22:57.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:22:57.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:22:57.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:22:57.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:22:57.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:22:57.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:23:12, diff=-14.412312s, valid=True
2026-05-30T08:22:57.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:22:57.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:22:57.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:22:57.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054819.588491s, valid=True
2026-05-30T08:22:57.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:22:57.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:22:57.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:22:57.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:22:57.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:22:57.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:22:57.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:22:57.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:22:57.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:22:57.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:22:57.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:22:57.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:22:57.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:22:57.912 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:22:58.121 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:22:58.462 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:22:58.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:22:58.565 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:22:58.565 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:22:58.737 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:22:58.737 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:23:28.740 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:23:28.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:23:28.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:23:29.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:23:29.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:23:29.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:23:29.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-05-30T08:23:29.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:23:29.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-05-30T08:23:29.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:23:29.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:23:29.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:23:29.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-05-30T08:23:31.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-05-30T08:23:31.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:23:31.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:23:31.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:23:31.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:23:31.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:23:31.883 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:23:31.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:23:31.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:23:31.883 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:23:31.883 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:23:31.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:23:31.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:23:31.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:23:32.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:23:32.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:23:32.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:23:32.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:23:32.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:23:32.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:23:32.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:23:32.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:23:32.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:23:32.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:23:14
2026-05-30T08:23:32.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74206, datetime.datetime(2026, 5, 30, 8, 23, 14), datetime.datetime(2026, 5, 30, 8, 23, 14), 'salt', 12.5, 49.5, None, 12.88, 335.29, 10.27, 832.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:23:32.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:23:32.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:23:32.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:23:14, diff=18.218541s, valid=True
2026-05-30T08:23:32.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:23:32.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:23:32.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:23:12, diff=20.221776s, valid=True
2026-05-30T08:23:32.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:23:32.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:23:32.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:23:11, diff=21.229393s, valid=True
2026-05-30T08:23:32.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:23:32.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:23:32.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:23:32.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:23:32.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:23:32.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:23:32.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:23:12, diff=20.232856s, valid=True
2026-05-30T08:23:32.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:23:32.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:23:32.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:23:32.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054854.233604s, valid=True
2026-05-30T08:23:32.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:23:32.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:23:32.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:23:32.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:23:32.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:23:32.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:23:32.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:23:32.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:23:32.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:23:32.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:23:32.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:23:32.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:23:32.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:23:32.666 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:23:32.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:23:33.215 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:23:33.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:23:33.379 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:23:33.379 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:23:33.545 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:23:33.545 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:24:03.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:24:03.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:24:03.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:24:03.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:24:03.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:24:04.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:24:04.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-05-30T08:24:04.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:24:04.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-05-30T08:24:04.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:24:04.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:24:04.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:24:04.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-05-30T08:24:06.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-05-30T08:24:06.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:24:06.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:24:06.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:24:06.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:24:06.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:24:06.573 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:24:06.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:24:06.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:24:06.574 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:24:06.574 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:24:06.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:24:06.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:24:06.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:24:06.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:24:06.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:24:06.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:24:06.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:24:06.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:24:06.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:24:06.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:24:06.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:24:06.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:24:06.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:23:44
2026-05-30T08:24:06.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74207, datetime.datetime(2026, 5, 30, 8, 23, 44), datetime.datetime(2026, 5, 30, 8, 23, 43), 'salt', 12.5, 49.2, None, 13.37, 345.27, 10.35, 832.39, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:24:06.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:24:06.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:24:06.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:23:43, diff=23.965752s, valid=True
2026-05-30T08:24:06.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:24:06.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:24:06.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:24:12, diff=-5.030583s, valid=True
2026-05-30T08:24:06.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:24:06.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:24:06.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:23:43, diff=23.977868s, valid=True
2026-05-30T08:24:06.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:24:06.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:24:06.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:24:06.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:24:06.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:24:06.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:24:06.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:24:12, diff=-5.018333s, valid=True
2026-05-30T08:24:06.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:24:06.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:24:06.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:24:06.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054888.982485s, valid=True
2026-05-30T08:24:06.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:24:06.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:24:06.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:24:06.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:24:06.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:24:07.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:24:07.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:24:07.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:24:07.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:24:07.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:24:07.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:24:07.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:24:07.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:24:07.304 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:24:07.510 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:24:07.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:24:07.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:24:07.951 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:24:07.951 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:24:08.127 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:24:08.127 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:24:38.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:24:38.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:24:38.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:24:38.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:24:38.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:24:38.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:24:38.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-05-30T08:24:38.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:24:38.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-05-30T08:24:38.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:24:38.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:24:38.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:24:38.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-05-30T08:24: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-05-30T08:24:41.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:24:41.870 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:24:41.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:24:41.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:24:41.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:24:41.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:24:41.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:24:41.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:24:41.895 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:24:41.895 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:24:41.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:24:42.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:24:42.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:24:42.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:24:42.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:24:42.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:24:42.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:24:42.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:24:42.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:24:42.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:24:42.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:24:42.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:24:42.281 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:24:15
2026-05-30T08:24:42.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74208, datetime.datetime(2026, 5, 30, 8, 24, 15), datetime.datetime(2026, 5, 30, 8, 24, 13), 'salt', 12.44, 48.97, None, 13.09, 337.27, 10.42, 832.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:24:42.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:24:42.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:24:42.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:24:13, diff=29.288585s, valid=True
2026-05-30T08:24:42.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:24:42.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:24:42.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:24:12, diff=30.292122s, valid=True
2026-05-30T08:24:42.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:24:42.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:24:42.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:24:14, diff=28.300535s, valid=True
2026-05-30T08:24:42.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:24:42.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:24:42.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:24:42.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:24:42.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:24:42.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:24:42.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:24:12, diff=30.304292s, valid=True
2026-05-30T08:24:42.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:24:42.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:24:42.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:24:42.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054924.305094s, valid=True
2026-05-30T08:24:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:24:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:24:42.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:24:42.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:24:42.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:24:42.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:24:42.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:24:42.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:24:42.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:24:42.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:24:42.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:24:42.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:24:42.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:24:42.626 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:24:42.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:24:43.242 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:24:43.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:24:43.342 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:24:43.342 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:24:43.508 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:24:43.508 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:25:13.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:25:13.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:25:13.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:25:13.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:25:13.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:25:14.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:25:14.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T08:25:14.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:25:14.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-05-30T08:25:14.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:25:14.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:25:14.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:25: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-05-30T08:25:16.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-05-30T08:25:16.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:25:16.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:25:16.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:25:16.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:25:16.617 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:25:16.618 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:25:16.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:25:16.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:25:16.619 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:25:16.619 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:25:16.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:25:16.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:25:16.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:25:16.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:25:16.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:25:16.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:25:16.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:25:16.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:25:16.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:25:16.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:25:16.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:25:16.939 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:25:17.000 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:25:15
2026-05-30T08:25:17.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74210, datetime.datetime(2026, 5, 30, 8, 25, 15), datetime.datetime(2026, 5, 30, 8, 25, 14), 'salt', 12.57, 48.67, None, 10.06, 340.79, 10.52, 832.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:25:17.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:25:17.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:25:17.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:25:14, diff=3.008172s, valid=True
2026-05-30T08:25:17.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:25:17.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:25:17.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:25:12, diff=5.011697s, valid=True
2026-05-30T08:25:17.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:25:17.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:25:17.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:25:06, diff=11.020031s, valid=True
2026-05-30T08:25:17.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:25:17.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:25:17.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:25:17.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:25:17.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:25:17.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:25:17.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:25:12, diff=5.02379s, valid=True
2026-05-30T08:25:17.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:25:17.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:25:17.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:25:17.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054959.024603s, valid=True
2026-05-30T08:25:17.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:25:17.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:25:17.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:25:17.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:25:17.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:25:17.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:25:17.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:25:17.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:25:17.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:25:17.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:25:17.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:25:17.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:25:17.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:25:17.350 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:25:17.555 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:25:17.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:25:17.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:25:17.993 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:25:17.993 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:25:18.153 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:25:18.153 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:25:48.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:25:48.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:25:48.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:25:48.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:25:48.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:25:48.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:25:48.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T08:25:48.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:25:48.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-05-30T08:25:48.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:25:48.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:25:48.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:25:48.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-05-30T08:25:51.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-05-30T08:25:51.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:25:51.438 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:25:51.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:25:51.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:25:51.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:25:51.460 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:25:51.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:25:51.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:25:51.462 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:25:51.462 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:25:51.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:25:51.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:25:51.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:25:51.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:25:51.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:25:51.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:25:51.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:25:51.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:25:51.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:25:51.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:25:51.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:25:51.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:25:51.797 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:25:46
2026-05-30T08:25:51.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74211, datetime.datetime(2026, 5, 30, 8, 25, 46), datetime.datetime(2026, 5, 30, 8, 25, 45), 'salt', 12.4, 48.44, None, 10.98, 330.74, 10.56, 832.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:25:51.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:25:51.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:25:51.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:25:45, diff=6.804876s, valid=True
2026-05-30T08:25:51.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:25:51.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:25:51.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:26:12, diff=-20.191842s, valid=True
2026-05-30T08:25:51.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:25:51.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:25:51.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:25:38, diff=13.815674s, valid=True
2026-05-30T08:25:51.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:25:51.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:25:51.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:25:51.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:25:51.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:25:51.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:25:51.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:26:12, diff=-20.180887s, valid=True
2026-05-30T08:25:51.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:25:51.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:25:51.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:25:51.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1054993.81987s, valid=True
2026-05-30T08:25:51.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:25:51.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:25:51.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:25:51.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:25:51.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:25:51.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:25:51.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:25:51.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:25:51.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:25:51.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:25:52.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:25:52.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:25:52.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:25:52.142 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:25:52.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:25:52.753 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:25:52.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:25:52.853 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:25:52.853 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:25:53.057 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:25:53.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:26:23.063 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:26:23.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:26:23.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:26:23.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:26:23.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:26:23.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:26:23.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-05-30T08:26:23.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:26:23.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-05-30T08:26:23.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:26:23.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:26:23.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:26:23.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-05-30T08:26:26.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-05-30T08:26:26.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:26:26.461 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:26:26.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:26:26.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:26:26.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:26:26.489 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:26:26.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:26:26.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:26:26.491 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:26:26.491 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:26:26.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:26:26.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:26:26.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:26:26.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:26:26.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:26:26.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:26:26.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:26:26.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:26:26.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:26:26.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:26:26.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:26:26.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:26:26.872 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:26:16
2026-05-30T08:26:26.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74212, datetime.datetime(2026, 5, 30, 8, 26, 16), datetime.datetime(2026, 5, 30, 8, 26, 15), 'salt', 12.57, 47.97, None, 11.61, 335.81, 10.72, 832.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:26:26.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:26:26.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:26:26.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:26:15, diff=11.879957s, valid=True
2026-05-30T08:26:26.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:26:26.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:26:26.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:26:12, diff=14.88338s, valid=True
2026-05-30T08:26:26.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:26:26.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:26:26.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:26:09, diff=17.891654s, valid=True
2026-05-30T08:26:26.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:26:26.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:26:26.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:26:26.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:26:26.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:26:26.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:26:26.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:26:12, diff=14.89541s, valid=True
2026-05-30T08:26:26.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:26:26.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:26:26.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:26:26.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055028.896217s, valid=True
2026-05-30T08:26:26.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:26:26.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:26:26.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:26:26.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:26:26.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:26:26.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:26:26.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:26:26.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:26:26.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:26:27.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:26:27.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:26:27.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:26:27.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:26:27.217 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:26:27.422 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:26:27.760 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:26:27.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:26:27.862 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:26:27.862 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:26:28.118 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:26:28.119 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:26:58.135 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:26:58.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:26:58.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:26:58.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:26:58.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:26:58.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:26:58.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-05-30T08:26:58.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:26:58.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-05-30T08:26:58.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:26:58.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:26:58.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:26:58.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-05-30T08:27:00.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-05-30T08:27:00.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:27:00.966 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:27:00.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:27:00.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:27:00.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:27:00.990 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:27:00.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:27:00.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:27:00.991 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:27:00.991 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:27:00.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:27:01.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:27:01.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:27:01.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:27:01.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:27:01.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:27:01.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:27:01.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:27:01.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:27:01.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:27:01.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:27:01.313 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:27:01.375 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:26:46
2026-05-30T08:27:01.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74213, datetime.datetime(2026, 5, 30, 8, 26, 46), datetime.datetime(2026, 5, 30, 8, 26, 46), 'salt', 12.6, 47.51, None, 10.31, 1.81, 10.85, 832.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:27:01.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:27:01.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:27:01.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:26:46, diff=15.383394s, valid=True
2026-05-30T08:27:01.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:27:01.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:27:01.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:27:12, diff=-10.612988s, valid=True
2026-05-30T08:27:01.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:27:01.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:27:01.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:26:41, diff=20.395343s, valid=True
2026-05-30T08:27:01.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:27:01.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:27:01.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:27:01.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:27:01.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:27:01.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:27:01.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:27:12, diff=-10.600811s, valid=True
2026-05-30T08:27:01.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:27:01.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:27:01.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:27:01.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055063.400029s, valid=True
2026-05-30T08:27:01.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:27:01.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:27:01.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:27:01.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:27:01.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:27:01.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:27:01.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:27:01.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:27:01.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:27:01.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:27:01.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:27:01.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:27:01.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:27:01.747 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:27:02.067 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:27:02.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:27:02.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:27:02.506 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:27:02.506 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:27:02.677 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:27:02.677 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:27:32.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:27:32.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:27:32.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:27:33.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:27:33.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:27:33.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:27:33.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-05-30T08:27:33.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:27:33.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-05-30T08:27:33.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:27:33.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:27:33.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:27:33.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-05-30T08:27:35.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-05-30T08:27:35.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:27:35.759 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:27:35.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:27:35.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:27:35.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:27:35.782 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:27:35.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:27:35.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:27:35.783 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:27:35.783 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:27:35.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:27:35.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:27:35.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:27:36.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:27:36.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:27:36.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:27:36.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:27:36.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:27:36.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:27:36.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:27:36.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:27:36.099 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:27:36.162 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:27:17
2026-05-30T08:27:36.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74214, datetime.datetime(2026, 5, 30, 8, 27, 17), datetime.datetime(2026, 5, 30, 8, 27, 16), 'salt', 12.64, 47.31, None, 9.81, 332.76, 10.92, 832.39, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:27:36.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:27:36.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:27:36.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:27:16, diff=20.170428s, valid=True
2026-05-30T08:27:36.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:27:36.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:27:36.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:27:12, diff=24.17397s, valid=True
2026-05-30T08:27:36.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:27:36.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:27:36.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:27:12, diff=24.182454s, valid=True
2026-05-30T08:27:36.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:27:36.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:27:36.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:27:36.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:27:36.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:27:36.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:27:36.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:27:12, diff=24.186242s, valid=True
2026-05-30T08:27:36.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:27:36.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:27:36.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:27:36.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055098.187082s, valid=True
2026-05-30T08:27:36.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:27:36.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:27:36.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:27:36.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:27:36.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:27:36.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:27:36.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:27:36.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:27:36.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:27:36.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:27:36.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:27:36.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:27:36.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:27:36.510 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:27:36.715 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:27:37.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:27:37.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:27:37.158 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:27:37.158 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:27:37.328 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:27:37.328 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:28:07.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:28:07.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:28:07.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:28:07.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:28:07.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:28:07.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:28:07.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-05-30T08:28:07.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:28:07.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-05-30T08:28:07.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:28:07.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:28:07.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:28:07.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-05-30T08:28:10.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-05-30T08:28:10.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:28:10.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:28:10.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:28:10.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:28:10.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:28:10.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:28:10.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:28:10.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:28:10.330 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:28:10.330 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:28:10.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:28:10.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:28:10.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:28:10.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:28:10.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:28:10.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:28:10.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:28:10.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:28:10.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:28:10.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:28:10.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:28:10.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:28:10.711 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:27:47
2026-05-30T08:28:10.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74215, datetime.datetime(2026, 5, 30, 8, 27, 47), datetime.datetime(2026, 5, 30, 8, 27, 46), 'salt', 12.77, 47.31, None, 10.34, 322.4, 10.93, 832.39, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:28:10.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:28:10.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:28:10.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:27:46, diff=24.718784s, valid=True
2026-05-30T08:28:10.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:28:10.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:28:10.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:28:12, diff=-1.277693s, valid=True
2026-05-30T08:28:10.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:28:10.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:28:10.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:27:43, diff=27.730658s, valid=True
2026-05-30T08:28:10.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:28:10.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:28:10.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:28:10.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:28:10.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:28:10.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:28:10.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:28:12, diff=-1.265556s, valid=True
2026-05-30T08:28:10.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:28:10.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:28:10.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:28:10.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055132.735284s, valid=True
2026-05-30T08:28:10.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:28:10.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:28:10.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:28:10.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:28:10.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:28:10.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:28:10.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:28:10.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:28:10.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:28:10.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:28:10.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:28:11.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:28:11.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:28:11.133 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:28:11.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:28:11.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:28:11.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:28:11.783 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:28:11.783 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:28:11.950 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:28:11.951 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:28:41.981 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:28:41.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:28:41.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:28:42.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:28:42.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:28:42.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:28:42.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-05-30T08:28:42.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:28:42.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-05-30T08:28:42.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:28:42.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:28:42.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:28:42.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-05-30T08:28: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-05-30T08:28:44.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:28:44.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:28:44.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:28:44.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:28:44.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:28:44.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:28:44.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:28:44.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:28:44.824 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:28:44.824 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:28:44.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:28:44.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:28:44.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:28:45.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:28:45.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:28:45.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:28:45.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:28:45.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:28:45.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:28:45.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:28:45.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:28:45.153 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:28:45.215 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:28:17
2026-05-30T08:28:45.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74216, datetime.datetime(2026, 5, 30, 8, 28, 17), datetime.datetime(2026, 5, 30, 8, 28, 16), 'salt', 12.8, 47.18, None, 9.35, 323.22, 10.97, 832.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:28:45.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:28:45.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:28:45.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:28:16, diff=29.222744s, valid=True
2026-05-30T08:28:45.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:28:45.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:28:45.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:28:12, diff=33.226285s, valid=True
2026-05-30T08:28:45.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:28:45.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:28:45.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:28:15, diff=30.234587s, valid=True
2026-05-30T08:28:45.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:28:45.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:28:45.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:28:45.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:28:45.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:28:45.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:28:45.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:28:12, diff=33.238359s, valid=True
2026-05-30T08:28:45.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:28:45.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:28:45.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:28:45.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055167.239197s, valid=True
2026-05-30T08:28:45.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:28:45.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:28:45.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:28:45.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:28:45.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:28:45.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:28:45.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:28:45.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:28:45.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:28:45.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:28:45.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:28:45.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:28:45.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:28:45.577 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:28:45.787 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:28:46.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:28:46.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:28:46.227 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:28:46.227 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:28:46.393 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:28:46.393 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:29:16.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:29:16.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:29:16.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:29:16.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:29:16.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:29:16.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:29:16.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-05-30T08:29:16.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:29:16.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-05-30T08:29:16.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:29:16.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:29:16.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:29:16.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-05-30T08:29:19.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-05-30T08:29:19.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:29:19.432 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:29:19.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:29:19.441 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:29:19.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:29:19.455 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:29:19.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:29:19.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:29:19.456 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:29:19.456 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:29:19.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:29:19.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:29:19.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:29:19.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:29:19.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:29:19.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:29:19.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:29:19.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:29:19.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:29:19.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:29:19.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:29:19.787 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:29:19.848 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:29:18
2026-05-30T08:29:19.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74218, datetime.datetime(2026, 5, 30, 8, 29, 18), datetime.datetime(2026, 5, 30, 8, 29, 17), 'salt', 13.0, 46.61, None, 12.56, 343.01, 11.15, 832.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:29:19.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:29:19.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:29:19.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:29:17, diff=2.855721s, valid=True
2026-05-30T08:29:19.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:29:19.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:29:19.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:29:12, diff=7.859086s, valid=True
2026-05-30T08:29:19.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:29:19.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:29:19.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:29:08, diff=11.866856s, valid=True
2026-05-30T08:29:19.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:29:19.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:29:19.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:29:19.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:29:19.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:29:19.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:29:19.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:29:12, diff=7.870308s, valid=True
2026-05-30T08:29:19.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:29:19.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:29:19.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:29:19.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055201.871012s, valid=True
2026-05-30T08:29:19.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:29:19.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:29:19.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:29:19.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:29:19.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:29:19.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:29:19.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:29:19.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:29:19.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:29:20.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:29:20.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:29:20.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:29:20.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:29:20.271 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:29:20.477 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:29:20.815 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:29:20.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:29:20.915 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:29:20.915 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:29:21.160 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:29:21.160 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:29:51.176 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:29:51.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:29:51.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:29:51.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:29:51.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:29:51.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:29:51.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-05-30T08:29:51.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:29:51.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-05-30T08:29:51.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:29:51.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:29:51.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:29:51.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-05-30T08:29:54.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-05-30T08:29:54.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:29:54.473 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:29:54.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:29:54.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:29:54.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:29:54.497 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:29:54.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:29:54.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:29:54.498 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:29:54.499 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:29:54.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:29:54.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:29:54.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:29:54.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:29:54.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:29:54.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:29:54.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:29:54.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:29:54.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:29:54.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:29:54.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:29:54.821 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:29:54.886 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:29:48
2026-05-30T08:29:54.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74219, datetime.datetime(2026, 5, 30, 8, 29, 48), datetime.datetime(2026, 5, 30, 8, 29, 47), 'salt', 12.87, 46.64, None, 9.74, 346.74, 11.14, 832.39, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:29:54.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:29:54.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:29:54.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:29:47, diff=7.893921s, valid=True
2026-05-30T08:29:54.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:29:54.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:29:54.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:30:12, diff=-17.101445s, valid=True
2026-05-30T08:29:54.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:29:54.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:29:54.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:29:39, diff=15.907647s, valid=True
2026-05-30T08:29:54.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:29:54.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:29:54.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:29:54.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:29:54.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:29:54.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:29:54.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:30:12, diff=-17.088466s, valid=True
2026-05-30T08:29:54.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:29:54.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:29:54.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:29:54.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055236.912401s, valid=True
2026-05-30T08:29:54.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:29:54.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:29:54.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:29:54.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:29:54.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:29:54.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:29:54.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:29:54.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:29:54.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:29:55.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:29:55.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:29:55.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:29:55.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:29:55.233 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:29:55.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:29:55.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:29:55.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:29:55.877 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:29:55.877 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:29:56.094 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:29:56.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:30:26.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:30:26.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:30:26.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:30:26.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:30:26.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:30:26.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:30:26.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-05-30T08:30:26.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:30:26.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-05-30T08:30:26.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:30:26.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:30:26.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:30:26.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-05-30T08:30:29.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-05-30T08:30:29.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:30:29.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:30:29.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:30:29.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:30:29.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:30:29.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:30:29.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:30:29.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:30:29.325 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:30:29.325 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:30:29.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:30:29.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:30:29.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:30:29.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:30:29.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:30:29.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:30:29.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:30:29.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:30:29.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:30:29.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:30:29.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:30:29.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:30:29.761 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:30:18
2026-05-30T08:30:29.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74220, datetime.datetime(2026, 5, 30, 8, 30, 18), datetime.datetime(2026, 5, 30, 8, 30, 17), 'salt', 13.0, 46.81, None, 12.28, 344.18, 11.1, 832.39, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:30:29.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:30:29.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:30:29.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:30:17, diff=12.767713s, valid=True
2026-05-30T08:30:29.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:30:29.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:30:29.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:30:12, diff=17.770509s, valid=True
2026-05-30T08:30:29.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:30:29.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:30:29.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:30:10, diff=19.777095s, valid=True
2026-05-30T08:30:29.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:30:29.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:30:29.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:30:29.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:30:29.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:30:29.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:30:29.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:30:12, diff=17.780093s, valid=True
2026-05-30T08:30:29.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:30:29.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:30:29.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:30:29.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055271.780774s, valid=True
2026-05-30T08:30:29.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:30:29.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:30:29.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:30:29.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:30:29.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:30:29.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:30:29.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:30:29.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:30:29.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:30:29.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:30:29.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:30:30.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:30:30.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:30:30.114 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:30:30.323 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:30:30.662 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:30:30.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:30:30.763 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:30:30.763 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:30:30.924 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:30:30.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:31:00.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:31:00.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:31:00.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:31:01.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:31:01.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:31:01.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:31:01.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T08:31:01.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:31:01.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-05-30T08:31:01.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:31:01.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:31:01.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:31:01.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-05-30T08:31:04.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-05-30T08:31:04.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:31:04.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:31:04.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:31:04.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:31:04.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:31:04.218 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:31:04.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:31:04.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:31:04.219 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:31:04.219 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:31:04.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:31:04.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:31:04.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:31:04.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:31:04.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:31:04.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:31:04.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:31:04.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:31:04.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:31:04.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:31:04.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:31:04.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:31:04.596 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:30:48
2026-05-30T08:31:04.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74221, datetime.datetime(2026, 5, 30, 8, 30, 48), datetime.datetime(2026, 5, 30, 8, 30, 47), 'salt', 12.93, 45.32, None, 10.62, 352.7, 11.54, 832.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:31:04.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:31:04.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:31:04.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:30:47, diff=17.604091s, valid=True
2026-05-30T08:31:04.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:31:04.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:31:04.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:31:12, diff=-7.392463s, valid=True
2026-05-30T08:31:04.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:31:04.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:31:04.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:30:41, diff=23.61574s, valid=True
2026-05-30T08:31:04.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:31:04.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:31:04.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:31:04.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:31:04.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:31:04.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:31:04.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:31:12, diff=-7.380579s, valid=True
2026-05-30T08:31:04.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:31:04.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:31:04.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:31:04.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055306.620236s, valid=True
2026-05-30T08:31:04.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:31:04.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:31:04.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:31:04.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:31:04.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:31:04.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:31:04.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:31:04.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:31:04.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:31:04.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:31:04.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:31:04.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:31:04.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:31:04.948 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:31:05.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:31:05.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:31:05.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:31:05.603 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:31:05.603 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:31:05.763 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:31:05.763 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:31:35.793 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:31:35.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:31:35.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:31:36.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:31:36.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:31:36.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:31:36.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-05-30T08:31:36.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:31:36.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-05-30T08:31:36.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:31:36.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:31:36.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:31:36.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-05-30T08:31:39.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-05-30T08:31:39.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:31:39.150 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:31:39.150 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:31:39.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:31:39.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:31:39.171 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:31:39.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:31:39.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:31:39.171 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:31:39.172 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:31:39.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:31:39.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:31:39.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:31:39.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:31:39.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:31:39.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:31:39.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:31:39.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:31:39.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:31:39.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:31:39.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:31:39.496 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:31:39.562 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:31:19
2026-05-30T08:31:39.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74222, datetime.datetime(2026, 5, 30, 8, 31, 19), datetime.datetime(2026, 5, 30, 8, 31, 18), 'salt', 13.0, 45.42, None, 11.96, 342.14, 11.52, 832.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:31:39.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:31:39.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:31:39.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:31:18, diff=21.569921s, valid=True
2026-05-30T08:31:39.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:31:39.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:31:39.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:31:12, diff=27.573453s, valid=True
2026-05-30T08:31:39.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:31:39.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:31:39.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:31:13, diff=26.581657s, valid=True
2026-05-30T08:31:39.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:31:39.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:31:39.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:31:39.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:31:39.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:31:39.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:31:39.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:31:12, diff=27.585436s, valid=True
2026-05-30T08:31:39.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:31:39.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:31:39.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:31:39.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055341.586267s, valid=True
2026-05-30T08:31:39.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:31:39.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:31:39.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:31:39.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:31:39.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:31:39.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:31:39.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:31:39.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:31:39.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:31:39.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:31:39.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:31:39.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:31:39.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:31:39.915 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:31:40.137 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:31:40.477 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:31:40.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:31:40.576 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:31:40.576 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:31:40.852 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:31:40.852 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:32:10.853 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:32:10.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:32:10.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:32:11.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:32:11.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:32:11.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:32:11.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-05-30T08:32:11.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:32:11.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-05-30T08:32:11.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:32:11.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:32:11.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:32:11.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-05-30T08:32:13.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-05-30T08:32:13.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:32:13.786 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:32:13.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:32:13.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:32:13.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:32:13.810 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:32:13.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:32:13.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:32:13.811 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:32:13.811 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:32:13.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:32:13.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:32:13.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:32:14.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:32:14.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:32:14.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:32:14.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:32:14.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:32:14.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:32:14.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:32:14.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:32:14.134 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:32:14.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:31:49
2026-05-30T08:32:14.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74223, datetime.datetime(2026, 5, 30, 8, 31, 49), datetime.datetime(2026, 5, 30, 8, 31, 48), 'salt', 12.97, 44.69, None, 12.7, 343.36, 11.74, 832.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:32:14.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:32:14.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:32:14.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:31:48, diff=26.203986s, valid=True
2026-05-30T08:32:14.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:32:14.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:32:14.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:32:12, diff=2.207474s, valid=True
2026-05-30T08:32:14.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:32:14.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:32:14.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:31:44, diff=30.215634s, valid=True
2026-05-30T08:32:14.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:32:14.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:32:14.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:32:14.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:32:14.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:32:14.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:32:14.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:32:12, diff=2.219349s, valid=True
2026-05-30T08:32:14.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:32:14.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:32:14.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:32:14.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055376.220179s, valid=True
2026-05-30T08:32:14.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:32:14.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:32:14.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:32:14.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:32:14.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:32:14.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:32:14.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:32:14.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:32:14.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:32:14.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:32:14.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:32:14.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:32:14.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:32:14.544 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:32:14.751 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:32:15.149 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:32:15.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:32:15.250 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:32:15.251 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:32:15.422 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:32:15.423 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:32:45.453 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:32:45.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:32:45.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:32:45.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:32:45.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:32:45.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:32:45.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-05-30T08:32:45.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:32:45.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T08:32:45.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:32:45.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:32:45.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:32:45.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-05-30T08:32:48.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-05-30T08:32:48.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:32:48.356 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:32:48.357 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:32:48.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:32:48.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:32:48.380 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:32:48.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:32:48.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:32:48.381 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:32:48.381 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:32:48.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:32:48.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:32:48.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:32:48.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:32:48.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:32:48.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:32:48.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:32:48.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:32:48.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:32:48.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:32:48.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:32:48.707 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:32:48.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:32:20
2026-05-30T08:32:48.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74224, datetime.datetime(2026, 5, 30, 8, 32, 20), datetime.datetime(2026, 5, 30, 8, 32, 19), 'salt', 13.07, 44.92, None, 13.27, 331.67, 11.68, 832.45, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:32:48.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:32:48.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:32:48.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:32:19, diff=29.778159s, valid=True
2026-05-30T08:32:48.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:32:48.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:32:48.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:32:12, diff=36.781739s, valid=True
2026-05-30T08:32:48.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:32:48.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:32:48.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:32:16, diff=32.79015s, valid=True
2026-05-30T08:32:48.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:32:48.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:32:48.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:32:48.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:32:48.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:32:48.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:32:48.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:32:12, diff=36.793963s, valid=True
2026-05-30T08:32:48.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:32:48.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:32:48.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:32:48.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055410.794802s, valid=True
2026-05-30T08:32:48.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:32:48.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:32:48.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:32:48.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:32:48.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:32:48.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:32:48.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:32:48.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:32:48.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:32:48.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:32:48.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:32:49.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:32:49.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:32:49.120 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:32:49.328 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:32:49.678 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:32:49.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:32:49.788 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:32:49.789 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:32:49.954 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:32:49.955 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:33:19.985 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:33:19.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:33:19.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:33:20.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:33:20.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:33:20.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:33:20.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-05-30T08:33:20.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:33:20.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-05-30T08:33:20.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:33:20.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:33:20.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:33:20.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-05-30T08:33:23.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-05-30T08:33:23.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:33:23.074 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:33:23.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:33:23.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:33:23.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:33:23.101 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:33:23.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:33:23.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:33:23.102 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:33:23.102 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:33:23.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:33:23.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:33:23.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:33:23.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:33:23.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:33:23.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:33:23.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:33:23.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:33:23.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:33:23.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:33:23.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:33:23.428 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:33:23.491 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:33:20
2026-05-30T08:33:23.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74226, datetime.datetime(2026, 5, 30, 8, 33, 20), datetime.datetime(2026, 5, 30, 8, 33, 19), 'salt', 13.03, 43.16, None, 13.09, 333.1, 12.23, 832.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:33:23.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:33:23.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:33:23.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:33:19, diff=4.49945s, valid=True
2026-05-30T08:33:23.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:33:23.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:33:23.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:33:12, diff=11.503003s, valid=True
2026-05-30T08:33:23.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:33:23.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:33:23.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:33:19, diff=4.511413s, valid=True
2026-05-30T08:33:23.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:33:23.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:33:23.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:33:23.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:33:23.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:33:23.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:33:23.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:33:12, diff=11.515179s, valid=True
2026-05-30T08:33:23.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:33:23.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:33:23.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:33:23.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055445.516013s, valid=True
2026-05-30T08:33:23.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:33:23.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:33:23.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:33:23.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:33:23.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:33:23.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:33:23.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:33:23.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:33:23.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:33:23.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:33:23.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:33:23.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:33:23.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:33:23.843 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:33:24.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:33:24.472 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:33:24.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:33:24.574 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:33:24.574 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:33:24.852 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:33:24.852 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:33:54.861 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:33:54.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:33:54.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:33:55.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:33:55.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:33:55.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:33:55.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-05-30T08:33:55.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:33:55.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-05-30T08:33:55.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:33:55.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:33:55.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:33:55.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-05-30T08:33:57.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-05-30T08:33:57.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:33:57.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:33:57.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:33:57.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:33:58.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:33:58.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:33:58.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:33:58.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:33:58.013 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:33:58.014 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:33:58.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:33:58.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:33:58.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:33:58.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:33:58.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:33:58.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:33:58.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:33:58.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:33:58.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:33:58.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:33:58.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:33:58.337 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:33:58.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:33:50
2026-05-30T08:33:58.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74227, datetime.datetime(2026, 5, 30, 8, 33, 50), datetime.datetime(2026, 5, 30, 8, 33, 49), 'salt', 13.07, 42.6, None, 9.78, 335.4, 12.42, 832.45, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:33:58.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:33:58.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:33:58.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:33:49, diff=9.406559s, valid=True
2026-05-30T08:33:58.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:33:58.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:33:58.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:34:12, diff=-13.589912s, valid=True
2026-05-30T08:33:58.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:33:58.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:33:58.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:33:40, diff=18.418418s, valid=True
2026-05-30T08:33:58.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:33:58.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:33:58.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:33:58.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:33:58.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:33:58.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:33:58.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:34:12, diff=-13.577825s, valid=True
2026-05-30T08:33:58.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:33:58.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:33:58.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:33:58.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055480.423007s, valid=True
2026-05-30T08:33:58.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:33:58.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:33:58.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:33:58.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:33:58.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:33:58.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:33:58.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:33:58.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:33:58.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:33:58.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:33:58.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:33:58.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:33:58.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:33:58.746 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:33:58.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:33:59.290 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:33:59.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:33:59.389 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:33:59.389 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:33:59.649 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:33:59.649 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:34:29.679 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:34:29.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:34:29.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:34:30.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:34:30.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:34:30.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:34:30.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-05-30T08:34:30.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:34:30.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-05-30T08:34:30.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:34:30.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:34:30.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:34:30.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-05-30T08:34:32.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-05-30T08:34:32.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:34:32.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:34:32.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:34:32.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:34:32.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:34:32.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:34:32.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:34:32.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:34:32.725 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:34:32.725 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:34:32.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:34:32.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:34:32.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:34:32.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:34:32.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:34:33.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:34:33.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:34:33.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:34:33.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:34:33.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:34:33.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:34:33.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:34:33.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:34:20
2026-05-30T08:34:33.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74228, datetime.datetime(2026, 5, 30, 8, 34, 20), datetime.datetime(2026, 5, 30, 8, 34, 20), 'salt', 13.1, 42.43, None, 13.09, 0.97, 12.47, 832.45, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:34:33.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:34:33.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:34:33.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:34:20, diff=13.117479s, valid=True
2026-05-30T08:34:33.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:34:33.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:34:33.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:34:12, diff=21.120911s, valid=True
2026-05-30T08:34:33.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:34:33.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:34:33.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:34:11, diff=22.128929s, valid=True
2026-05-30T08:34:33.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:34:33.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:34:33.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:34:33.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:34:33.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:34:33.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:34:33.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:34:12, diff=21.132583s, valid=True
2026-05-30T08:34:33.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:34:33.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:34:33.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:34:33.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055515.133377s, valid=True
2026-05-30T08:34:33.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:34:33.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:34:33.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:34:33.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:34:33.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:34:33.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:34:33.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:34:33.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:34:33.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:34:33.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:34:33.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:34:33.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:34:33.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:34:33.462 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:34:33.738 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:34:34.076 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:34:34.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:34:34.177 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:34:34.177 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:34:34.344 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:34:34.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:35:04.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:35:04.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:35:04.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:35:04.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:35:04.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:35:04.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:35:04.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-05-30T08:35:04.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:35:04.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-05-30T08:35:04.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:35:04.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:35:04.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:35:04.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T08:35:07.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-05-30T08:35:07.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:35:07.226 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:35:07.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:35:07.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:35:07.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:35:07.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:35:07.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:35:07.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:35:07.253 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:35:07.253 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:35:07.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:35:07.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:35:07.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:35:07.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:35:07.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:35:07.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:35:07.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:35:07.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:35:07.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:35:07.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:35:07.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:35:07.580 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:35:07.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:34:51
2026-05-30T08:35:07.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74229, datetime.datetime(2026, 5, 30, 8, 34, 51), datetime.datetime(2026, 5, 30, 8, 34, 50), 'salt', 13.13, 42.53, None, 13.2, 3.2, 12.44, 832.45, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:35:07.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:35:07.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:35:07.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:34:50, diff=17.651398s, valid=True
2026-05-30T08:35:07.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:35:07.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:35:07.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:35:12, diff=-4.345043s, valid=True
2026-05-30T08:35:07.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:35:07.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:35:07.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:34:43, diff=24.663317s, valid=True
2026-05-30T08:35:07.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:35:07.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:35:07.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:35:07.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:35:07.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:35:07.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:35:07.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:35:12, diff=-4.332862s, valid=True
2026-05-30T08:35:07.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:35:07.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:35:07.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:35:07.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055549.667977s, valid=True
2026-05-30T08:35:07.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:35:07.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:35:07.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:35:07.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:35:07.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:35:07.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:35:07.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:35:07.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:35:07.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:35:07.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:35:07.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:35:07.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:35:07.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:35:07.998 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:35:08.208 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:35:08.548 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:35:08.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:35: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-05-30T08:35: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-05-30T08:35:08.890 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:35:08.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:35:38.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:35:38.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:35:38.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:35:39.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:35:39.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:35:39.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:35:39.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-05-30T08:35:39.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:35:39.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-05-30T08:35:39.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:35:39.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:35:39.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:35:39.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-05-30T08:35:41.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T08:35:41.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:35:41.878 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:35:41.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:35:41.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:35:41.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:35:41.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:35:41.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:35:41.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:35:41.904 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:35:41.904 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:35:41.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:35:42.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:35:42.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:35:42.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:35:42.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:35:42.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:35:42.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:35:42.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:35:42.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:35:42.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:35:42.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:35:42.227 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:35:42.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:35:21
2026-05-30T08:35:42.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74230, datetime.datetime(2026, 5, 30, 8, 35, 21), datetime.datetime(2026, 5, 30, 8, 35, 20), 'salt', 13.2, 41.97, None, 13.97, 343.97, 12.64, 832.45, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:35:42.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:35:42.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:35:42.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:35:20, diff=22.298803s, valid=True
2026-05-30T08:35:42.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:35:42.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:35:42.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:35:12, diff=30.302368s, valid=True
2026-05-30T08:35:42.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:35:42.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:35:42.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:35:21, diff=21.310782s, valid=True
2026-05-30T08:35:42.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:35:42.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:35:42.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:35:42.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:35:42.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:35:42.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:35:42.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:35:12, diff=30.314587s, valid=True
2026-05-30T08:35:42.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:35:42.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:35:42.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:35:42.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055584.315418s, valid=True
2026-05-30T08:35:42.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:35:42.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:35:42.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:35:42.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:35:42.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:35:42.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:35:42.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:35:42.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:35:42.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:35:42.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:35:42.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:35:42.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:35:42.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:35:42.716 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:35:42.920 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:35:43.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:35:43.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:35:43.362 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:35:43.362 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:35:43.530 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:35:43.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:36:13.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:36:13.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:36:13.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:36:13.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:36:13.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:36:14.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:36:14.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-05-30T08:36:14.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:36: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-05-30T08:36:14.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:36:14.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:36:14.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:36:14.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-05-30T08:36:16.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-05-30T08:36:16.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:36:16.707 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:36:16.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:36:16.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:36:16.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:36:16.731 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:36:16.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:36:16.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:36:16.732 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:36:16.732 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:36:16.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:36:16.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:36:16.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:36:16.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:36:16.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:36:17.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:36:17.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:36:17.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:36:17.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:36:17.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:36:17.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:36:17.075 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:36:17.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:35:51
2026-05-30T08:36:17.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74231, datetime.datetime(2026, 5, 30, 8, 35, 51), datetime.datetime(2026, 5, 30, 8, 35, 50), 'salt', 13.26, 41.57, None, 13.73, 351.26, 12.77, 832.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:36:17.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:36:17.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:36:17.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:35:50, diff=27.148419s, valid=True
2026-05-30T08:36:17.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:36:17.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:36:17.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:36:12, diff=5.15553s, valid=True
2026-05-30T08:36:17.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:36:17.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:36:17.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:35:51, diff=26.164396s, valid=True
2026-05-30T08:36:17.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:36:17.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:36:17.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:36:17.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:36:17.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:36:17.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:36:17.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:36:12, diff=5.168185s, valid=True
2026-05-30T08:36:17.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:36:17.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:36:17.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:36:17.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055619.169015s, valid=True
2026-05-30T08:36:17.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:36:17.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:36:17.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:36:17.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:36:17.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:36:17.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:36:17.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:36:17.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:36:17.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:36:17.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:36:17.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:36:17.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:36:17.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:36:17.512 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:36:17.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:36:18.099 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:36:18.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:36:18.201 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:36:18.201 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:36:18.371 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:36:18.371 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:36:48.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:36:48.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:36:48.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:36:48.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:36:48.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:36:48.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:36:48.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-05-30T08:36:48.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:36:48.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-05-30T08:36:48.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:36:48.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:36:48.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:36:48.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-05-30T08:36:51.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-05-30T08:36:51.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:36:51.623 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:36:51.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:36:51.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:36:51.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:36:51.648 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:36:51.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:36:51.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:36:51.649 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:36:51.649 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:36:51.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:36:51.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:36:51.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:36:51.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:36:51.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:36:51.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:36:51.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:36:51.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:36:51.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:36:51.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:36:51.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:36:51.975 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:36:52.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:36:52
2026-05-30T08:36:52.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74233, datetime.datetime(2026, 5, 30, 8, 36, 52), datetime.datetime(2026, 5, 30, 8, 36, 51), 'salt', 13.26, 41.6, None, 13.94, 6.3, 12.76, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:36:52.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:36:52.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:36:52.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:36:51, diff=1.044768s, valid=True
2026-05-30T08:36:52.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:36:52.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:36:52.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:37:12, diff=-19.952266s, valid=True
2026-05-30T08:36:52.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:36:52.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:36:52.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:36:51, diff=1.054586s, valid=True
2026-05-30T08:36:52.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:36:52.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:36:52.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:36:52.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:36:52.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:36:52.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:36:52.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:37:12, diff=-19.942214s, valid=True
2026-05-30T08:36:52.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:36:52.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:36:52.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:36:52.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055654.058474s, valid=True
2026-05-30T08:36:52.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:36:52.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:36:52.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:36:52.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:36:52.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:36:52.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:36:52.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:36:52.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:36:52.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:36:52.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:36:52.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:36:52.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:36:52.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:36:52.537 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:36:52.750 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:36:53.092 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:36:53.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:36:53.195 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:36:53.195 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:36:53.394 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:36:53.394 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:37:23.424 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:37:23.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:37:23.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:37:23.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:37:23.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:37:24.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:37:24.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-05-30T08:37:24.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:37:24.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-05-30T08:37:24.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:37:24.117 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:37:24.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:37:24.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-05-30T08:37:26.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-05-30T08:37:26.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:37:26.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:37:26.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:37:26.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:37:26.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:37:26.590 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:37:26.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:37:26.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:37:26.591 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:37:26.591 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:37:26.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:37:26.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:37:26.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:37:26.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:37:26.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:37:26.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:37:26.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:37:26.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:37:26.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:37:26.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:37:26.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:37:26.899 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:37:26.971 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:37:22
2026-05-30T08:37:26.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74234, datetime.datetime(2026, 5, 30, 8, 37, 22), datetime.datetime(2026, 5, 30, 8, 37, 22), 'salt', 13.3, 41.67, None, 12.03, 352.55, 12.74, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:37:26.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:37:26.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:37:26.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:37:22, diff=4.978712s, valid=True
2026-05-30T08:37:26.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:37:26.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:37:26.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:37:12, diff=14.982163s, valid=True
2026-05-30T08:37:26.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:37:26.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:37:26.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:37:22, diff=4.990334s, valid=True
2026-05-30T08:37:26.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:37:26.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:37:26.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:37:26.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:37:26.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:37:26.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:37:26.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:37:12, diff=14.99403s, valid=True
2026-05-30T08:37:26.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:37:26.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:37:26.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:37:26.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055688.994831s, valid=True
2026-05-30T08:37:26.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:37:26.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:37:26.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:37:26.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:37:26.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:37:27.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:37:27.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:37:27.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:37:27.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:37:27.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:37:27.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:37:27.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:37:27.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:37:27.320 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:37:27.516 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:37:27.845 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:37:27.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:37:27.943 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:37:27.943 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:37:28.110 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:37:28.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:37:58.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:37:58.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:37:58.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:37:58.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:37:58.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:37:58.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:37:58.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-05-30T08:37:58.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:37:58.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-05-30T08:37:58.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:37:58.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:37:58.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:37:58.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-05-30T08:38:00.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-05-30T08:38:00.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:38:00.933 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:38:00.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:38:00.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:38:00.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:38:00.956 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:38:00.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:38:00.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:38:00.956 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:38:00.956 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:38:00.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:38:01.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:38:01.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:38:01.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:38:01.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:38:01.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:38:01.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:38:01.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:38:01.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:38:01.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:38:01.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:38:01.288 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:38:01.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:37:52
2026-05-30T08:38:01.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74235, datetime.datetime(2026, 5, 30, 8, 37, 52), datetime.datetime(2026, 5, 30, 8, 37, 51), 'salt', 13.3, 41.97, None, 12.85, 355.35, 12.65, 832.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:38:01.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:38:01.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:38:01.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:37:51, diff=10.355608s, valid=True
2026-05-30T08:38:01.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:38:01.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:38:01.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:38:12, diff=-10.641586s, valid=True
2026-05-30T08:38:01.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:38:01.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:38:01.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:37:52, diff=9.36575s, valid=True
2026-05-30T08:38:01.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:38:01.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:38:01.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:38:01.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:38:01.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:38:01.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:38:01.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:38:12, diff=-10.627419s, valid=True
2026-05-30T08:38:01.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:38:01.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:38:01.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:38:01.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055723.374024s, valid=True
2026-05-30T08:38:01.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:38:01.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:38:01.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:38:01.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:38:01.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:38:01.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:38:01.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:38:01.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:38:01.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:38:01.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:38:01.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:38:01.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:38:01.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:38:01.727 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:38:01.924 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:38:02.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:38:02.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:38:02.355 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:38:02.355 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:38:02.523 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:38:02.523 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:38:32.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:38:32.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:38:32.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:38:32.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:38:33.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:38:33.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:38:33.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-05-30T08:38:33.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:38:33.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-05-30T08:38:33.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:38:33.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:38:33.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:38:33.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-05-30T08:38:35.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-05-30T08:38:35.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:38:35.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:38:35.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:38:35.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:38:35.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:38:35.792 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:38:35.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:38:35.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:38:35.793 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:38:35.793 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:38:35.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:38:35.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:38:35.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:38:36.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:38:36.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:38:36.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:38:36.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:38:36.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:38:36.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:38:36.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:38:36.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:38:36.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:38:36.181 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:38:23
2026-05-30T08:38:36.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74236, datetime.datetime(2026, 5, 30, 8, 38, 23), datetime.datetime(2026, 5, 30, 8, 38, 22), 'salt', 13.3, 41.77, None, 13.83, 352.39, 12.71, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:38:36.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:38:36.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:38:36.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:38:22, diff=14.188955s, valid=True
2026-05-30T08:38:36.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:38:36.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:38:36.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:38:12, diff=24.192517s, valid=True
2026-05-30T08:38:36.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:38:36.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:38:36.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:38:22, diff=14.200848s, valid=True
2026-05-30T08:38:36.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:38:36.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:38:36.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:38:36.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:38:36.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:38:36.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:38:36.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:38:12, diff=24.204629s, valid=True
2026-05-30T08:38:36.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:38:36.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:38:36.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:38:36.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055758.205441s, valid=True
2026-05-30T08:38:36.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:38:36.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:38:36.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:38:36.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:38:36.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:38:36.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:38:36.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:38:36.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:38:36.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:38:36.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:38:36.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:38:36.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:38:36.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:38:36.528 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:38:36.726 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:38:37.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:38:37.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:38:37.155 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:38:37.155 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:38:38.649 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:38:38.649 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:39:08.658 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:39:08.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:39:08.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:39:09.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:39:09.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:39:09.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:39:09.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-05-30T08:39:09.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:39:09.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-05-30T08:39:09.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:39:09.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:39:09.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:39: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-05-30T08:39:12.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-05-30T08:39:12.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:39:12.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:39:12.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:39:12.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:39:12.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:39:12.070 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:39:12.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:39:12.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:39:12.072 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:39:12.072 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:39:12.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:39:12.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:39:12.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:39:12.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:39:12.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:39:12.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:39:12.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:39:12.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:39:12.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:39:12.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:39:12.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:39:12.409 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:39:12.480 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:38:53
2026-05-30T08:39:12.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74237, datetime.datetime(2026, 5, 30, 8, 38, 53), datetime.datetime(2026, 5, 30, 8, 38, 52), 'salt', 13.3, 42.16, None, 9.99, 7.49, 12.58, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:39:12.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:39:12.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:39:12.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:38:52, diff=20.487723s, valid=True
2026-05-30T08:39:12.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:39:12.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:39:12.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:39:12, diff=0.491247s, valid=True
2026-05-30T08:39:12.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:39:12.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:39:12.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:38:52, diff=20.499501s, valid=True
2026-05-30T08:39:12.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:39:12.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:39:12.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:39:12.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:39:12.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:39:12.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:39:12.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:39:12, diff=0.503331s, valid=True
2026-05-30T08:39:12.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:39:12.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:39:12.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:39:12.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055794.504165s, valid=True
2026-05-30T08:39:12.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:39:12.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:39:12.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:39:12.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:39:12.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:39:12.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:39:12.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:39:12.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:39:12.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:39:12.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:39:12.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:39:12.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:39:12.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:39:12.826 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:39:13.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:39:13.352 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:39:13.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:39:13.450 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:39:13.450 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:39:13.630 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:39:13.631 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:39:43.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:39:43.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:39:43.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:39:43.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:39:43.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:39:44.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:39:44.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T08:39:44.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:39:44.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-05-30T08:39:44.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:39:44.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:39:44.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:39:44.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-05-30T08:39:46.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T08:39:46.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:39:46.693 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:39:46.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:39:46.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:39:46.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:39:46.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:39:46.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:39:46.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:39:46.717 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:39:46.717 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:39:46.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:39:46.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:39:46.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:39:46.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:39:46.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:39:46.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:39:46.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:39:47.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:39:47.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:39:47.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:39:47.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:39:47.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:39:47.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:39:23
2026-05-30T08:39:47.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74238, datetime.datetime(2026, 5, 30, 8, 39, 23), datetime.datetime(2026, 5, 30, 8, 39, 22), 'salt', 13.23, 42.43, None, 9.04, 8.69, 12.48, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:39:47.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:39:47.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:39:47.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:39:22, diff=25.10968s, valid=True
2026-05-30T08:39:47.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:39:47.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:39:47.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:39:12, diff=35.11316s, valid=True
2026-05-30T08:39:47.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:39:47.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:39:47.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:39:23, diff=24.121425s, valid=True
2026-05-30T08:39:47.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:39:47.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:39:47.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:39:47.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:39:47.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:39:47.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:39:47.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:39:12, diff=35.125135s, valid=True
2026-05-30T08:39:47.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:39:47.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:39:47.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:39:47.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055829.125947s, valid=True
2026-05-30T08:39:47.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:39:47.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:39:47.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:39:47.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:39:47.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:39:47.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:39:47.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:39:47.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:39:47.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:39:47.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:39:47.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:39:47.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:39:47.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:39:47.453 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:39:47.652 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:39:48.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:39:48.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:39:48.171 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:39:48.171 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:39:48.431 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:39:48.432 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:40:18.462 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:40:18.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:40:18.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:40:18.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:40:18.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:40:18.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:40:18.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-05-30T08:40:18.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:40:18.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-05-30T08:40:18.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:40:18.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:40:19.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:40: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-05-30T08:40:21.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-05-30T08:40:21.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:40:21.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:40:21.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:40:21.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:40:21.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:40:21.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:40:21.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:40:21.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:40:21.753 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:40:21.753 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:40:21.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:40:21.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:40:21.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:40:21.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:40:21.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:40:22.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:40:22.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:40:22.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:40:22.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:40:22.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:40:22.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:40:22.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:40:22.144 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:39:53
2026-05-30T08:40:22.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74239, datetime.datetime(2026, 5, 30, 8, 39, 53), datetime.datetime(2026, 5, 30, 8, 39, 53), 'salt', 13.3, 41.67, None, 9.53, 347.79, 12.74, 832.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:40:22.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:40:22.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:40:22.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:39:53, diff=29.151586s, valid=True
2026-05-30T08:40:22.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:40:22.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:40:22.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:40:12, diff=10.155153s, valid=True
2026-05-30T08:40:22.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:40:22.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:40:22.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:39:53, diff=29.163499s, valid=True
2026-05-30T08:40:22.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:40:22.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:40:22.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:40:22.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:40:22.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:40:22.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:40:22.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:40:12, diff=10.1673s, valid=True
2026-05-30T08:40:22.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:40:22.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:40:22.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:40:22.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055864.168126s, valid=True
2026-05-30T08:40:22.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:40:22.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:40:22.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:40:22.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:40:22.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:40:22.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:40:22.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:40:22.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:40:22.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:40:22.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:40:22.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:40:22.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:40:22.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:40:22.493 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:40:22.689 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:40:23.021 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:40:23.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:40:23.120 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:40:23.120 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:40:23.391 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:40:23.391 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:40:53.403 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:40:53.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:40:53.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:40:53.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:40:53.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:40:53.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:40:53.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-05-30T08:40:53.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:40:53.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-05-30T08:40:53.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:40:53.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:40:53.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:40:53.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-05-30T08:40:56.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-05-30T08:40:56.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:40:56.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:40:56.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:40:56.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:40:56.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:40:56.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:40:56.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:40:56.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:40:56.317 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:40:56.317 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:40:56.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:40:56.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:40:56.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:40:56.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:40:56.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:40:56.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:40:56.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:40:56.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:40:56.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:40:56.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:40:56.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:40:56.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:40:56.708 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:40:54
2026-05-30T08:40:56.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74241, datetime.datetime(2026, 5, 30, 8, 40, 54), datetime.datetime(2026, 5, 30, 8, 40, 53), 'salt', 13.2, 41.77, None, 8.19, 8.22, 12.7, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:40:56.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:40:56.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:40:56.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:40:53, diff=3.716213s, valid=True
2026-05-30T08:40:56.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:40:56.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:40:56.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:41:12, diff=-15.280208s, valid=True
2026-05-30T08:40:56.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:40:56.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:40:56.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:40:53, diff=3.728068s, valid=True
2026-05-30T08:40:56.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:40:56.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:40:56.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:40:56.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:40:56.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:40:56.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:40:56.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:41:12, diff=-15.268141s, valid=True
2026-05-30T08:40:56.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:40:56.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:40:56.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:40:56.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055898.732699s, valid=True
2026-05-30T08:40:56.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:40:56.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:40:56.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:40:56.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:40:56.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:40:56.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:40:56.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:40:56.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:40:56.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:40:56.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:40:56.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:40:56.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:40:57.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:40:57.057 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:40:57.323 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:40:57.654 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:40:57.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:40:57.751 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:40:57.751 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:40:57.933 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:40:57.933 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:41:27.963 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:41:27.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:41:27.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:41:28.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:41:28.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:41:28.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:41:28.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-05-30T08:41:28.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:41:28.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-05-30T08:41:28.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:41:28.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:41:28.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:41:28.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-05-30T08:41:31.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-05-30T08:41:31.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:41:31.280 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:41:31.280 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:41:31.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:41:31.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:41:31.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:41:31.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:41:31.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:41:31.305 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:41:31.305 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:41:31.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:41:31.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:41:31.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:41:31.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:41:31.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:41:31.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:41:31.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:41:31.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:41:31.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:41:31.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:41:31.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:41:31.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:41:31.693 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:41:24
2026-05-30T08:41:31.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74242, datetime.datetime(2026, 5, 30, 8, 41, 24), datetime.datetime(2026, 5, 30, 8, 41, 23), 'salt', 13.3, 41.9, None, 9.25, 324.74, 12.67, 832.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:41:31.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:41:31.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:41:31.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:41:23, diff=8.69978s, valid=True
2026-05-30T08:41:31.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:41:31.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:41:31.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:41:12, diff=19.702674s, valid=True
2026-05-30T08:41:31.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:41:31.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:41:31.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:41:23, diff=8.709434s, valid=True
2026-05-30T08:41:31.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:41:31.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:41:31.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:41:31.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:41:31.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:41:31.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:41:31.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:41:12, diff=19.712643s, valid=True
2026-05-30T08:41:31.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:41:31.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:41:31.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:41:31.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055933.713322s, valid=True
2026-05-30T08:41:31.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:41:31.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:41:31.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:41:31.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:41:31.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:41:31.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:41:31.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:41:31.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:41:31.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:41:31.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:41:31.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:41:31.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:41:31.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:41:32.036 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:41:32.234 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:41:32.716 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:41:32.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:41:32.820 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:41:32.820 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:41:33.004 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:41:33.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:42:03.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:42:03.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:42:03.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:42:03.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:42:03.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:42:03.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:42:03.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-05-30T08:42:03.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:42:03.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T08:42:03.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:42:03.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:42:03.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:42:03.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-05-30T08:42:05.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T08:42:05.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:42:05.810 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:42:05.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:42:05.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:42:05.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:42:05.836 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:42:05.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:42:05.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:42:05.837 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:42:05.837 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:42:05.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:42:05.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:42:05.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:42:06.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:42:06.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:42:06.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:42:06.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:42:06.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:42:06.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:42:06.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:42:06.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:42:06.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:42:06.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:41:54
2026-05-30T08:42:06.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74243, datetime.datetime(2026, 5, 30, 8, 41, 54), datetime.datetime(2026, 5, 30, 8, 41, 54), 'salt', 13.26, 42.43, None, 6.46, 346.61, 12.48, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:42:06.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:42:06.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:42:06.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:41:54, diff=12.239774s, valid=True
2026-05-30T08:42:06.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:42:06.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:42:06.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:42:12, diff=-5.756703s, valid=True
2026-05-30T08:42:06.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:42:06.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:42:06.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:41:54, diff=12.251721s, valid=True
2026-05-30T08:42:06.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:42:06.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:42:06.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:42:06.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:42:06.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:42:06.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:42:06.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:42:12, diff=-5.744511s, valid=True
2026-05-30T08:42:06.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:42:06.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:42:06.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:42:06.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1055968.256321s, valid=True
2026-05-30T08:42:06.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:42:06.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:42:06.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:42:06.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:42:06.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:42:06.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:42:06.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:42:06.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:42:06.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:42:06.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:42:06.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:42:06.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:42:06.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:42:06.582 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:42:06.850 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:42:07.184 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:42:07.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:42:07.284 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:42:07.284 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:42:07.467 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:42:07.467 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:42:37.493 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:42:37.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:42:37.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:42:37.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:42:37.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:42:38.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:42:38.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-05-30T08:42:38.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:42:38.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-05-30T08:42:38.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:42:38.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:42:38.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:42:38.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T08:42:40.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-05-30T08:42:40.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:42:40.791 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:42:40.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:42:40.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:42:40.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:42:40.814 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:42:40.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:42:40.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:42:40.816 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:42:40.816 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:42:40.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:42:40.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:42:40.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:42:41.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:42:41.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:42:41.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:42:41.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:42:41.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:42:41.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:42:41.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:42:41.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:42:41.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:42:41.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:42:25
2026-05-30T08:42:41.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74244, datetime.datetime(2026, 5, 30, 8, 42, 25), datetime.datetime(2026, 5, 30, 8, 42, 24), 'salt', 13.36, 42.5, None, 6.14, 0.83, 12.47, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:42:41.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:42:41.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:42:41.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:42:24, diff=17.257238s, valid=True
2026-05-30T08:42:41.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:42:41.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:42:41.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:42:12, diff=29.26069s, valid=True
2026-05-30T08:42:41.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:42:41.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:42:41.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:42:24, diff=17.268581s, valid=True
2026-05-30T08:42:41.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:42:41.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:42:41.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:42:41.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:42:41.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:42:41.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:42:41.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:42:12, diff=29.272469s, valid=True
2026-05-30T08:42:41.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:42:41.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:42:41.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:42:41.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056003.273298s, valid=True
2026-05-30T08:42:41.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:42:41.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:42:41.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:42:41.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:42:41.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:42:41.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:42:41.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:42:41.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:42:41.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:42:41.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:42:41.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:42:41.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:42:41.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:42:41.598 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:42:41.796 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:42:42.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:42:42.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:42:42.225 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:42:42.225 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:42:42.786 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:42:42.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:43:12.795 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:43:12.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:43:12.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:43:13.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:43:13.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:43:13.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:43:13.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-05-30T08:43:13.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:43:13.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-05-30T08:43:13.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:43:13.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:43:13.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:43:13.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-05-30T08:43:15.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-05-30T08:43:15.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:43:15.631 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:43:15.632 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:43:15.643 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:43:15.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:43:15.665 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:43:15.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:43:15.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:43:15.666 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:43:15.666 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:43:15.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:43:15.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:43:15.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:43:15.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:43:15.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:43:15.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:43:15.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:43:15.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:43:15.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:43:16.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:43:16.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:43:16.000 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:43:16.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:42:55
2026-05-30T08:43:16.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74245, datetime.datetime(2026, 5, 30, 8, 42, 55), datetime.datetime(2026, 5, 30, 8, 42, 54), 'salt', 13.4, 42.83, None, 10.2, 354.05, 12.37, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:43:16.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:43:16.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:43:16.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:42:54, diff=22.067193s, valid=True
2026-05-30T08:43:16.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:43:16.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:43:16.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:43:12, diff=4.070097s, valid=True
2026-05-30T08:43:16.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:43:16.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:43:16.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:42:54, diff=22.076763s, valid=True
2026-05-30T08:43:16.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:43:16.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:43:16.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:43:16.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:43:16.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:43:16.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:43:16.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:43:12, diff=4.079854s, valid=True
2026-05-30T08:43:16.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:43:16.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:43:16.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:43:16.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056038.080525s, valid=True
2026-05-30T08:43:16.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:43:16.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:43:16.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:43:16.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:43:16.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:43:16.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:43:16.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:43:16.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:43:16.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:43:16.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:43:16.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:43:16.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:43:16.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:43:16.474 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:43:16.672 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:43:17.006 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:43:17.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:43:17.105 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:43:17.105 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:43:17.287 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:43:17.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:43:47.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:43:47.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:43:47.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:43:47.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:43:47.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:43:47.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:43:47.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-05-30T08:43:47.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:43:47.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-05-30T08:43:47.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:43:47.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:43:47.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:43:47.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-05-30T08:43:50.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-05-30T08:43:50.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:43:50.525 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:43:50.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:43:50.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:43:50.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:43:50.547 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:43:50.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:43:50.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:43:50.548 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:43:50.548 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:43:50.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:43:50.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:43:50.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:43:50.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:43:50.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:43:50.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:43:50.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:43:50.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:43:50.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:43:50.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:43:50.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:43:50.867 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:43:50.930 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:43:25
2026-05-30T08:43:50.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74246, datetime.datetime(2026, 5, 30, 8, 43, 25), datetime.datetime(2026, 5, 30, 8, 43, 24), 'salt', 13.36, 42.56, None, 10.91, 4.89, 12.45, 832.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:43:50.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:43:50.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:43:50.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:43:24, diff=26.93795s, valid=True
2026-05-30T08:43:50.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:43:50.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:43:50.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:43:12, diff=38.941385s, valid=True
2026-05-30T08:43:50.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:43:50.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:43:50.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:43:25, diff=25.949506s, valid=True
2026-05-30T08:43:50.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:43:50.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:43:50.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:43:50.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:43:50.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:43:50.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:43:50.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:43:12, diff=38.953242s, valid=True
2026-05-30T08:43:50.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:43:50.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:43:50.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:43:50.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056072.954052s, valid=True
2026-05-30T08:43:50.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:43:50.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:43:50.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:43:50.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:43:50.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:43:51.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:43:51.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:43:51.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:43:51.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:43:51.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:43:51.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:43:51.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:43:51.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:43:51.279 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:43:51.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:43:51.814 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:43:51.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:43:51.913 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:43:51.913 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:43:52.161 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:43:52.161 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:44:22.191 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:44:22.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:44:22.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:44:22.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:44:22.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:44:22.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:44:22.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T08:44:22.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:44:22.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-05-30T08:44:22.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:44:22.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:44:22.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:44:22.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-05-30T08:44:25.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-05-30T08:44:25.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:44:25.107 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:44:25.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:44:25.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:44:25.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:44:25.139 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:44:25.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:44:25.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:44:25.140 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:44:25.140 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:44:25.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:44:25.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:44:25.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:44:25.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:44:25.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:44:25.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:44:25.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:44:25.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T08:44:25.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:44:25.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:44:25.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:44:25.465 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:44:25.527 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:43:55
2026-05-30T08:44:25.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74247, datetime.datetime(2026, 5, 30, 8, 43, 55), datetime.datetime(2026, 5, 30, 8, 43, 55), 'salt', 13.43, 42.96, None, 7.94, 0.92, 12.33, 832.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:44:25.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:44:25.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:44:25.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:43:55, diff=30.535683s, valid=True
2026-05-30T08:44:25.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:44:25.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:44:25.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:44:12, diff=13.539248s, valid=True
2026-05-30T08:44:25.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:44:25.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:44:25.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:43:55, diff=30.547452s, valid=True
2026-05-30T08:44:25.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:44:25.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:44:25.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:44:25.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:44:25.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:44:25.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T08:44:25.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:44:12, diff=13.551166s, valid=True
2026-05-30T08:44:25.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:44:25.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:44:25.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:44:25.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056107.551977s, valid=True
2026-05-30T08:44:25.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:44:25.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:44:25.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:44:25.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:44:25.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:44:25.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:44:25.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:44:25.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:44:25.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:44:25.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:44:25.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:44:25.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:44:25.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:44:25.945 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:44:26.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:44:26.474 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:44:26.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:44:26.573 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:44:26.573 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:44:26.757 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:44:26.758 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:44:56.761 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:44:56.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:44:56.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:44:57.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:44:57.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:44:57.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:44:57.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-05-30T08:44:57.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:44:57.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-05-30T08:44:57.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:44:57.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:44:57.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:44:57.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-05-30T08:44:59.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-05-30T08:44:59.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:44:59.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:44:59.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:44:59.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:44:59.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:44:59.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:44:59.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:44:59.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:44:59.960 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:44:59.960 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:44:59.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:45:00.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:45:00.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:45:00.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:45:00.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:45:00.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:45:00.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:45:00.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:45:00.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:45:00.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:45:00.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:45:00.238 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:45:00.299 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:44:56
2026-05-30T08:45:00.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74249, datetime.datetime(2026, 5, 30, 8, 44, 56), datetime.datetime(2026, 5, 30, 8, 44, 55), 'salt', 13.4, 43.69, None, 7.94, 2.42, 12.1, 832.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:45:00.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:45:00.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:45:00.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:44:55, diff=5.306258s, valid=True
2026-05-30T08:45:00.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:45:00.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:45:00.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:45:12, diff=-11.690639s, valid=True
2026-05-30T08:45:00.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:45:00.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:45:00.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:44:56, diff=4.316737s, valid=True
2026-05-30T08:45:00.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:45:00.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:45:00.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:45:00.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:45:00.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:45:00.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:45:00.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:45:12, diff=-11.679942s, valid=True
2026-05-30T08:45:00.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:45:00.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:45:00.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:45:00.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056142.320787s, valid=True
2026-05-30T08:45:00.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:45:00.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:45:00.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:45:00.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:45:00.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:45:00.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:45:00.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:45:00.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:45:00.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:45:00.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:45:00.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:45:00.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:45:00.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:45:00.640 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:45:00.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:45:01.173 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:45:01.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:45:01.274 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:45:01.274 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:45:01.543 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:45:01.544 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:45:31.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:45:31.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:45:31.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:45:31.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:45:31.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:45:32.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:45:32.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-05-30T08:45:32.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:45:32.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-05-30T08:45:32.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:45:32.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:45:32.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:45:32.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-05-30T08:45:34.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-05-30T08:45:34.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:45:34.435 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:45:34.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:45:34.444 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:45:34.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:45:34.457 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:45:34.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:45:34.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:45:34.458 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:45:34.459 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:45:34.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:45:34.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:45:34.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:45:34.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:45:34.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:45:34.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:45:34.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:45:34.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:45:34.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:45:34.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:45:34.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:45:34.833 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:45:34.896 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:45:26
2026-05-30T08:45:34.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74250, datetime.datetime(2026, 5, 30, 8, 45, 26), datetime.datetime(2026, 5, 30, 8, 45, 25), 'salt', 13.46, 44.05, None, 10.09, 355.24, 11.98, 832.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:45:34.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:45:34.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:45:34.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:45:25, diff=9.902753s, valid=True
2026-05-30T08:45:34.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:45:34.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:45:34.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:45:12, diff=22.905571s, valid=True
2026-05-30T08:45:34.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:45:34.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:45:34.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:45:26, diff=8.912192s, valid=True
2026-05-30T08:45:34.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:45:34.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:45:34.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:45:34.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:45:34.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:45:34.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:45:34.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:45:12, diff=22.915186s, valid=True
2026-05-30T08:45:34.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:45:34.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:45:34.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:45:34.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056176.915848s, valid=True
2026-05-30T08:45:34.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:45:34.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:45:34.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:45:34.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:45:34.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:45:34.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:45:34.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:45:34.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:45:34.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:45:35.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:45:35.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:45:35.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:45:35.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:45:35.233 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:45:35.434 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:45:35.766 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:45:35.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:45:35.866 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:45:35.866 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:45:36.048 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:45:36.048 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:46:06.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:46:06.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:46:06.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:46:06.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:46:07.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:46:07.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:46:07.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T08:46:07.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:46:07.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-05-30T08:46:08.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:46:08.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:46:08.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:46:08.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-05-30T08:46: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-05-30T08:46:11.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:46:11.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:46:11.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:46:11.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:46:11.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:46:11.607 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:46:11.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:46:11.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:46:11.608 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:46:11.608 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:46:11.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:46:11.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:46:11.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:46:11.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:46:11.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:46:11.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T08:46:11.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:46:11.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T08:46:11.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:46:11.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:46:11.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:46:11.925 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:46:11.991 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:45:57
2026-05-30T08:46:11.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74251, datetime.datetime(2026, 5, 30, 8, 45, 57), datetime.datetime(2026, 5, 30, 8, 45, 56), 'salt', 13.53, 44.15, None, 9.49, 348.76, 11.96, 832.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:46:11.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:46:11.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:46:11.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:45:56, diff=15.9975s, valid=True
2026-05-30T08:46:11.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:46:11.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T08:46:12.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:46:12, diff=0.000425s, valid=True
2026-05-30T08:46:12.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:46:12.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:46:12.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:45:56, diff=16.007736s, valid=True
2026-05-30T08:46:12.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:46:12.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:46:12.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:46:12.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:46:12.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:46:12.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T08:46:12.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:46:12, diff=0.011366s, valid=True
2026-05-30T08:46:12.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:46:12.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:46:12.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:46:12.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056214.01216s, valid=True
2026-05-30T08:46:12.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:46:12.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:46:12.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:46:12.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:46:12.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:46:12.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:46:12.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:46:12.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:46:12.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:46:12.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:46:12.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:46:12.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:46:12.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:46:12.339 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:46:12.542 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:46:12.878 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:46:12.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:46:12.978 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:46:12.978 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:46:13.153 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:46:13.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:46:43.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:46:43.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:46:43.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:46:43.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:46:43.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:46:43.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:46:43.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-05-30T08:46:43.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:46:43.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-05-30T08:46:43.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:46:43.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:46:43.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:46:43.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-05-30T08:46:46.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-05-30T08:46:46.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:46:46.352 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:46:46.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:46:46.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:46:46.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:46:46.375 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:46:46.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:46:46.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:46:46.376 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:46:46.376 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:46:46.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:46:46.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:46:46.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:46:46.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:46:46.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:46:46.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T08:46:46.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:46:46.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T08:46:46.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:46:46.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:46:46.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:46:46.647 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:46:46.709 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:46:27
2026-05-30T08:46:46.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74252, datetime.datetime(2026, 5, 30, 8, 46, 27), datetime.datetime(2026, 5, 30, 8, 46, 26), 'salt', 13.4, 44.12, None, 12.0, 329.91, 11.96, 832.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:46:46.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:46:46.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:46:46.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:46:26, diff=20.716606s, valid=True
2026-05-30T08:46:46.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:46:46.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T08:46:46.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:46:12, diff=34.719804s, valid=True
2026-05-30T08:46:46.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:46:46.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:46:46.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:46:25, diff=21.727228s, valid=True
2026-05-30T08:46:46.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:46:46.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:46:46.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:46:46.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:46:46.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:46:46.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T08:46:46.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:46:12, diff=34.730638s, valid=True
2026-05-30T08:46:46.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:46:46.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:46:46.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:46:46.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056248.731365s, valid=True
2026-05-30T08:46:46.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:46:46.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:46:46.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:46:46.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:46:46.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:46:46.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:46:46.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:46:46.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:46:46.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:46:46.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:46:46.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:46:46.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:46:47.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:46:47.051 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:46:47.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:46:47.581 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:46:47.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:46:47.681 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:46:47.681 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:46:47.866 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:46:47.866 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:47:17.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:47:17.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:47:17.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:47:18.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:47:18.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:47:18.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:47:18.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-05-30T08:47:18.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:47:18.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-05-30T08:47:18.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:47:18.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:47:18.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:47: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-05-30T08:47:21.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-05-30T08:47:21.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:47:21.161 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:47:21.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:47:21.171 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:47:21.183 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:47:21.183 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:47:21.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:47:21.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:47:21.184 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:47:21.184 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:47:21.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:47:21.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:47:21.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:47:21.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:47:21.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:47:21.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-30T08:47:21.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:47:21.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-30T08:47:21.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:47:21.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:47:21.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:47:21.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:47:21.514 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:46:57
2026-05-30T08:47:21.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74253, datetime.datetime(2026, 5, 30, 8, 46, 57), datetime.datetime(2026, 5, 30, 8, 46, 56), 'salt', 13.43, 43.89, None, 9.25, 347.16, 12.03, 832.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:47:21.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:47:21.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:47:21.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:46:56, diff=25.521246s, valid=True
2026-05-30T08:47:21.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:47:21.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-30T08:47:21.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:47:12, diff=9.524404s, valid=True
2026-05-30T08:47:21.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:47:21.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:47:21.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:46:56, diff=25.531907s, valid=True
2026-05-30T08:47:21.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:47:21.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:47:21.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:47:21.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:47:21.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:47:21.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-30T08:47:21.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:47:12, diff=9.535294s, valid=True
2026-05-30T08:47:21.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:47:21.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:47:21.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:47:21.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056283.536037s, valid=True
2026-05-30T08:47:21.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:47:21.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:47:21.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:47:21.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:47:21.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:47:21.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:47:21.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:47:21.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:47:21.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:47:21.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:47:21.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:47:21.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:47:21.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:47:21.856 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:47:22.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:47:22.441 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:47:22.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:47:22.539 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:47:22.539 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:47:22.771 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:47:22.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:47:52.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:47:52.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:47:52.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:47:53.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:47:53.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:47:53.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:47:53.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T08:47:53.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:47:53.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-05-30T08:47:53.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:47:53.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:47:53.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:47:53.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-05-30T08:47:55.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-05-30T08:47:55.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:47:55.933 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:47:55.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:47:55.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:47:55.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:47:55.956 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:47:55.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:47:55.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:47:55.957 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:47:55.957 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:47:55.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:47:56.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:47:56.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:47:56.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:47:56.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:47:56.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-30T08:47:56.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:47:56.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-30T08:47:56.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:47:56.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:47:56.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:47:56.297 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:47:56.362 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:47:27
2026-05-30T08:47:56.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74254, datetime.datetime(2026, 5, 30, 8, 47, 27), datetime.datetime(2026, 5, 30, 8, 47, 26), 'salt', 13.43, 43.92, None, 9.28, 348.1, 12.02, 832.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:47:56.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:47:56.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:47:56.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:47:26, diff=30.369944s, valid=True
2026-05-30T08:47:56.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:47:56.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-30T08:47:56.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:47:12, diff=44.373506s, valid=True
2026-05-30T08:47:56.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:47:56.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:47:56.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:47:17, diff=39.381826s, valid=True
2026-05-30T08:47:56.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:47:56.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:47:56.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:47:56.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:47:56.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:47:56.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-30T08:47:56.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:47:12, diff=44.385592s, valid=True
2026-05-30T08:47:56.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:47:56.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:47:56.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:47:56.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056318.386416s, valid=True
2026-05-30T08:47:56.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:47:56.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:47:56.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:47:56.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:47:56.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:47:56.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:47:56.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:47:56.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:47:56.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:47:56.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:47:56.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:47:56.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:47:56.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:47:56.711 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:47:56.928 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:47:57.264 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:47:57.363 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:47:57.363 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:47:57.363 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:47:57.548 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:47:57.548 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:48:27.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:48:27.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:48:27.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:48:27.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:48:27.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:48:28.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:48:28.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-05-30T08:48:28.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:48:28.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-05-30T08:48:28.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:48:28.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:48:28.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:48:28.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-05-30T08:48:30.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-05-30T08:48:30.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:48:30.811 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:48:30.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:48:30.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:48:30.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:48:30.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:48:30.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:48:30.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:48:30.838 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:48:30.838 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:48:30.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:48:30.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:48:30.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:48:31.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:48:31.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:48:31.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-30T08:48:31.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:48:31.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-30T08:48:31.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:48:31.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:48:31.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:48:31.157 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:48:31.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:48:28
2026-05-30T08:48:31.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74256, datetime.datetime(2026, 5, 30, 8, 48, 28), datetime.datetime(2026, 5, 30, 8, 48, 27), 'salt', 13.46, 43.86, None, 8.19, 336.64, 12.04, 832.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:48:31.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:48:31.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:48:31.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:48:27, diff=4.226147s, valid=True
2026-05-30T08:48:31.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:48:31.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-30T08:48:31.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:48:12, diff=19.229743s, valid=True
2026-05-30T08:48:31.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:48:31.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:48:31.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:48:20, diff=11.23806s, valid=True
2026-05-30T08:48:31.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:48:31.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:48:31.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:48:31.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:48:31.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:48:31.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-30T08:48:31.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:48:12, diff=19.24189s, valid=True
2026-05-30T08:48:31.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:48:31.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:48:31.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:48:31.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056353.242723s, valid=True
2026-05-30T08:48:31.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:48:31.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:48:31.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:48:31.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:48:31.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:48:31.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:48:31.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:48:31.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:48:31.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:48:31.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:48:31.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:48:31.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:48:31.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:48:31.574 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:48:31.853 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:48:32.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:48:32.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:48:32.289 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:48:32.289 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:48:32.713 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:48:32.713 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:49:02.742 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:49:02.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:49:02.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:49:03.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:49:03.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:49:03.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:49:03.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-05-30T08:49:03.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:49:03.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-05-30T08:49:03.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:49:03.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:49:03.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:49: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-05-30T08:49:05.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-05-30T08:49:05.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:49:05.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:49:05.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:49:05.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:49:05.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:49:05.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:49:05.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:49:05.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:49:05.933 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:49:05.933 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:49:05.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:49:06.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:49:06.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:49:06.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:49:06.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:49:06.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:49:06.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:49:06.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:49:06.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:49:06.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:49:06.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:49:06.254 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:49:06.320 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:48:58
2026-05-30T08:49:06.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74257, datetime.datetime(2026, 5, 30, 8, 48, 58), datetime.datetime(2026, 5, 30, 8, 48, 57), 'salt', 13.49, 44.22, None, 9.0, 8.43, 11.93, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:49:06.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:49:06.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:49:06.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:48:57, diff=9.328424s, valid=True
2026-05-30T08:49:06.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:49:06.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:49:06.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:49:12, diff=-5.668138s, valid=True
2026-05-30T08:49:06.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:49:06.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:49:06.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:48:51, diff=15.339705s, valid=True
2026-05-30T08:49:06.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:49:06.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:49:06.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:49:06.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:49:06.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:49:06.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:49:06.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:49:12, diff=-5.656611s, valid=True
2026-05-30T08:49:06.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:49:06.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:49:06.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:49:06.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056388.344202s, valid=True
2026-05-30T08:49:06.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:49:06.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:49:06.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:49:06.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:49:06.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:49:06.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:49:06.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:49:06.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:49:06.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:49:06.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:49:06.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:49:06.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:49:06.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:49:06.669 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:49:06.870 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:49:07.203 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:49:07.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:49:07.303 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:49:07.303 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:49:07.577 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:49:07.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:49:37.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:49:37.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:49:37.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:49:37.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:49:37.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:49:38.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:49:38.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-05-30T08:49:38.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:49:38.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-05-30T08:49:38.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:49:38.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:49:38.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:49:38.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-05-30T08:49:40.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T08:49:40.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:49:40.623 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:49:40.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:49:40.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:49:40.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:49:40.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:49:40.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:49:40.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:49:40.648 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:49:40.649 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:49:40.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:49:40.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:49:40.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:49:40.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:49:40.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:49:40.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:49:40.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:49:40.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:49:40.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:49:40.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:49:40.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:49:40.968 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:49:41.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:49:28
2026-05-30T08:49:41.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74258, datetime.datetime(2026, 5, 30, 8, 49, 28), datetime.datetime(2026, 5, 30, 8, 49, 27), 'salt', 13.53, 44.19, None, 9.88, 335.19, 11.95, 832.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:49:41.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:49:41.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:49:41.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:49:27, diff=14.040312s, valid=True
2026-05-30T08:49:41.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:49:41.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:49:41.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:49:12, diff=29.043763s, valid=True
2026-05-30T08:49:41.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:49:41.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:49:41.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:49:23, diff=18.051899s, valid=True
2026-05-30T08:49:41.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:49:41.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:49:41.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:49:41.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:49:41.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:49:41.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:49:41.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:49:12, diff=29.055598s, valid=True
2026-05-30T08:49:41.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:49:41.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:49:41.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:49:41.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056423.056403s, valid=True
2026-05-30T08:49:41.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:49:41.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:49:41.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:49:41.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:49:41.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:49:41.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:49:41.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:49:41.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:49:41.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:49:41.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:49:41.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:49:41.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:49:41.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:49:41.452 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:49:41.653 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:49:41.990 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:49:42.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:49:42.090 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:49:42.090 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:49:42.268 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:49:42.268 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:50:12.286 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:50:12.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:50:12.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:50:12.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:50:12.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:50:12.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:50:12.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-05-30T08:50:12.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:50:12.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-05-30T08:50:12.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:50:12.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:50:12.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:50:12.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-05-30T08:50: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-05-30T08:50:15.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:50:15.523 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:50:15.523 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:50:15.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:50:15.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:50:15.547 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:50:15.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:50:15.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:50:15.548 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:50:15.548 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:50:15.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:50:15.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:50:15.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:50:15.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:50:15.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:50:15.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:50:15.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:50:15.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:50:15.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:50:15.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:50:15.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:50:15.881 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:50:15.944 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:49:59
2026-05-30T08:50:15.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74259, datetime.datetime(2026, 5, 30, 8, 49, 59), datetime.datetime(2026, 5, 30, 8, 49, 58), 'salt', 13.59, 43.62, None, 9.18, 8.39, 12.13, 832.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:50:15.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:50:15.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:50:15.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:49:58, diff=17.951632s, valid=True
2026-05-30T08:50:15.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:50:15.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:50:15.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:50:12, diff=3.955208s, valid=True
2026-05-30T08:50:15.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:50:15.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:50:15.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:49:54, diff=21.963528s, valid=True
2026-05-30T08:50:15.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:50:15.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:50:15.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:50:15.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:50:15.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:50:15.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:50:15.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:50:12, diff=3.967355s, valid=True
2026-05-30T08:50:15.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:50:15.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:50:15.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:50:15.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056457.968207s, valid=True
2026-05-30T08:50:15.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:50:15.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:50:15.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:50:15.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:50:15.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:50:16.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:50:16.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:50:16.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:50:16.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:50:16.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:50:16.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:50:16.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:50:16.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:50:16.294 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:50:16.505 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:50:16.848 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:50:16.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:50:16.949 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:50:16.949 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:50:17.123 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:50:17.123 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:50:47.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:50:47.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:50:47.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:50:47.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:50:47.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:50:47.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:50:47.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-05-30T08:50:47.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:50:47.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-05-30T08:50:47.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:50:47.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:50:47.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:50:47.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-05-30T08:50:50.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-05-30T08:50:50.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:50:50.134 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:50:50.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:50:50.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:50:50.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:50:50.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:50:50.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:50:50.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:50:50.167 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:50:50.167 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:50:50.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:50:50.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:50:50.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:50:50.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:50:50.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:50:50.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-30T08:50:50.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:50:50.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-30T08:50:50.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:50:50.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:50:50.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:50:50.480 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:50:50.542 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:50:29
2026-05-30T08:50:50.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74260, datetime.datetime(2026, 5, 30, 8, 50, 29), datetime.datetime(2026, 5, 30, 8, 50, 28), 'salt', 13.59, 43.49, None, 7.52, 346.76, 12.17, 832.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:50:50.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:50:50.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:50:50.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:50:28, diff=22.549729s, valid=True
2026-05-30T08:50:50.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:50:50.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-30T08:50:50.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:50:12, diff=38.553323s, valid=True
2026-05-30T08:50:50.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:50:50.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:50:50.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:50:26, diff=24.561796s, valid=True
2026-05-30T08:50:50.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:50:50.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:50:50.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:50:50.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:50:50.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:50:50.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-30T08:50:50.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:50:12, diff=38.565648s, valid=True
2026-05-30T08:50:50.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:50:50.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:50:50.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:50:50.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056492.566477s, valid=True
2026-05-30T08:50:50.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:50:50.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:50:50.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:50:50.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:50:50.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:50:50.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:50:50.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:50:50.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:50:50.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:50:50.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:50:50.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:50:50.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:50:50.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:50:50.965 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:50:51.176 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:50:51.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:50:51.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:50:51.625 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:50:51.625 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:50:52.016 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:50:52.016 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:51:22.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:51:22.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:51:22.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:51:22.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:51:22.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:51:22.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:51:22.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-05-30T08:51:22.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:51:22.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-05-30T08:51:22.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:51:22.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:51:22.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:51:22.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-05-30T08:51:25.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-05-30T08:51:25.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:51:25.032 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:51:25.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:51:25.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:51:25.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:51:25.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:51:25.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:51:25.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:51:25.055 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:51:25.055 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:51:25.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:51:25.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:51:25.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:51:25.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:51:25.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:51:25.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:51:25.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:51:25.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:51:25.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:51:25.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:51:25.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:51:25.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:51:25.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:50:59
2026-05-30T08:51:25.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74261, datetime.datetime(2026, 5, 30, 8, 50, 59), datetime.datetime(2026, 5, 30, 8, 50, 59), 'salt', 13.59, 43.72, None, 10.13, 7.02, 12.1, 832.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:51:25.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:51:25.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:51:25.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:50:59, diff=26.399441s, valid=True
2026-05-30T08:51:25.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:51:25.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:51:25.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:51:12, diff=13.402763s, valid=True
2026-05-30T08:51:25.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:51:25.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:51:25.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:50:57, diff=28.410585s, valid=True
2026-05-30T08:51:25.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:51:25.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:51:25.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:51:25.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:51:25.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:51:25.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:51:25.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:51:12, diff=13.41415s, valid=True
2026-05-30T08:51:25.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:51:25.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:51:25.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:51:25.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056527.414925s, valid=True
2026-05-30T08:51:25.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:51:25.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:51:25.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:51:25.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:51:25.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:51:25.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:51:25.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:51:25.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:51:25.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:51:25.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:51:25.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:51:25.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:51:25.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:51:25.736 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:51:25.943 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:51:26.281 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:51:26.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:51:26.383 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:51:26.383 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:51:26.622 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:51:26.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:51:56.626 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:51:56.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:51:56.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:51:56.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:51:56.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:51:57.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:51:57.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-05-30T08:51:57.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:51:57.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-05-30T08:51:57.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:51:57.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:51:57.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:51:57.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-05-30T08:51:59.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-05-30T08:51:59.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:51:59.682 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:51:59.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:51:59.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:51:59.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:51:59.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:51:59.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:51:59.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:51:59.707 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:51:59.707 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:51:59.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:51:59.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:51:59.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:51:59.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:51:59.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:51:59.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:51:59.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:52:00.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:52:00.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:52:00.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:52:00.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:52:00.031 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:52:00.090 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:52:00
2026-05-30T08:52:00.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74263, datetime.datetime(2026, 5, 30, 8, 52), datetime.datetime(2026, 5, 30, 8, 51, 59), 'salt', 13.56, 43.89, None, 11.12, 333.0, 12.05, 832.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:52:00.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:52:00.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:52:00.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:51:59, diff=1.096882s, valid=True
2026-05-30T08:52:00.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:52:00.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:52:00.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:52:12, diff=-11.900201s, valid=True
2026-05-30T08:52:00.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:52:00.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:52:00.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:51:50, diff=10.10688s, valid=True
2026-05-30T08:52:00.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:52:00.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:52:00.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:52:00.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:52:00.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:52:00.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:52:00.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:52:12, diff=-11.887941s, valid=True
2026-05-30T08:52:00.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:52:00.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:52:00.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:52:00.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056562.112848s, valid=True
2026-05-30T08:52:00.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:52:00.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:52:00.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:52:00.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:52:00.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:52:00.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:52:00.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:52:00.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:52:00.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:52:00.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:52:00.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:52:00.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:52:00.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:52:00.434 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:52:00.644 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:52:00.987 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:52:01.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:52:01.089 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:52:01.089 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:52:01.335 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:52:01.335 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:52:31.353 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:52:31.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:52:31.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:52:31.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:52:31.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:52:32.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:52:32.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T08:52:32.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:52:32.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-30T08:52:32.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:52:32.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:52:32.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:52:32.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-05-30T08:52:34.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-05-30T08:52:34.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:52:34.469 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:52:34.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:52:34.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:52:34.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:52:34.494 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:52:34.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:52:34.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:52:34.495 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:52:34.496 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:52:34.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:52:34.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:52:34.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:52:34.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:52:34.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:52:34.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:52:34.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:52:34.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:52:34.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:52:34.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:52:34.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:52:34.833 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:52:34.903 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:52:30
2026-05-30T08:52:34.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74264, datetime.datetime(2026, 5, 30, 8, 52, 30), datetime.datetime(2026, 5, 30, 8, 52, 29), 'salt', 13.59, 44.15, None, 12.28, 328.61, 11.96, 832.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:52:34.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:52:34.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:52:34.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:52:29, diff=5.911023s, valid=True
2026-05-30T08:52:34.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:52:34.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:52:34.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:52:12, diff=22.91461s, valid=True
2026-05-30T08:52:34.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:52:34.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:52:34.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:52:21, diff=13.92305s, valid=True
2026-05-30T08:52:34.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:52:34.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:52:34.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:52:34.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:52:34.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:52:34.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:52:34.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:52:12, diff=22.926837s, valid=True
2026-05-30T08:52:34.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:52:34.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:52:34.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:52:34.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056596.927678s, valid=True
2026-05-30T08:52:34.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:52:34.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:52:34.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:52:34.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:52:34.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:52:34.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:52:34.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:52:34.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:52:35.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:52:35.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:52:35.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:52:35.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:52:35.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:52:35.252 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:52:35.461 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:52:35.803 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:52:35.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:52:35.904 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:52:35.904 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:52:36.076 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:52:36.077 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:53:06.079 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:53:06.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:53:06.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:53:06.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:53:06.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:53:06.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:53:06.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-05-30T08:53:06.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:53:06.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-05-30T08:53:06.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:53:06.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:53:06.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:53:06.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-05-30T08:53:09.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-05-30T08:53:09.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:53:09.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:53:09.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:53:09.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:53:09.269 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:53:09.269 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:53:09.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:53:09.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:53:09.270 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:53:09.270 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:53:09.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:53:09.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:53:09.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:53:09.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:53:09.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:53:09.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:53:09.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:53:09.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:53:09.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:53:09.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:53:09.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:53:09.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:53:09.658 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:53:00
2026-05-30T08:53:09.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74265, datetime.datetime(2026, 5, 30, 8, 53), datetime.datetime(2026, 5, 30, 8, 52, 59), 'salt', 13.66, 43.79, None, 10.69, 334.55, 12.09, 832.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:53:09.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:53:09.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:53:09.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:52:59, diff=10.666295s, valid=True
2026-05-30T08:53:09.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:53:09.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:53:09.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:53:12, diff=-2.330133s, valid=True
2026-05-30T08:53:09.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:53:09.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:53:09.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:52:52, diff=17.678074s, valid=True
2026-05-30T08:53:09.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:53:09.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:53:09.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:53:09.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:53:09.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:53:09.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:53:09.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:53:12, diff=-2.318132s, valid=True
2026-05-30T08:53:09.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:53:09.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:53:09.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:53:09.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056631.6827s, valid=True
2026-05-30T08:53:09.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:53:09.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:53:09.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:53:09.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:53:09.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:53:09.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:53:09.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:53:09.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:53:09.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:53:09.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:53:09.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:53:09.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:53:09.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:53:10.016 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:53:10.237 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:53:10.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:53:10.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:53:10.680 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:53:10.681 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:53:10.861 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:53:10.861 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:53:40.891 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:53:40.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:53:40.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:53:41.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:53:41.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:53:41.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:53:41.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-05-30T08:53:41.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:53:41.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-05-30T08:53:41.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:53:41.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:53:41.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:53:41.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-05-30T08:53:43.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-05-30T08:53:43.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:53:43.870 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:53:43.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:53:43.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:53:43.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:53:43.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:53:43.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:53:43.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:53:43.935 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:53:43.935 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:53:43.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:53:44.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:53:44.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:53:44.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:53:44.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:53:44.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:53:44.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:53:44.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:53:44.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:53:44.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:53:44.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:53:44.265 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:53:44.329 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:53:30
2026-05-30T08:53:44.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74266, datetime.datetime(2026, 5, 30, 8, 53, 30), datetime.datetime(2026, 5, 30, 8, 53, 29), 'salt', 13.49, 43.82, None, 9.81, 342.9, 12.06, 832.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:53:44.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:53:44.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:53:44.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:53:29, diff=15.336601s, valid=True
2026-05-30T08:53:44.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:53:44.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:53:44.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:53:12, diff=32.340177s, valid=True
2026-05-30T08:53:44.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:53:44.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:53:44.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:53:24, diff=20.348504s, valid=True
2026-05-30T08:53:44.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:53:44.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:53:44.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:53:44.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:53:44.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:53:44.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:53:44.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:53:12, diff=32.352318s, valid=True
2026-05-30T08:53:44.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:53:44.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:53:44.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:53:44.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056666.353159s, valid=True
2026-05-30T08:53:44.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:53:44.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:53:44.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:53:44.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:53:44.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:53:44.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:53:44.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:53:44.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:53:44.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:53:44.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:53:44.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:53:44.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:53:44.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:53:44.674 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:53:44.900 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:53:45.299 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:53:45.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:53:45.399 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:53:45.399 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:53:45.576 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:53:45.577 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:54:15.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:54:15.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:54:15.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:54:15.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:54:15.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:54:16.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:54:16.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-05-30T08:54:16.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:54:16.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-05-30T08:54:16.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:54:16.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:54:16.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:54:16.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T08:54:18.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T08:54:18.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:54:18.519 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:54:18.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:54:18.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:54:18.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:54:18.547 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:54:18.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:54:18.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:54:18.548 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:54:18.548 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:54:18.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:54:18.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:54:18.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:54:18.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:54:18.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:54:18.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:54:18.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:54:18.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:54:18.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:54:18.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:54:18.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:54:18.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:54:18.943 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:54:01
2026-05-30T08:54:18.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74267, datetime.datetime(2026, 5, 30, 8, 54, 1), datetime.datetime(2026, 5, 30, 8, 54), 'salt', 13.56, 44.19, None, 7.55, 339.85, 11.95, 832.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:54:18.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:54:18.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:54:18.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:54:00, diff=18.950954s, valid=True
2026-05-30T08:54:18.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:54:18.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:54:18.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:54:12, diff=6.954343s, valid=True
2026-05-30T08:54:18.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:54:18.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:54:18.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:53:55, diff=23.962196s, valid=True
2026-05-30T08:54:18.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:54:18.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:54:18.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:54:18.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:54:18.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:54:18.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:54:18.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:54:12, diff=6.96587s, valid=True
2026-05-30T08:54:18.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:54:18.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:54:18.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:54:18.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056700.966689s, valid=True
2026-05-30T08:54:18.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:54:18.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:54:18.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:54:18.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:54:18.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:54:19.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:54:19.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:54:19.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:54:19.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:54:19.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:54:19.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:54:19.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:54:19.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:54:19.290 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:54:19.499 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:54:19.845 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:54:19.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:54:19.972 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:54:19.972 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:54:20.142 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:54:20.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:54:50.172 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:54:50.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:54:50.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:54:50.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:54:50.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:54:50.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:54:50.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-05-30T08:54:50.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:54:50.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-05-30T08:54:50.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:54:50.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:54:50.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:54:50.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-05-30T08:54:53.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-05-30T08:54:53.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:54:53.133 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:54:53.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:54:53.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:54:53.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:54:53.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:54:53.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:54:53.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:54:53.159 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:54:53.159 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:54:53.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:54:53.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:54:53.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:54:53.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:54:53.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:54:53.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-30T08:54:53.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:54:53.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-30T08:54:53.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:54:53.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:54:53.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:54:53.538 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:54:53.650 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:54:31
2026-05-30T08:54:53.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74268, datetime.datetime(2026, 5, 30, 8, 54, 31), datetime.datetime(2026, 5, 30, 8, 54, 30), 'salt', 13.49, 44.19, None, 10.48, 343.16, 11.94, 832.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:54:53.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:54:53.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:54:53.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:54:30, diff=23.658431s, valid=True
2026-05-30T08:54:53.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:54:53.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-30T08:54:53.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:54:12, diff=41.662152s, valid=True
2026-05-30T08:54:53.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:54:53.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:54:53.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:54:27, diff=26.670831s, valid=True
2026-05-30T08:54:53.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:54:53.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:54:53.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:54:53.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:54:53.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:54:53.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-30T08:54:53.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:54:12, diff=41.674782s, valid=True
2026-05-30T08:54:53.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:54:53.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:54:53.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:54:53.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056735.675645s, valid=True
2026-05-30T08:54:53.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:54:53.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:54:53.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:54:53.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:54:53.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:54:53.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:54:53.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:54:53.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:54:53.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:54:53.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:54:53.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:54:53.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:54:53.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:54:54.073 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:54:54.281 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:54:54.620 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:54:54.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:54:54.721 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:54:54.721 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:54:54.976 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:54:54.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:55:25.007 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:55:25.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:55:25.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:55:25.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:55:25.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:55:25.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:55:25.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-05-30T08:55:25.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:55:25.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-05-30T08:55:25.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:55:25.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:55:25.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:55:25.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-05-30T08:55:27.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-05-30T08:55:27.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:55:27.984 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:55:27.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:55:27.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:55:28.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:55:28.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:55:28.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:55:28.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:55:28.010 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:55:28.010 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:55:28.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:55:28.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:55:28.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:55:28.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:55:28.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:55:28.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:55:28.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:55:28.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-30T08:55:28.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:55:28.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:55:28.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:55:28.336 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:55:28.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:55:01
2026-05-30T08:55:28.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74269, datetime.datetime(2026, 5, 30, 8, 55, 1), datetime.datetime(2026, 5, 30, 8, 55), 'salt', 13.59, 44.05, None, 9.67, 326.31, 11.99, 832.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:55:28.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:55:28.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:55:28.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:00, diff=28.407045s, valid=True
2026-05-30T08:55:28.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:55:28.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:55:28.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=16.410608s, valid=True
2026-05-30T08:55:28.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:55:28.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:55:28.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:54:58, diff=30.419101s, valid=True
2026-05-30T08:55:28.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:55:28.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:55:28.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:55:28.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:55:28.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:55:28.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-30T08:55:28.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=16.422929s, valid=True
2026-05-30T08:55:28.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:55:28.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:55:28.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:55:28.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056770.423769s, valid=True
2026-05-30T08:55:28.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:55:28.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:55:28.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:55:28.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:55:28.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:55:28.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:55:28.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:55:28.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:55:28.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:55:28.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:55:28.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:55:28.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:55:28.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:55:28.749 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:55:28.959 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:55:29.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:55:29.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:55:29.405 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:55:29.405 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:55:29.669 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:55:29.669 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:55:59.700 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:55:59.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:55:59.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:56:00.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:56:00.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:56:00.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:56:00.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-05-30T08:56:00.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:56:00.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-05-30T08:56:00.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:56:00.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:56:00.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:56:00.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-05-30T08:56:02.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-05-30T08:56:02.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:56:02.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:56:02.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:56:02.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:56:02.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:56:02.790 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:56:02.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:56:02.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:56:02.791 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:56:02.791 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:56:02.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:56:02.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:56:02.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:56:03.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:56:03.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:56:03.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-30T08:56:03.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:56:03.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-30T08:56:03.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:56:03.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:56:03.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:56:03.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:56:03.173 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:56:02
2026-05-30T08:56:03.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74271, datetime.datetime(2026, 5, 30, 8, 56, 2), datetime.datetime(2026, 5, 30, 8, 56, 1), 'salt', 13.59, 43.82, None, 9.28, 355.18, 12.07, 832.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:56:03.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:56:03.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:56:03.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:56:01, diff=2.18126s, valid=True
2026-05-30T08:56:03.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:56:03.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-30T08:56:03.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=51.1848s, valid=True
2026-05-30T08:56:03.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:56:03.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:56:03.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:56:01, diff=2.193075s, valid=True
2026-05-30T08:56:03.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:56:03.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:56:03.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:56:03.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:56:03.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:56:03.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-30T08:56:03.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=51.196921s, valid=True
2026-05-30T08:56:03.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:56:03.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:56:03.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:56:03.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056805.197773s, valid=True
2026-05-30T08:56:03.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:56:03.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:56:03.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:56:03.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:56:03.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:56:03.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:56:03.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:56:03.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:56:03.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:56:03.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:56:03.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:56:03.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:56:03.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:56:03.590 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:56:03.797 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:56:04.138 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:56:04.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:56:04.242 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:56:04.242 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:56:04.416 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:56:04.416 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:56:34.418 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:56:34.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:56:34.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:56:34.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:56:34.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:56:35.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:56:35.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-05-30T08:56:35.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:56:35.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-05-30T08:56:35.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:56:35.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:56:35.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:56:35.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-05-30T08:56:37.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-05-30T08:56:37.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:56:37.882 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:56:37.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:56:37.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:56:37.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:56:37.906 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:56:37.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:56:37.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:56:37.907 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:56:37.907 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:56:37.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:56:38.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:56:38.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:56:38.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:56:38.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:56:38.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-30T08:56:38.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:56:38.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-30T08:56:38.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:56:38.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:56:38.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:56:38.254 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:56:38.316 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:56:32
2026-05-30T08:56:38.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74272, datetime.datetime(2026, 5, 30, 8, 56, 32), datetime.datetime(2026, 5, 30, 8, 56, 31), 'salt', 13.52, 43.52, None, 7.8, 353.28, 12.15, 832.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:56:38.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:56:38.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:56:38.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:56:31, diff=7.323765s, valid=True
2026-05-30T08:56:38.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:56:38.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-30T08:56:38.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=86.327393s, valid=True
2026-05-30T08:56:38.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:56:38.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:56:38.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:56:22, diff=16.335836s, valid=True
2026-05-30T08:56:38.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:56:38.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:56:38.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:56:38.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:56:38.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:56:38.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-30T08:56:38.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=86.339641s, valid=True
2026-05-30T08:56:38.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:56:38.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:56:38.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:56:38.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056840.340447s, valid=True
2026-05-30T08:56:38.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:56:38.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:56:38.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:56:38.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:56:38.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:56:38.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:56:38.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:56:38.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:56:38.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:56:38.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:56:38.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:56:38.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:56:38.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:56:38.664 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:56:38.873 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:56:39.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:56:39.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:56:39.317 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:56:39.317 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:56:39.495 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:56:39.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:57:09.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:57:09.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:57:09.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:57:09.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:57:09.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:57:09.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:57:09.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-05-30T08:57:09.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:57:09.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-05-30T08:57:09.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:57:09.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:57:09.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:57:09.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-05-30T08:57:12.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-30T08:57:12.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:57:12.247 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:57:12.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:57:12.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:57:12.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:57:12.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:57:12.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:57:12.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:57:12.272 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:57:12.272 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:57:12.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:57:12.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T08:57:12.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:57:12.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T08:57:12.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:57:12.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-30T08:57:12.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:57:12.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-30T08:57:12.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:57:12.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:57:12.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:57:12.598 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:57:12.660 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:57:02
2026-05-30T08:57:12.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74273, datetime.datetime(2026, 5, 30, 8, 57, 2), datetime.datetime(2026, 5, 30, 8, 57, 2), 'salt', 13.52, 43.52, None, 7.8, 353.28, 12.15, 832.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:57:12.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:57:12.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T08:57:12.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:57:02, diff=10.667579s, valid=True
2026-05-30T08:57:12.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:57:12.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-30T08:57:12.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=120.671081s, valid=True
2026-05-30T08:57:12.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:57:12.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T08:57:12.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:56:54, diff=18.678998s, valid=True
2026-05-30T08:57:12.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:57:12.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:57:12.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:57:12.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:57:12.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:57:12.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-30T08:57:12.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=120.682427s, valid=True
2026-05-30T08:57:12.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:57:12.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:57:12.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:57:12.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056874.68317s, valid=True
2026-05-30T08:57:12.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:57:12.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:57:12.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:57:12.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:57:12.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:57:12.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:57:12.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:57:12.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:57:12.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:57:12.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:57:12.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:57:12.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:57:13.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:57:13.069 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:57:13.279 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:57:13.623 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:57:13.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:57:13.724 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:57:13.725 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:57:13.888 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:57:13.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:57:43.918 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:57:43.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:57:43.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:57:44.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:57:44.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:57:44.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:57:44.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-05-30T08:57:44.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:57:44.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-05-30T08:57:44.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:57:44.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:57:44.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:57:44.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-05-30T08:57:47.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-05-30T08:57:47.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:57:47.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:57:47.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:57:47.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:57:47.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:57:47.280 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:57:47.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:57:47.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:57:47.281 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:57:47.281 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:57:47.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:57:47.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:57:47.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:57:47.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:57:47.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:57:47.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T08:57:47.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:57:47.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T08:57:47.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:57:47.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:57:47.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:57:47.605 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:57:47.666 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:57:32
2026-05-30T08:57:47.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74274, datetime.datetime(2026, 5, 30, 8, 57, 32), datetime.datetime(2026, 5, 30, 8, 57, 31), 'salt', 13.69, 44.85, None, 12.74, 336.21, 11.75, 832.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:57:47.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:57:47.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:57:47.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:57:31, diff=16.67409s, valid=True
2026-05-30T08:57:47.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:57:47.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T08:57:47.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=155.677533s, valid=True
2026-05-30T08:57:47.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:57:47.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:57:47.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:57:25, diff=22.685676s, valid=True
2026-05-30T08:57:47.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:57:47.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:57:47.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:57:47.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:57:47.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:57:47.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T08:57:47.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=155.689352s, valid=True
2026-05-30T08:57:47.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:57:47.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:57:47.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:57:47.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056909.690165s, valid=True
2026-05-30T08:57:47.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:57:47.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:57:47.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:57:47.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:57:47.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:57:47.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:57:47.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:57:47.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:57:47.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:57:47.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:57:47.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:57:47.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:57:47.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:57:48.015 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:57:48.230 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:57:48.573 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:57:48.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:57:48.674 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:57:48.674 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:57:48.839 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:57:48.839 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:58:18.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:58:18.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:58:18.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:58:19.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:58:19.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:58:19.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:58:19.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-30T08:58:19.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:58:19.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-05-30T08:58:19.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:58:19.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:58:19.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:58:19.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-05-30T08:58:22.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-05-30T08:58:22.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:58:22.462 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:58:22.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:58:22.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:58:22.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:58:22.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:58:22.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:58:22.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:58:22.488 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:58:22.488 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:58:22.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:58:22.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:58:22.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:58:22.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:58:22.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:58:22.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T08:58:22.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:58:22.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-30T08:58:22.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:58:22.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:58:22.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:58:22.810 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:58:22.872 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:58:03
2026-05-30T08:58:22.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74275, datetime.datetime(2026, 5, 30, 8, 58, 3), datetime.datetime(2026, 5, 30, 8, 58, 2), 'salt', 13.59, 44.72, None, 12.0, 355.34, 11.79, 832.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:58:22.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:58:22.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:58:22.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:58:02, diff=20.879839s, valid=True
2026-05-30T08:58:22.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:58:22.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T08:58:22.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=190.88329s, valid=True
2026-05-30T08:58:22.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:58:22.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:58:22.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:57:56, diff=26.891335s, valid=True
2026-05-30T08:58:22.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:58:22.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:58:22.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:58:22.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:58:22.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:58:22.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-30T08:58:22.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=190.895034s, valid=True
2026-05-30T08:58:22.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:58:22.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:58:22.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:58:22.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056944.895836s, valid=True
2026-05-30T08:58:22.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:58:22.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:58:22.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:58:22.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:58:22.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:58:22.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:58:22.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:58:22.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:58:22.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:58:23.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:58:23.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:58:23.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:58:23.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:58:23.225 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:58:23.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:58:23.782 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:58:23.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:58:23.883 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:58:23.883 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:58:24.131 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:58:24.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:58:54.141 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:58:54.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:58:54.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:58:54.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:58:54.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:58:54.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:58:54.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-05-30T08:58:54.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:58:54.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-05-30T08:58:54.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:58:54.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:58:54.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:58:54.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-05-30T08:58:57.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-05-30T08:58:57.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:58:57.322 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:58:57.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:58:57.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:58:57.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:58:57.347 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:58:57.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:58:57.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:58:57.348 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:58:57.348 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:58:57.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:58:57.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:58:57.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:58:57.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:58:57.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:58:57.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:58:57.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:58:57.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:58:57.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:58:57.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:58:57.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:58:57.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:58:57.733 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:58:33
2026-05-30T08:58:57.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74276, datetime.datetime(2026, 5, 30, 8, 58, 33), datetime.datetime(2026, 5, 30, 8, 58, 31), 'salt', 13.59, 45.21, None, 10.45, 355.36, 11.63, 832.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:58:57.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:58:57.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:58:57.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:58:31, diff=26.740786s, valid=True
2026-05-30T08:58:57.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:58:57.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:58:57.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=225.744325s, valid=True
2026-05-30T08:58:57.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:58:57.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:58:57.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:58:28, diff=29.75265s, valid=True
2026-05-30T08:58:57.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:58:57.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:58:57.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:58:57.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:58:57.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:58:57.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:58:57.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=225.756453s, valid=True
2026-05-30T08:58:57.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:58:57.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:58:57.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:58:57.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1056979.757287s, valid=True
2026-05-30T08:58:57.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:58:57.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:58:57.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:58:57.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:58:57.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:58:57.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:58:57.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:58:57.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:58:57.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:58:57.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:58:57.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:58:57.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:58:58.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:58:58.082 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:58:58.290 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:58:58.629 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:58:58.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:58: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-05-30T08:58:58.786 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:58:58.950 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:58:58.951 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T08:59:28.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T08:59:28.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T08:59:28.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T08:59:29.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T08:59:29.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T08:59:29.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T08:59:29.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-05-30T08:59:29.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T08:59:29.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-05-30T08:59:29.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T08:59:29.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T08:59:29.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T08:59:29.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-05-30T08:59:31.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-05-30T08:59:31.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T08:59:31.905 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T08:59:31.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T08:59:31.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T08:59:31.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T08:59:31.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T08:59:31.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T08:59:31.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T08:59:31.926 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T08:59:31.926 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T08:59:31.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T08:59:32.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-30T08:59:32.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T08:59:32.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-30T08:59:32.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:59:32.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:59:32.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T08:59:32.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-30T08:59:32.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T08:59:32.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T08:59:32.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T08:59:32.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T08:59:32.250 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 08:59:03
2026-05-30T08:59:32.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74277, datetime.datetime(2026, 5, 30, 8, 59, 3), datetime.datetime(2026, 5, 30, 8, 59, 2), 'salt', 13.69, 44.98, None, 9.39, 355.36, 11.71, 832.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T08:59:32.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T08:59:32.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-30T08:59:32.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:59:02, diff=30.257694s, valid=True
2026-05-30T08:59:32.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T08:59:32.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:59:32.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=260.260857s, valid=True
2026-05-30T08:59:32.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T08:59:32.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-30T08:59:32.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:58:59, diff=33.268451s, valid=True
2026-05-30T08:59:32.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T08:59:32.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:59:32.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T08:59:32.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T08:59:32.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T08:59:32.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-30T08:59:32.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=260.271911s, valid=True
2026-05-30T08:59:32.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T08:59:32.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T08:59:32.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T08:59:32.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1057014.272676s, valid=True
2026-05-30T08:59:32.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T08:59:32.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T08:59:32.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T08:59:32.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T08:59:32.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T08:59:32.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T08:59:32.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T08:59:32.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T08:59:32.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T08:59:32.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T08:59:32.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T08:59:32.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T08:59:32.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T08:59:32.756 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T08:59:32.964 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:59:33.304 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T08:59:33.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T08:59:33.404 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-30T08:59:33.404 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-30T08:59:33.571 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T08:59:33.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-30T09:00:03.602 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-30T09:00:03.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-30T09:00:03.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-30T09:00:03.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-30T09:00:03.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-30T09:00:04.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-30T09:00:04.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-05-30T09:00:04.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-30T09:00:04.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-05-30T09:00:04.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-30T09:00:04.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-30T09:00:04.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-30T09:00:04.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-30T09:00:06.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-05-30T09:00:06.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-30T09:00:06.603 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-30
2026-05-30T09:00:06.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-30T09:00:06.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-30
2026-05-30T09:00:06.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-30', '07:29', '17:39', '16:46', '07:38', 100, '19:06', '06:02')
2026-05-30T09:00:06.624 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-30T09:00:06.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-30T09:00:06.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-30T09:00:06.624 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-30T09:00:06.624 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-30T09:00:06.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-30T09:00:06.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-30T09:00:06.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-30T09:00:06.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-30T09:00:06.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T09:00:06.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T09:00:06.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-30T09:00:06.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-30T09:00:06.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-30T09:00:06.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-30T09:00:06.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-30T09:00:06.904 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-30T09:00:06.965 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-30 09:00:04
2026-05-30T09:00:06.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(74279, datetime.datetime(2026, 5, 30, 9, 0, 4), datetime.datetime(2026, 5, 30, 9, 0, 3), 'salt', 13.76, 45.05, None, 12.85, 333.63, 11.7, 832.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-30T09:00:06.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-30T09:00:06.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-30T09:00:06.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 09:00:03, diff=3.97171s, valid=True
2026-05-30T09:00:06.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-30T09:00:06.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T09:00:06.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=294.974747s, valid=True
2026-05-30T09:00:06.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-30T09:00:06.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-30T09:00:06.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 09:00:02, diff=4.981855s, valid=True
2026-05-30T09:00:06.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-30T09:00:06.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T09:00:06.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-30T09:00:06.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-30T09:00:06.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-30T09:00:06.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-30T09:00:06.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-30 08:55:12, diff=294.985221s, valid=True
2026-05-30T09:00:06.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-30T09:00:06.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-30T09:00:06.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-30T09:00:06.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=1057048.985968s, valid=True
2026-05-30T09:00:06.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-30T09:00:06.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-30T09:00:06.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-30T09:00:06.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-30T09:00:06.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-30T09:00:07.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-30T09:00:07.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-30T09:00:07.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-30T09:00:07.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-30T09:00:07.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-30T09:00:07.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-30T09:00:07.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-30T09:00:07.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-30T09:00:07.701 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-30T09:00:07.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T09:00:08.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-30T09:00:08.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-30T09:00: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-05-30T09:00: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-05-30T09:00:09.341 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-30T09:00:09.341 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
